我正在尝试学习自动布局,当这件事发生时,我最终认为我已经掌握了它。我正在玩原型细胞和标签。我正在尝试
到目前为止,我有这个:
我想实现的是:
如您所见,除了最后一行中的示例之外,几乎所有这些都正常工作。我试图对此进行研究,据我所知,这与内在内容大小有关。网上的许多帖子建议设置setPreferredMaxLayoutWidth
,我已经在多个地方为titleLbl
这样做了,但没有效果。只有当将其硬编码为180
时,我才得到结果,但它还为文本顶部/下方的其他蓝色框添加了空格/填充,大大增加了红色/蓝色框之间的空间。
以下是我的约束:
根据我对其他文本样本进行的测试,它确实使用了故事板中显示的宽度,但是任何纠正它的尝试都不起作用。
我已经创建了单元格的ivar,并用它来创建单元格的高度:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
[sizingCellTitleSubMoney.titleLbl setText:[[tableViewData objectAtIndex:indexPath.row] objectForKey:@"title"]];
[sizingCellTitleSubMoney.subtitleLbl setText:[[tableViewData objectAtIndex:indexPath.row] objectForKey:@"subtitle"]];
[sizingCellTitleSubMoney.moneyLbl setText:[[tableViewData objectAtIndex:indexPath.row] objectForKey:@"cost"]];
[sizingCellTitleSubMoney layoutIfNeeded];
CGSize size = [sizingCellTitleSubMoney.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];
return size.height+1;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
MATitleSubtitleMoneyTableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifierTitleSubTitleMoney];
if(!cell)
{
cell = [[MATitleSubtitleMoneyTableViewCell alloc] init];
}
cell.titleLbl.layer.borderColor = [UIColor blueColor].CGColor;
cell.titleLbl.layer.borderWidth = 1;
cell.subtitleLbl.layer.borderColor = [UIColor redColor].CGColor;
cell.subtitleLbl.layer.borderWidth = 1;
cell.moneyLbl.layer.borderColor = [UIColor greenColor].CGColor;
cell.moneyLbl.layer.borderWidth = 1;
[cell.titleLbl setText:[[tableViewData objectAtIndex:indexPath.row] objectForKey:@"title"]];
[cell.subtitleLbl setText:[[tableViewData objectAtIndex:indexPath.row] objectForKey:@"subtitle"]];
[cell.moneyLbl setText:[[tableViewData objectAtIndex:indexPath.row] objectForKey:@"cost"]];
return cell;
}
我尝试在单元格的布局子视图中设置< code > setpreferedmaxlayoutwidth :
- (void)layoutSubviews
{
[super layoutSubviews];
NSLog(@"Money lbl: %@", NSStringFromCGRect(self.moneyLbl.frame));
NSLog(@"prefferredMaxSize: %f \n\n", self.moneyLbl.frame.origin.x-8);
[self.titleLbl setPreferredMaxLayoutWidth: self.moneyLbl.frame.origin.x-8];
}
日志:
2014-04-30 21:37:32.475 AutoLayoutTestBed[652:60b] Money lbl: {{209, 20}, {91, 61}}
2014-04-30 21:37:32.475 AutoLayoutTestBed[652:60b] prefferredMaxSize: 201.000000
这是我所期望的,因为这两个元素之间有8px,控制台会验证这一点。无论我向蓝色框中添加多少文本(与情节提要相同),它都能完美地处理第一行,但对绿色框的任何增加都会影响宽度计算。我已经尝试在tableView:willDisplayCell
和tableView:heightForRowAtIndexPath:
任何帮助,想法或意见将不胜感激
天哪,刚刚也遇到了同样的问题。这位@西蒙·麦克洛林的回答并没有帮助我。但是
titleLabel.adjustsFontSizeToFitWidth = true
真是神奇!它起作用了,我不知道为什么,但它起作用了。是的,你的标签也必须有一个明确的首选MaxLayoutWidth值。
我不确定我对你的理解是否正确,我的解决方案真的远非最好的解决方案,但这里是:
我在剪切的标签上添加了一个高度约束,将该约束连接到单元格的出口。我重写了layoutSubview方法:
- (void) layoutSubviews {
[super layoutSubviews];
[self.badLabel setNeedsLayout];
[self.badLabel layoutIfNeeded];
self.badLabelHeightConstraint.constant = self.badLabel.intrinsicContentSize.height;
}
还有维奥拉。请试试那个方法并告诉我结果,谢谢。
阅读以下内容后,发现了一个更好的答案:http://johnszumski.com/blog/auto-layout-for-table-view-cells-with-dynamic-heights
创建一个< code>UILabel子类来覆盖< code>layoutSubviews,如下所示:
- (void)layoutSubviews
{
[super layoutSubviews];
self.preferredMaxLayoutWidth = CGRectGetWidth(self.bounds);
[super layoutSubviews];
}
这确保了首选的Max布局宽度
始终是正确的。
更新:
在iOS的几次发布和测试更多的用例之后,我发现上述内容不足以满足每种情况。从iOS 8开始(我相信),在某些情况下,只有在屏幕加载之前及时调用Set
边界
。
在最近的iOS9中,我在使用带有UITableView的模态UIVIewController
时遇到了另一个问题,即layoutSubview
和set bound
都在heightForRowAtIndexPath
之后被调用。经过多次调试,唯一的解决方案是覆盖set frame
。
下面的代码现在似乎是必要的,以确保它适用于所有iOS,控制器,屏幕尺寸等。
override public func layoutSubviews()
{
super.layoutSubviews()
self.preferredMaxLayoutWidth = self.bounds.width
super.layoutSubviews()
}
override public var bounds: CGRect
{
didSet
{
self.preferredMaxLayoutWidth = self.bounds.width
}
}
override public var frame: CGRect
{
didSet
{
self.preferredMaxLayoutWidth = self.frame.width
}
}
我在尝试用自动布局实现一些非常基本的布局行为时遇到了困难。我的视图控制器在IB中看起来是这样的: 最上面的标签是标题标签,不知道会有多少行。我需要标题标签显示所有的文字行。我还需要另外两个标签和小的图像,以布局的权利下面的标题,但它恰巧是高的。我设置了标签和小图像之间的垂直间距约束,以及标题标签和它的超级视图之间的顶部间距约束和小图像和它的超级视图之间的底部间距约束。白色UIView没有高度限制,
下面的问题是这个问题的延续: iOS:自动布局中的多行 UI标签 主要思想是,每个视图都应该声明其“首选”(固有)大小,以便AutoLayout可以知道如何正确显示它。UILabel只是视图本身无法知道显示所需的大小的情况的一个例子。这取决于提供的宽度。 正如mwhuss所指出的,setPreferredMaxLayoutWidth实现了使标签跨越多行的技巧。但这不是这里的主要问题。问题是,我在何
问题内容: 我有一个UILabel,一个UIView在情节提要中并排包含其他子视图。UIView应该紧靠UILabel的右边缘(跟踪约束为1),但我还需要UIlabel(左侧的UIlabel)将其宽度设置为等于其内容大小,除非它达到最大宽度。视觉上: |标签文字| | UIViewWithSubviews | 我需要以下约束: 1)标签应明智地调整宽度大小,除非达到最大大小,并且高度也是动态的,这
我想使用TextFlow显示一些格式化的文本。之前,我使用了一个简单的标签(wrapText设置为true)来显示该文本(未格式化),但想使用提供我想使用TextFlow显示的文本列表的库。 我的问题是要显示的文本比可用区域大。标签在空间不足时会切断文本。这很有效。不幸的是,TextFlow没有。当文本过长时,它会溢出TextFlow所在的区域。相邻的文本流然后相互重叠。如何模仿标签的行为? 可以
你可能用过UIViewAutoresizingMask类型的一些常量,应用于当父视图改变尺寸的时候,相应UIView的frame也跟着更新的场景(通常用于横竖屏切换)。 在iOS6中,苹果介绍了自动排版机制,它和自动调整不同,并且更加复杂。 在Mac OS平台,CALayer有一个叫做layoutManager的属性可以通过CALayoutManager协议和CAConst
我正在深入研究自动布局,并试图了解如何水平居中多个视图,包括具有内在大小的视图(如UILabel或UIButton)。 例如,我有一个固定宽度为 320 的自定义视图。在其中,我有两个子视图,一个用户界面标签和一个用户界面图像视图。我希望 UI图像视图位于 UI标签右侧的 15 个像素,并且我希望 UI标签和 UI图像视图一起在超级视图中水平居中,但我不确定处理此问题的最佳方法。 我应该把它们放到