自动布局 - 将一个 UILabel 的原点替换为另一个
Posted
技术标签:
【中文标题】自动布局 - 将一个 UILabel 的原点替换为另一个【英文标题】:Auto layout - Replace origin of one UILabel with other 【发布时间】:2015-10-06 07:16:41 【问题描述】:我有两个UILabel
。一个UILabel
位于另一个之上。我想要的是,如果顶部没有内容,底部应该取顶部的原点。我必须在屏幕上使用自动布局。我尝试使用sizeToFit
,但这不起作用。如果顶部UILabel
没有内容,底部UILabel
仍然停留在其原点。
【问题讨论】:
请设置约束条件并尝试 【参考方案1】:设置高度约束将不起作用。第二个标签的 y 位置不会得到正确的 Y 轴值(它会向上移动)。我通过在两个结果之间使用vertical spacing constraint
解决您的问题。
说明:- 为标签加上垂直间距约束设置正常的基本约束。当上部标签没有文字时,更新垂直间距约束如下:-
verticalSpacingConstraintBetweenLabels.constant = -(KIntialVerticalSpacing + (KHeightOfLabel-KIntialVerticalSpacing));
我为你创建了一个sample project
。 源代码可在:-
https://www.dropbox.com/s/eq9hinnw4sdfltq/LabelSpacing.zip?dl=0
【讨论】:
【参考方案2】:该要求的一种替代方法是将 IBOutlet 设置为上部标签的高度,并在您不想显示时将其设置为 0。但请记住,您必须设置上下标签之间的垂直间距。较低的标签不应该有超级视图的上边距。
【讨论】:
【参考方案3】:首先将两个顶部约束拖到 UIViewController。 第二次粘贴这段代码:
-(void) loadLabels
_firstLabel.text=@"";
NSInteger heidFirstLabel = 20;
if(_firstLabel.text.length == 0)
_constrainTopFirstLabel.constant = 0 - heidFirstLabel;
_firstLabel.hidden = YES;
else
_constrainTopFirstLabel.constant = 8 ;
我总是用这个。
【讨论】:
【参考方案4】:在 ios9 中,苹果引入了一个新类 UIStackView 来解决我们开发人员面临的这个问题和其他问题,使用自动布局。如果你的目标是 iOS 9 及更高版本,你应该使用这个类。
如果您的目标是 iOS 9 之前的版本,其中一种可能是使用固有内容大小。
1.子类UILabel
2.添加一个属性来判断这个标签是否折叠
@property (nonatomic,assign) BOOL isLabelCollapsed;
3.重写其方法intrinsicContentSize
- (CGSize)intrinsicContentSize
if(self.isLabelCollapsed)
return CGSizeMake(0, 0);
else
return [super intrinsicContentSize];
4.将可折叠标签类设置为自定义类。
5. 需要时,将您的 isLabelCollapsed
属性设置为 YES
并在可折叠标签上调用 invalidateIntrinsicContentSize
。
【讨论】:
以上是关于自动布局 - 将一个 UILabel 的原点替换为另一个的主要内容,如果未能解决你的问题,请参考以下文章
如何使用自动布局将 UILabel 设置为 UICell 宽度的百分比