带有改变大小的 UIButtons 的 iOS 回流布局

Posted

技术标签:

【中文标题】带有改变大小的 UIButtons 的 iOS 回流布局【英文标题】:iOS reflow layout with UIButtons that change size 【发布时间】:2014-02-07 20:39:35 【问题描述】:

我正在构建一个 ios 应用程序,它使用 UILabel 在屏幕顶部提出一个问题,然后在 titleLabel 中显示一些带有文本的 UIButtons 以获得答案。我正在使用此视图在不同时间显示许多不同的问题,并且每个问题和一组答案都有不同数量的单词。结果,每个 UIButton 最终可能包含非常不同的单词数,这会产生布局问题。我目前正在使用这样的代码:

self.firstAnswer.titleLabel.numberOfLines = 0;
self.firstAnswer.titleLabel.lineBreakMode = NSLineBreakByWordWrapping;
self.firstAnswer.titleLabel.textAlignment = NSTextAlignmentCenter;
[self.firstAnswer sizeToFit];

允许按钮自行调整大小以保留屏幕上的所有文本。然而,当按钮在垂直方向上调整太多时,它也会导致 uibuttons 垂直重叠(即,titleLabel 现在是 4 行而不是 1 行)。有什么方法可以使垂直位于另一个已调整大小的按钮下方的按钮向下移动以为新调整大小的按钮腾出空间?

【问题讨论】:

【参考方案1】:

如果根据 firstAnswer 的新高度更新以下按钮的位置会怎样:

self.secondItem.frame = CGRectMake(self.secondButton.frame.origin.x, 
                                   self.firstAnswer.frame.origin.y + self.firstAnswer.frame.size.height + 10,
                                   self.secondButton.frame.size.width, 
                                   self.secondButton.frame.size.height);

如果您有多个其他项目,您可以在每个后续项目之后重新定位它们,或者对所有项目使用通用偏移量。

编辑: 如果后面跟着多个按钮,您也只需将它们放在一个透明的 UIView 中,然后单独偏移该 UIView。

【讨论】:

如果我找不到更简单的方法,这绝对是我的计划。我对 iOS 很陌生,但我觉得我应该能够在 IB 中单击某些内容以使布局正常工作。【参考方案2】:

是的,使用自动布局并将按钮垂直间距限制到它们最近的顶部和底部邻居。无论按钮需要多少行,这都会使间距保持不变。

【讨论】:

由于某种原因,这样做似乎会使 sizeToFit 方法短路,我最终得到的文本就在屏幕右侧。您的一般解决方案是我觉得应该可以工作的那种事情,但我还没有让它工作。 @enkrates,是的,sizeToFit 似乎有时不能很好地配合自动布局。

以上是关于带有改变大小的 UIButtons 的 iOS 回流布局的主要内容,如果未能解决你的问题,请参考以下文章

带有 UIButtons 的 UIScrollView - 当按钮开始触摸时,滚动视图不会滚动

带有图像视图和标签的 iOS UITableViewCell 动态大小的表格视图单元格

从 iPad 屏幕移入后 UIButtons 无响应

带有 UIButtons 的无限水平 UIScrollView

带有 UIButtons 的 UIScrollview - 如何重新创建跳板?

使用 Auto Layout 改变 UIButtons 的 Column 布局