如何使UITableView的高度dynamic与自动布局function?
我在Xcode 5中使用自动布局。
我将表视图的高度设置为大于或等于200px。 我希望它具有dynamic的大小。 因为有时会有很多行,有时会有几行。
但尺寸总是200px。 如果内容比这个大,我应该向下滚动查看下面的行。
我应该怎么做给予tableviewdynamic大小?
这是用最新版本的Xcode进行testing的。
1)在Xcode转到故事板,并点击你的表视图来select它。
2)在“实用程序”窗格中(请参见图1),确保已定义表视图高度的约束。
3)在显示表视图的视图控制器中创build这个约束的出口:
在Swift 3
@IBOutlet weak var dynamicTVHeight: NSLayoutConstraint!
在目标C中
@property (strong, nonatomic) IBOutlet NSLayoutConstraint *dynamicTVHeight;
4)在故事板中回到UITableView
的高度约束,并确认右边的图标已经将颜色从紫色改变为蓝色(见图2)
4)也把这个代码放在同一个视图控制器中:
迅速
override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) tableView.reloadData() } override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() let height = min(self.view.bounds.size.height, tableView.contentSize.height) dynamicTVHeight.constant = height self.view.layoutIfNeeded() }
目标C
- (void)viewWillAppear:(BOOL)animated { // just add this line to the end of this method or create it if it does not exist [self.tableView reloadData]; } -(void)viewDidLayoutSubviews { CGFloat height = MIN(self.view.bounds.size.height, self.tableView.contentSize.height); self.dynamicTVHeight.constant = height; [self.view layoutIfNeeded]; }
这应该可以解决你的问题。
这些是两个版本的示例项目的链接,它们是你想要的,一个用于Objective C,另一个用于Swift 3.下载并用Xcodetesting。 这两个项目都使用最新版本的Xcode,Xcode 8.3.2。
https://github.com/jcatalan007/TestTableviewAutolayout https://github.com/jcatalan007/TestTableviewAutolayoutSwift
用xib或storyboard创build你的单元格。 给出它的内容。 现在在CellForRowAtIndexPath中调用它。 例如。 如果你想根据评论的标签文本设置单元格高度。
所以给你设置commentsLbl.numberOfLine = 0;
然后在ViewDidLoad中
self.table.estimatedRowHeight = 44.0 ; self.table.rowHeight = UITableViewAutomaticDimension;
现在
-(float)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{ return UITableViewAutomaticDimension;}
瞧…………你做到了。
它可以通过编程来完成。 这个概念(和代码本身)其实很简单:
在myTableView的superview的updateConstraints方法中,添加一个约束,以使myTableView的高度等于myTableView.contentSize.height。
针对iOS 7的Xcode 6进行testing。
你可以按Ctrl +拖动你的UITableView的高度约束到你的视图控制器的源代码,并给它一个名字。 然后在你的ViewController的updateViewConstraints中,你可以将该约束的常量设置为tableView.contentSize.height
….
@IBOutlet weak var tableViewHeightConstraint: NSLayoutConstraint?
….
override func updateViewConstraints() { super.updateViewConstraints() tableViewHeightConstraint?.constant = tableView.contentSize.height }