簡體   English   中英

在表格視圖中添加動態圖片

[英]Dynamic Pictures Adding in table View

我正在嘗試為我做一些棘手的事情(對布局約束來說是新事物)。

我的想法是我必須動態地將圖片添加到表格單元格中。單元格結構為:

  1. 圖像視圖
  2. 文字檢視
  3. 滾動視圖(水平滾動)在圖像部分和編號中包含圖像並不總是存在,也不總是恆定的(某些單元格包含圖像和文本,其他僅包含文本),這就是為什么我需要以編程方式添加約束的原因。

我已經搜索了很多並應用了很多東西,但是現在我遇到了異常,應用程序崩潰了。 希望你能幫助我。 這是我的代碼:

        var imgsScrollView = UIScrollView()
        cell.employmentEventTextView.text = employmentEventsList[indexPath.row].body
        if (imgsCountintheCell == 1){
            eventsListView.rowHeight = 220
        }else{
            eventsListView.rowHeight = 500
        }
        for var i = 0 ; i < imgsCountintheCell ; i++ {

            if(i == 0){

                var int : String = String(i)
                //getting the image from URL Block
                var imgName = "image" + int
                let url = NSURL(string: employmentEventsList[indexPath.row].imgs[i])
                let data = NSData(contentsOfURL: url!) //make sure your image in this url does exist, otherwise unwrap in a if let check
                let image = UIImage(data: data!)
                let imgView = UIImageView(image: image!)
                imgView.frame = CGRect(x: 0, y: 0, width: 200, height: 200)
                imgView.setTranslatesAutoresizingMaskIntoConstraints(false)

                var constX = NSLayoutConstraint(item: imgView, attribute: NSLayoutAttribute.CenterX, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.CenterX, multiplier: 1, constant: 0)
                var constTop = NSLayoutConstraint(item: imgView, attribute: NSLayoutAttribute.Top, relatedBy: NSLayoutRelation.Equal, toItem: cell.employmentEventTextView, attribute: NSLayoutAttribute.Bottom, multiplier: 1, constant: 2)

                var textPlaceBottom = NSLayoutConstraint(item: cell.employmentEventTextView, attribute: NSLayoutAttribute.Bottom, relatedBy: NSLayoutRelation.Equal, toItem: imgView, attribute: NSLayoutAttribute.Top, multiplier: 1, constant: 2)
                eventsListView.addSubview(imgView)
                imgView.addConstraint(constX)
                imgView.addConstraint(constTop)
                cell.employmentEventTextView.addConstraint(textPlaceBottom)

            }else{
                var int : String = String(i)
                //getting the image from URL Block
                var imgName = "image" + int
                let url = NSURL(string: employmentEventsList[indexPath.row].imgs[i])
                let data = NSData(contentsOfURL: url!) //make sure your image in this url does exist, otherwise unwrap in a if let check
                let image = UIImage(data: data!)
                let imgView = UIImageView(image: image!)
                imgView.frame = CGRect(x: 0, y: 0, width: 100, height: 100)
                imgView.setTranslatesAutoresizingMaskIntoConstraints(false)
                let constscrollViewToTheTop = NSLayoutConstraint(item: imgsScrollView, attribute: NSLayoutAttribute.Top, relatedBy: .Equal, toItem: cell.employmentEventTextView , attribute: NSLayoutAttribute.Bottom, multiplier: 1, constant: 5)

                imgsScrollView.addSubview(imgView)
                eventsListView.addSubview(imgsScrollView)
                imgsScrollView.addConstraint(constscrollViewToTheTop)

            }

我的異常代碼是:

Assertion failure in -[UIImageView nsli_lowerAttribute:intoExpression:withCoefficient:forConstraint:], /SourceCache/UIKit_Sim/UIKit-3318.93/NSLayoutConstraint_UIKitAdditions.m:3502
2015-05-27 01:49:58.097 طاقات علم[1713:38226] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Unexpected use of internal layout attribute'
*** First throw call stack:
(
0   CoreFoundation                      0x0000000100cc1a75 __exceptionPreprocess + 165
1   libobjc.A.dylib                     0x0000000102819bb7 objc_exception_throw + 45
2   CoreFoundation                      0x0000000100cc18da +[NSException raise:format:arguments:] + 106
3   Foundation                          0x000000010115cb6f -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 195
4   UIKit                               0x0000000101bdea77 -[UIView(AdditionalLayoutSupport) nsli_lowerAttribute:intoExpression:withCoefficient:forConstraint:] + 3483
5   Foundation                          0x00000001010e2b9e lower_1_attribute + 158
6   Foundation                          0x00000001010e26b4 -[NSLayoutConstraint _lowerIntoExpression:reportingConstantIsRounded:] + 102
7   Foundation                          0x00000001010d862e -[NSLayoutConstraint _addToEngine:integralizationAdjustment:mutuallyExclusiveConstraints:] + 96
8   UIKit                               0x0000000101bd0cf9 -[UIView(UIConstraintBasedLayout) _layoutEngine_didAddLayoutConstraint:roundingAdjustment:mutuallyExclusiveConstraints:] + 411
9   UIKit                               0x0000000101bd0f94 -[UIView(UIConstraintBasedLayout) _tryToAddConstraintWithoutUpdatingConstraintsArray:roundingAdjustment:mutuallyExclusiveConstraints:] + 30
10  UIKit                               0x0000000101bd10bc -[UIView(UIConstraintBasedLayout) _tryToAddConstraint:roundingAdjustment:mutuallyExclusiveConstraints:] + 243
11  طاقات علم                   0x0000000100910764 _TFCX15__ymcamGdqDduaj30EmploymentEventsViewController9tableViewfS0_FTCSo11UITableView21cellForRowAtIndexPathCSo11NSIndexPath_CSo15UITableViewCell + 7892
12  طاقات علم                   0x000000010091164f _TToFCX15__ymcamGdqDduaj30EmploymentEventsViewController9tableViewfS0_FTCSo11UITableView21cellForRowAtIndexPathCSo11NSIndexPath_CSo15UITableViewCell + 79
13  UIKit                               0x000000010164be03 -[UITableView _createPreparedCellForGlobalRow:withIndexPath:willDisplay:] + 508
14  UIKit                               0x000000010162b901 -[UITableView _updateVisibleCellsNow:isRecursive:] + 2846
15  UIKit                               0x000000010164178c -[UITableView layoutSubviews] + 213
16  UIKit                               0x00000001015ce1c3 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 521
17  QuartzCore                          0x00000001054d6c58 -[CALayer layoutSublayers] + 150
18  QuartzCore                          0x00000001054cb87e _ZN2CA5Layer16layout_if_neededEPNS_11TransactionE + 380
19  QuartzCore                          0x00000001054cb6ee _ZN2CA5Layer28layout_and_display_if_neededEPNS_11TransactionE + 24
20  QuartzCore                          0x000000010543936e _ZN2CA7Context18commit_transactionEPNS_11TransactionE + 242
21  QuartzCore                          0x000000010543a482 _ZN2CA11Transaction6commitEv + 390
22  QuartzCore                          0x000000010543aaed _ZN2CA11Transaction17observer_callbackEP19__CFRunLoopObservermPv + 89
23  CoreFoundation                      0x0000000100bf6507 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 23
24  CoreFoundation                      0x0000000100bf6460 __CFRunLoopDoObservers + 368
25  CoreFoundation                      0x0000000100bec293 __CFRunLoopRun + 1123
26  CoreFoundation                      0x0000000100bebbc6 CFRunLoopRunSpecific + 470
27  GraphicsServices                    0x0000000104dcaa58 GSEventRunModal + 161
28  UIKit                               0x0000000101554580 UIApplicationMain + 1282
29  طاقات علم                   0x000000010094c19e top_level_code + 78
30  طاقات علم                   0x000000010094c27a main + 42
31  libdyld.dylib                       0x0000000102ff5145 start + 1
32  ???                                 0x0000000000000001 0x0 + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException

提前尋求任何幫助


更新:我注意到一種解決問題的方法,並且看來可行,它的想法是我可以使用空白對象約束的概念自動被禁用(當圖像視圖為空時,文本視圖會自動向上移動)並且我覺得這對我來說還可以。便捷的解決方案。 現在,我有一個問題要問:是否可以使同一個表的hight行具有多個值? (例如,第一行和第二行具有row.hight = 60,因為它們沒有圖片,而第三行具有row.hight = 500,因為它具有圖片。)

是否可以在同一張表中給每個單元格一個單獨的hight值?

就個人而言,我發現為單元格創建一個nib文件更容易,如果某些視圖應該隱藏,則可以“折疊”約束。 例如,使用您的UIImageView,UITextView和UIScrollView以及所有約束來創建一個筆尖。 為視圖和視圖的高度/寬度約束添加IBOutlet。 然后,如果需要隱藏視圖,請將其高度/寬度約束常量設置為0。

請注意,由於您應該回收單元格,因此需要在-(void)prepareForReuse中重置約束常量

您可以通過實現UITableView委托方法為每個單元格設置不同的高度(在Swift中,語法會有所不同,但名稱相同)

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

對於每一行,您可以返回不同的高度。

對於復雜的高度,它可能會有些棘手,因為有時您必須構建單元格以計算其高度,然后必須在cellForRowAtIndexPath中再次構建它

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM