有没有人知道如何调试这个?
仅警告一次:检测到约束模糊地建议tableview单元格的内容视图的高度为零的情况.我们正在考虑无意中崩溃并使用标准高度.
行具有固定的高度,如下所示
- (CGFloat)tableView:(UITableView *)tableView 
           heightForRowAtIndexPath:(NSIndexPath *)indexPath{
   return 34.0;
}
Run Code Online (Sandbox Code Playgroud)
所有人constraints似乎都很开心......
我已经多次看过这个问题,但令人惊讶的是,我没有看到一致的答案,所以我会自己尝试一下:
如果你有一个包含你自己的自定义UITableViewCells的tableview,它包含UITextViews和UILabels,其高度必须在运行时确定,你应该如何确定heightForRowAtIndexPath中每一行的高度?
最明显的第一个想法是通过计算并然后对cellForRowAtIndexPath内单元格内每个视图的高度求和来计算每个单元格的高度,并存储该最终总高度以供以后检索.
但这不起作用,因为cellForRowAtIndexPath被称为AFTER heightForRowAtIndexPath.
我唯一能想到的是在viewDidLoad中进行所有计算,然后创建所有UITableViewCells,计算单元格高度并将其存储在UITableViewCell子类内的自定义字段中,并将每个单元格放在NSMutableDictionary中,其中indexPath为键,然后使用cellForRowAtIndexPath和heightForRowAtIndexPath中的indexPath从字典中检索单元格,返回自定义高度值或单元格对象本身.
这种方法似乎是错误的,因为它没有使用dequeueReusableCellWithIdentifier,而是我将所有单元格一次加载到我的控制器中的字典中,并且委托方法只是从字典中检索正确的单元格.
我没有看到任何其他方法来做到这一点.这是一个坏主意 - 如果是这样,这样做的正确方法是什么?
怎样才能获得UITableViewCell当内heightForRowAtIndexPath方法,即给予indexPath?
(然后我可以访问我创建的内容视图以增加其高度)
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
  // How to get the UITableViewCell associated with this indexPath?
}
Run Code Online (Sandbox Code Playgroud)
谢谢
编辑:事实上,真的有一个有效的方法来做到这一点?当我发表一些NSLog陈述时,它似乎heightForRowAtIndexPath在调用之前调用了几次cellForRowAtIndexPath(这是我UILabels在单元格中设置的位置)?这种意味着我可能会尝试使用一种不起作用的技术,即我希望heightForRowAtIndexPath能够访问每个单元格中已经创建的标签以获得它们的高度并将它们加在一起以获得整个单元格行高度,但是如果它们没有它们的话尚未设置(内cellForRowAtIndexPath)然后我想我的方法不能真正起作用?  
我以为我已经读到了UITableView那个heightForRowAtIndexPath不会被调用的所有行,但只对那些将是可见的.然而,这不是我所看到的.我正在看到数以百计的调用heightForRowAtIndexPath,例如iPhone的方向改变的简单情况.  
所以我在此假设,因此,对于UITableView与heightForRowAtIndexPath实施,它(即heightForRowAtIndexPath)被调用的所有行(不只是那些可见的)...让我知道这是不太正确的.
问题:鉴于上述情况,在性能问题发生之前,您可以拥有多少行UITableView(在哪里heightForRowAtIndexPath实现)?   
有没有解决性能问题的方法?即设置每行的标称/标准高度而不实现heightForRowAtIndexPath,但是只有在显示时才正确设置每一行高度并在此处正确设置...但是哪种方法可以做到这一点?  
我在使用estimatedHeightForRowAtIndexPath时发现了一个令人震惊的问题或反直觉行为
(1)我的桌子行高度差异很大.最终结果可以从111到约400.
(2)我绝对完美地计算每一行的高度.我手头有一个数组,也就是缓存.
{请注意,这正是苹果工程师现在推荐的......例如,第5点.在UITableView中使用自动布局进行动态单元格布局和可变行高度 }
(3)当heightForRowAtIndexPath要求高度时,我确实给它绝对正确的高度.
(4)当我构建单元格时,实际上,我将其构建到正确的高度(如(2)和(3)中所示).
{注意 - 当然iOS最终会调整单元格的高度,而不是"我".}
这一切都完美无缺.
也就是说,每个单元格都是由iOS构建的,其高度恰好是heightForRowAtIndexPath中给出的高度.
现在,我添加代码......
-(CGFloat)tableView:(UITableView *)tableView
    estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath {
    return 120;
}
Run Code Online (Sandbox Code Playgroud)
事实上,表没有更长的工作..................行高成为随机!
有没有人看到这种令人难以置信的行为?
我做了各种各样的测试,试图确定地狱估计的HeightForRowAtIndexPath的作用.起初,我认为它可能提供高度的下限.所以,150 ..甚至我的小细胞都会错误地达到150高度.但事实并非如此.
我认为它可能会做这样的事情:说你的estimatedHeightForRowAtIndexPath值是150.它有时使用150来表示(事实上()实际上是大小或更小的行,但有时它会从heightForRowAtIndexPath获得实际大小.
另一方面,如果你为estimatedHeightForRowAtIndexPath设置了一个小于实际存在的值(在我的例子中说是100),它几乎"完全不起作用"你只是得到了似乎只是随机高度的东西细胞.
非常高的细胞似乎正常工作,也许类似"如果从heightForRowAtIndexPath的高度是估计的两倍,那么它确实使用真正的高度"
要清楚,它似乎从来没有让细胞太小,但它往往使它们太大.
要清楚,我没有使用autolayout,它只是你必须构建的单元格类型.(我担心我不知道自动布局如何.)这只是Xcode5/iOS7 +.
摘要
鉴于我们并不总是知道单元格的框架或其内容视图将是什么(由于编辑,旋转,附件视图等),tableView:heightForRowAtIndexPath:当单元格包含一个单元格时,计算高度的最佳方法是什么?可变高度文本字段或标签?
我的一个UITableViewController's包含以下演示文稿:UITableViewCell与UITextView.
UITextView的宽度和高度应与UITableViewCell相同.

我创建了UITableViewCell子类,然后使用UITextView初始化它(UITextView是我的UITableViewController的私有字段)
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ 
     static NSString *CellIdentifier = @"TextViewCell";
     UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
     if (cell == nil) {
         cell = [[[BTExpandableTextViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier textView:_notesTextView] autorelease];
     }    
     return cell;
}
Run Code Online (Sandbox Code Playgroud)
我在UITableViewCell子类中实现了以下方法:
- (void)layoutSubviews{
    [super layoutSubviews];
    CGFloat height = [textView.text sizeWithFont:textView.font constrainedToSize:CGSizeMake(textView.frame.size.width, MAXFLOAT)].height + textView.font.lineHeight;
    textView.frame = CGRectMake(0, 0, self.contentView.frame.size.width, (height < textView.font.lineHeight * 4) ? textView.font.lineHeight * 4 : height);    
    [self.contentView addSubview:textView];
}
Run Code Online (Sandbox Code Playgroud)
当然我实现了以下UITableViewDataSource方法(看!我使用的是self.view.frame.size.width(但实际上我需要UITableViewCell contentView框架宽度):
- (CGFloat)tableView:(UITableView*)tableView …Run Code Online (Sandbox Code Playgroud) 设备旋转后,如何让我的细胞重绘?
当我在iPhone上测试时,默认方向是纵向,所以我的动态单元格与设备纵向时需要的高度相同:这意味着当我旋转到横向时,会有很多空白区域.细胞.当我在iPad上测试时,情况正好相反.旋转到纵向时,我的部分文字会被切断,因为默认为横向.我为这两个设备分别设置了故事板,两个视图控制器都设置为"Orientation:Inferred"
 (肖像)
 (景观)
这就是iPhone上发生的事情 - 拉伸标签有深红色背景,因此您可以看到标签的实际尺寸.但是,单元格高度不会重新计算,并且由于底部标签被约束到单元格的底部,因此它们本身一直位于底部.如果我从拉伸标签(具有背景的标签)添加约束到单元格的底部,它所做的只是拉伸标签,如下所示:
 (标签被拉伸)
这告诉我的是,现在我只是无法让单元格知道方向是什么,并且一旦它变得合适就重绘.这是我的heightForRowAtIndexPath代码计算单元格的高度:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (!self.opCell)
        {
            self.opCell = [self.container dequeueReusableCellWithIdentifier:@"OPCell"];
        }
    self.opCell.opName.text = [[self.data objectAtIndex:indexPath.row] valueForKey:@"name"];
    [self.opCell layoutIfNeeded];
    CGFloat height = [self.opCell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;
    return height + 1;
}
Run Code Online (Sandbox Code Playgroud)
到目前为止,得到它的旋转我都试过[self.container reloadData],其中容器是我TableView与willRotateToInterfaceOrientation和didRotateToInterfaceOrientation无济于事.我也尝试将它放在viewDidLoad中,以便在景观模式下以正确的高度加载视图时检测并加载,但这也不起作用.对于iPhone,无论我做什么,它都会加载纵向视图的高度,并且不会在旋转时更新.
我发现了一些我认为可能会有帮助的问题,但我似乎无法让这个答案适合我,即使它看起来像我有同样的问题,而且这个问题似乎更多地关注单元格宽度而不是高度和我不确定它是否适用于同样的方式.
这是一个教程,当我在iPhone上运行它时,也没有在旋转时调整TableViewCells的大小.
本教程似乎对更改表高度有一些了解,因此我将begin/endUpdates代码添加到我的中didRotateToInterfaceOrientation,认为这可能会导致更改,但这不起作用.
所以,如果有人有任何建议或知道解决方案,我将非常感激,因为我正在用这个打砖墙!
objective-c tableviewcell ios heightforrowatindexpath autolayout
我让用户重新排序行tableView.因为此事件影响内容 - 单元格中的某些数值应该更新 - 在所有其他行中,我调用reloadDatain moveRowAtIndexPath.然后发生奇怪的效果.
即触摸拖动器时,细胞似乎重叠,并且一些细胞开始上下移动.重要的是要知道,细胞高度是变化的.
奇怪的是,如果我reloadData从中删除moveRowAtIndexPath,那么所有这些现象都会消失.只有内容无效.
那么重新排序后如何重新加载数据呢?
更新:我做了什么同时重新配置单元格viewDidLayoutSubviews而不是呼叫reloadData结束moveRowAtIndexPath.它的工作效果比我预期的要高90%,但有时它们的行数仍然有些高.
override func tableView(tableView: UITableView, moveRowAtIndexPath sourceIndexPath: NSIndexPath, toIndexPath destinationIndexPath: NSIndexPath) {
    //..
    reorderOccured = true
}
override func viewDidLayoutSubviews() {
    if reorderOccured {
        for cell in tableView.visibleCells() as! [UITableViewCell] {
            let ip = tableView.indexPathForCell(cell)
            if ip != nil {
                self.configureCell(cell, indexPath: ip!)
            }
        }
        reorderOccured = false
    }
}
Run Code Online (Sandbox Code Playgroud) 我正在开发一个带有故事板的iOS 5项目,因此在IB中使用动态表格单元原型.在其中一个视图中,我有一个带有可变高度单元格的表视图,单元格高度根据内容的高度计算.
tableView:heightForRowAtIndexPath:首次显示表视图时,返回所有单元格的正确值.向下滚动几个项目时一切都很好,但随后出现问题:实际单元格似乎是正确的高度,包括它们的触摸区域,但它们的分隔符在错误的位置(在单元格内而不是它们之间)呈现.
从测量分隔符放置开始,似乎细胞重用可能与此有关.前三个单元格的分隔符正确呈现,但不是第四个.heightForRowAtIndexPath:为它返回正确的高度(在这种情况下为125像素),其包含的子视图都在正确的位置.但是,分隔符仅从前一个分隔符渲染108个像素,将其放置在单元格的125像素高区域内.
这是踢球者:108px是第一个表格单元格的高度,现在看不见了,可能会重复使用.我没有明确的证据,但似乎表视图忽略heightForRowAtIndexPath:了这些单元格,只是根据重用的单元格高度渲染分隔符.
这并不能解释为什么一堆较晚的较短单元格根本不会呈现分隔符.但这就是我必须继续下去的全部内容.
是否有解决方法,IB设置或其他可能有帮助的东西?
我正在构建一个具有可变高度自定义表格单元格的UITableView,它们的高度由包含的多行UILabel的大小决定.我已经将tableView:heightForRowAtIndexPath:委托方法连接起来并使用正确计算最终高度sizeWithFont:constrainedToSize:.
我遇到了一个奇怪的问题:在tableView:cellForRowAtIndexPath:调用数据源方法时,已经如上所述确定了正确的每行高度,但是单元格的框架与该高度不匹配.相反,frame.size.height单元格的属性是表格视图的默认单元格高度(86 px,因为我在Interface Builder中设置它,当包含的UILabel只有一行文本时正确的高度),而不是高度即tableView:heightForRowAtIndexPath:确定为该指数路径是正确的.
我正在cellForRowAtIndexPath:使用队列产生细胞,即
// Using storyboards, this never returns nil, no need to check for it
CustomCell *cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:@"SomeIdentifier"];
NSLog(@"%f", cell.frame.size.height); // 86, not correct if the cell contains a multi-line UILabel
Run Code Online (Sandbox Code Playgroud)
那么,无论iOS在幕后做什么,出列都不是设置单元格的frame属性来匹配计算出的高度.这本身就不那么令人惊讶,因为细胞实例而不是它们的几何体而引起了人们的关注.但是,单元格正确呈现,因此高度属性正在某处设置,但它会在之后发生cellForRowAtIndexPath:.
所以:当我最初填充表格视图时,cell.frame.size.height当我向下滚动列表时,第一次出现的所有单元格都是86.由于在cellForRowAtIndexPath:显示之前的每一行之后的某个时间设置了正确的几何体,所以当我向上滚动时,高度属性对于重新使用后返回视图的每个单元格都是正确的.
在此之后,我可以随意来回滚动表格视图,并且从该点开始,每个单元格的高度属性保持正确.
在任何基于出队的重用发生之前,第一次获得正确的单元高度的正确方法是什么?我需要这个来重新定位表格单元格的子视图.我是否需要手动调用heightForRowAtIndexPath:中cellForRowAtIndexPath:,然后手动设置新创建CustomCell实例的框架相匹配的高度?这似乎是多余的,我需要创建一种机制来检测第一次使用错误的帧高度创建单元格的时间,以及稍后使用正确的帧高度进行出列以避免此冗余.
所以,如果有人能够了解这背后的逻辑,我会很感激.
objective-c reusability uitableview ios heightforrowatindexpath
ios ×9
uitableview ×9
objective-c ×4
iphone ×3
autolayout ×1
ios7 ×1
ios8 ×1
reloaddata ×1
reorderlist ×1
reusability ×1