iOS 具有动态高度的单元格宽度不正确
iOS cell with dynamic height has bad width
所以首先是我想要的。我想要具有动态高度的单元格,它随文本的长度而变化。类似于图片:
如您所见,第二个单元格超出了边缘。
我是怎么做到的?首先我有 table 布局到边缘:
我用自己的 xib 文件创建了自定义 SwitchCell:
标签有这些自动布局设置:
然后切换这些:
在 viewDidLoad 中我设置了 tableView 属性:
tableView.registerNib(UINib(nibName: SwitchCellIdentifier, bundle: NSBundle.mainBundle()), forCellReuseIdentifier: SwitchCellIdentifier)
tableView.tableFooterView = UIView(frame: CGRectZero)
tableView.rowHeight = UITableViewAutomaticDimension;
tableView.estimatedRowHeight = 44.0;
在 cellForRowAtIndexPath 中我有这个:
...
var cell:SwitchCell = tableView.dequeueReusableCellWithIdentifier(SwitchCellIdentifier) as SwitchCell
cell.titleLabel.text = "Receive payments via multipay and lorem ipsum bla bla"
return cell
那么我做错了什么?我应该更改或添加什么?
也许在标签上设置一个最大宽度约束或从其后缘到父视图的 >= 约束。现在,水平的所有东西都是 "Equal" 到固定值。您需要限制标签宽度,在它和 Switch 之间使用不等式约束,and/or 播放 w/the 约束优先级以防止标签扩展。 estimatedRowHeight 和自动尺寸应该仍然让它垂直扩展。 –
所以对于你的标签,你可以设置自动缩小到最小字体大小,这样你就可以避免在文本太长时消失。问题是你只是在你的 xib 中给出了约束,而不是从 xib 到单元格,因此它看起来像那样,你应该在代码中制作它只是检查下面的代码它可能会给你一个如何做到这一点的例子。
NSDictionary *metrics = @{@"viewWidth":[NSNumber numberWithFloat:size.width],
@"viewHeight":[NSNumber numberWithFloat:size.height]};
NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings(yourXibView);
NSArray *constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-0-[yourXibView]-0-|"
options:0
metrics:metrics
views:viewsDictionary];
[self.view addConstraints:constraints];
并且不要忘记在上面的代码之前添加 yourXibView.translatesAutoresizingMaskIntoConstraints = NO;
。此代码仅在 objective c 中,但不用担心它在 swift.
中具有相同的逻辑
尝试增加标签的内容拥抱优先级
所以首先是我想要的。我想要具有动态高度的单元格,它随文本的长度而变化。类似于图片:
如您所见,第二个单元格超出了边缘。
我是怎么做到的?首先我有 table 布局到边缘:
我用自己的 xib 文件创建了自定义 SwitchCell:
标签有这些自动布局设置:
然后切换这些:
在 viewDidLoad 中我设置了 tableView 属性:
tableView.registerNib(UINib(nibName: SwitchCellIdentifier, bundle: NSBundle.mainBundle()), forCellReuseIdentifier: SwitchCellIdentifier)
tableView.tableFooterView = UIView(frame: CGRectZero)
tableView.rowHeight = UITableViewAutomaticDimension;
tableView.estimatedRowHeight = 44.0;
在 cellForRowAtIndexPath 中我有这个:
...
var cell:SwitchCell = tableView.dequeueReusableCellWithIdentifier(SwitchCellIdentifier) as SwitchCell
cell.titleLabel.text = "Receive payments via multipay and lorem ipsum bla bla"
return cell
那么我做错了什么?我应该更改或添加什么?
也许在标签上设置一个最大宽度约束或从其后缘到父视图的 >= 约束。现在,水平的所有东西都是 "Equal" 到固定值。您需要限制标签宽度,在它和 Switch 之间使用不等式约束,and/or 播放 w/the 约束优先级以防止标签扩展。 estimatedRowHeight 和自动尺寸应该仍然让它垂直扩展。 –
所以对于你的标签,你可以设置自动缩小到最小字体大小,这样你就可以避免在文本太长时消失。问题是你只是在你的 xib 中给出了约束,而不是从 xib 到单元格,因此它看起来像那样,你应该在代码中制作它只是检查下面的代码它可能会给你一个如何做到这一点的例子。
NSDictionary *metrics = @{@"viewWidth":[NSNumber numberWithFloat:size.width],
@"viewHeight":[NSNumber numberWithFloat:size.height]};
NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings(yourXibView);
NSArray *constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-0-[yourXibView]-0-|"
options:0
metrics:metrics
views:viewsDictionary];
[self.view addConstraints:constraints];
并且不要忘记在上面的代码之前添加 yourXibView.translatesAutoresizingMaskIntoConstraints = NO;
。此代码仅在 objective c 中,但不用担心它在 swift.
尝试增加标签的内容拥抱优先级