我已经使用iOS实现了iOS 8的自动动态tableview单元格高度
self.tableView.rowHeight = UITableViewAutomaticDimension;
Run Code Online (Sandbox Code Playgroud)
对于不支持自动动态单元格高度的iOS 8之前的版本,我重写了heightForRowAtIndexPath方法.
这与我的做法类似:在UITableView中使用自动布局进行动态单元布局和可变行高
问题是如何编写使用iOS 8自动单元格高度的代码,但是为早期iOS版本覆盖heightForRowAtIndexPath.仅当iOS版本小于8时,我才会喜欢我的自定义heightForRowAtIndexPath方法.有关如何执行此操作的任何建议吗?
我有一个UITableView,每个单元格都有一个图像和两个标签,正如你在第一张图片上看到的那样

所以我尝试使用自我调整细胞,一切都很好,除了两件事:
1)第一个和第二个单元格没有正确显示内容,但在我向下滚动然后返回它们之后一切正常.我试图在viewDidAppear中使用[tableview reloadData],但它没有帮助.首先观看不合适的标签.你可以在这个视频上观看它https://www.youtube.com/watch?v=I9DGBl1c5vg
查看第一个单元格上的标签.
2)这是一个艰难的.我正在滚动表格,一切都很好,但是当我选择行时问题就出现了.它正在推动我进行详细视图,但是当我按下"返回"并返回到主视图时,tableview跳转,所以我回到不选择的行,如果我滚动表格它不会滚动平滑,但是跳跃.以下是两个视频的链接,第一个显示滚动顺畅https://www.youtube.com/watch?v=9wAICcZwfO4如果我不去详细视图,第二个显示跳跃问题https:/ /www.youtube.com/watch?v=fRcQ3Za1wDM.
它绝对肯定与自我调整单元格有关,因为如果我不使用它,则不会发生这种问题.
我使用Autolayout和UITableViewAutomaticDimension创建了UITableView Cell Dynamic高度.
问题是我使用高度为6的UImageView作为分隔符.我设置了UImageView顶部空间边距(垂直间距及其上面的UIButton(按钮2))但在某些情况下我不需要使用UIButton(按钮2)
我如何能够消除我的UIButton(按钮2)以及如何建立UImageView顶部空间边距(垂直间距与上面的UILabel(国家)),因为我不能在某些我不需要UILabel(Desc)的情况下使用UILabel(Desc)
根据API,
(1)需要UILabel Desc而不需要UIButton(Button 2)
(2)不需要UILabel描述,需要UIButton(按钮2)
(3)需要UILabel Desc和UIButton(按钮2)需要(都需要)
(4)不需要UILabel描述,不需要UIButton(按钮2)(两者都不需要)
UIImageView(分隔符)出现在单元格详细信息的末尾
UILabel(姓名)我需要的必修课
UILabel(Desc)我必须要求
UIImageView(分隔符)我需要强制
意思是,我想制作UIImageView(分隔符)顶部空间边距(垂直间距以最佳方式使我可以在所有单元格中看到UILabel之间没有任何额外空间(Desc)
我已将我的项目上传到下面的链接
https://drive.google.com/file/d/0B5mabdphYDhzWG9UMzM2MTV6cms/view?usp=sharing 在此输入图片说明
我在我的应用程序中使用CustomCell实现了TableView,
我想UITableViewCell根据文字长度调整我的动态高度UITableViewCell,
这是快照 Customcell
:这是我的快照 UITableView
:代码段 heightForRowAtIndexPath
#define FONT_SIZE 14.0f
#define CELL_CONTENT_WIDTH 320.0f
#define CELL_CONTENT_MARGIN 10.0f
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;
{
NSString *text = [DescArr objectAtIndex:[indexPath row]];
CGSize constraint = CGSizeMake(CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN * 2), 20000.0f);
CGSize size = [text sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE] constrainedToSize:constraint lineBreakMode:UILineBreakModeWordWrap];
CGFloat height = MAX(size.height, 100.0);
return height;
}
Run Code Online (Sandbox Code Playgroud)
正如您在第二张图片中看到的那样,单元格的高度是固定的,它不会随着文本(内容)大小而变化.
我哪里弄错了?如何根据其内容/文本制作标签或单元格以更新其大小?
我在使用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 +.
(警告,我是一个iOS新手.)我创建了一个自定义的表视图单元,并在两个单独的表视图控制器上注册并实现了它.当我运行应用程序时,自定义xib内容将被父表单元格视图高度截断.
我希望每个表视图根据自定义表格视图单元格中的内容高度动态确定其高度.
我试过添加
myTableView.rowHeight = UITableViewAutomaticDimension
myTableView.estimatedRowHeight = 160.0
Run Code Online (Sandbox Code Playgroud)
到Table View Controller的一个viewDidLoad函数,但没有运气.
问题定义
我正在尝试构建一个与之类似的自定义控件UILabel.我应该能够将这样的控件放在自定义表格单元格中,它应该:
研究
我做的第一件事非常简单.我决定观察UILabel的工作原理.我做了以下事情:
numberOfLines=0)在其中)我检查了下面的事情
我观察到它表现良好.它不需要任何特殊代码,我看到系统执行的(某些)调用的顺序.
部分解决方案
@Wingzero在下面写了一个部分解决方案.它创建了正确大小的单元格.
但是,他的解决方案有两个问题:
它使用"self.superview.bounds.size.width".如果您的控件占据整个单元格,则可以使用此方法.但是,如果单元格中有其他任何使用约束的内容,则此类代码将无法正确计算宽度.
它根本不处理旋转.我很确定它不会处理其他调整大小事件(有一些不太常见的调整大小事件 - 比如状态栏在电话呼叫时越来越大等).
你知道如何解决这个问题吗?我找到了一些文章,讨论构建更多静态自定义控件以及在自定义单元格中使用预构建控件.
但是,我还没有发现任何可以解决这两个问题的解决方案.
我有UITableviewCell子类.在那个单元格中,我有2个标签(lblComment和lblDateTimeStampe)和一个显示评级星的视图.我希望lblComment的动态高度适合所有文本.它应根据评论的长度在高度上扩展和缩小.我之前已经实现了这个,但没有像下面的AutoLayout
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
NSString *label = self.userComment.commentText;
CGSize stringSize = [label sizeWithFont:[UIFont boldSystemFontOfSize:15]
constrainedToSize:CGSizeMake(320, 9999)
lineBreakMode:UILineBreakModeWordWrap];
return stringSize.height+10;
}
Run Code Online (Sandbox Code Playgroud)
现在我正在使用AutoLayout功能.
如何使用Autolayout实现这一目标?
任何形式的帮助表示赞赏.谢谢
我正在尝试使用iOS 8"从内部"调整表格视图单元格,因此无法实现
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;
Run Code Online (Sandbox Code Playgroud)
但使用:
self.tableView.rowHeight = UITableViewAutomaticDimension;
self.tableView.estimatedRowHeight = 200;
Run Code Online (Sandbox Code Playgroud)
细胞从上到下有限制.
该单元格包含(除其他外)一个UIWebview,它通过询问scrollview的高度,在加载后异步地知道它的大小:
CGFloat fittingHeight = self.messageTextWebView.scrollView.contentSize.height;
Run Code Online (Sandbox Code Playgroud)
(这是一种变体,其中webview包含在另一个视图中,并且该视图相应地调整大小).
因为当这发生时整个自动布局过程完成,我设置
[self setNeedsUpdateConstraints];
Run Code Online (Sandbox Code Playgroud)
在单元格中的视图中,它向着细胞起泡并再次下降layoutSubviews.
最后,我得到了可怕的Unable to simultaneously satisfy constraints..打破一切的约束是
"<NSLayoutConstraint:0x7f8c29d157f0 'UIView-Encapsulated-Layout-Height' V:[UITableViewCellContentView:0x7f8c2b063eb0(270)]>"
Run Code Online (Sandbox Code Playgroud)
当第一次计算单元格时,由表视图创建此约束.
它杀死了我自己:
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x7fa8a8515b70 V:[UIView:0x7fa8aa0263e0(263)]>
Run Code Online (Sandbox Code Playgroud)
虽然我将约束的优先级设置为1000,将压缩阻力设置为1000,但我无法覆盖表视图创建的约束.
令人沮丧的是:如果我用简单的多线标签替换网页视图并在第一个单元格布局中了解所有尺寸,那么一切都很完美.这是Web视图加载系统的异步特性,它迫使我在第一次呈现单元格后更改布局.
现在我的问题:
有没有办法解决?我真的不想重新加载单元格.如果单元格是屏幕上唯一的单元格,则不会重复使用,整个过程会重新开始.这甚至是可能的还是UITableView架构依赖于外部约束来正确渲染自身?
只是为了它的乐趣,我设置
self.translatesAutoresizingMaskIntoConstraints = NO;
Run Code Online (Sandbox Code Playgroud)
在单元格本身上,导致一个大小为0,0的单元格和约束:
"<NSLayoutConstraint:0x7f88506663a0 'UIView-Encapsulated-Layout-Height' V:[UITableViewCellContentView:0x7f8850648400(0)]>"
Run Code Online (Sandbox Code Playgroud)
但它还在那里......
谢谢你的帮助.
顺便说一句:我已经阅读了有关此事的所有内容,包括: 在UITableView中使用自动布局进行动态单元格布局和可变行高
我很高兴能够在Xcode中构建我的静态TableView,使用自动布局来支持动态类型,如WWDC2014中提到的表和集合视图中的新功能.
我更喜欢严格使用Xcode/Interface Builder和故事板来处理自动布局.当我这样做时,不知何故TableView单元格没有调整大小,我确信我错过了一些简单的东西.
为了重现这一点,使用Xcode 7 beta 5,我:
添加到ViewDidLoad:
self.tableView.rowHeight = UITableViewAutomaticDimension; self.tableView.estimatedRowHeight = 44.0;
在设置中调整并调整动态类型.字体更改时,TableView高度仍然停留在明显的默认值44并截断标签.
这是一个GitHub存储库,它是上面的结果.
为什么Auto Layout不会导致TableView扩展以填充必要的空间以适应新的更大标签文本?
我已经找到了关于这个主题的好帖子,如下所示,并且在这里一直在使用代码来设置约束.
我没有找到任何在纯Interface Builder中执行此操作的示例.当然这很有可能吗?
更新
我已经更新了GitHub源代码,以包含一个带有ImageView而不是UILabel的第二个表行; 它显示了同样的问题:
此外,当我在标签或图像视图上设置显式高度约束时,我生成以下内容.问题似乎是我没有设置的"UIView-Encapsulated-Layout-Height"约束.我猜它是生成的,因为在我的IB静态表视图中,行高被设置为(默认)为44.
Unable to simultaneously satisfy constraints.
...
"<NSLayoutConstraint:0x7fa371f39e30 V:[UILabel:0x7fa371f38d30'Label'(20)]>",
"<NSLayoutConstraint:0x7fa371c39160 UILabel:0x7fa371f38d30'Label'.top == UITableViewCellContentView:0x7fa371e17dc0.topMargin>",
"<NSLayoutConstraint:0x7fa371c393c0 UITableViewCellContentView:0x7fa371e17dc0.bottomMargin == UILabel:0x7fa371f38d30'Label'.bottom>",
"<NSLayoutConstraint:0x7fa371f41a40 'UIView-Encapsulated-Layout-Height' V:[UITableViewCellContentView:0x7fa371e17dc0(43.5)]>"
Run Code Online (Sandbox Code Playgroud)
但是ViewDidLoad中的这个不应该超越这个吗?
self.tableView.rowHeight = UITableViewAutomaticDimension;
self.tableView.estimatedRowHeight = 44.0;
Run Code Online (Sandbox Code Playgroud)
自行调整表格视图单元格是否不适用于静态表格视图?
更新2
我使用动态原型而不是静态表视图构建了相同的东西,一切正常:
它确实似乎是静态的与动态原型表.静态表视图单元格未正确展开.
我在WWDC视频中没有看到动态与静态的关系,所以在这一点上我将这个问题搞砸了.如果我学到新东西,我会更新.
我已经更新了上面的GitHub存储库,以显示静态(损坏)和动态(工作)表视图的示例.
ios ×9
uitableview ×9
autolayout ×3
ios8 ×3
objective-c ×3
dynamic ×2
height ×2
swift ×2
constraints ×1
ios6 ×1
ios7 ×1
reloaddata ×1
row-height ×1
tableview ×1
uiview ×1
xcode ×1
xib ×1