【问题标题】:UIButton vertical alignment doesn't workUIButton垂直对齐不起作用
【发布时间】:2013-08-18 22:57:22
【问题描述】:

我不明白为什么在下面的代码中,标题对齐不保持顶部。

UIButton *btn2 = [UIButton buttonWithType:UIButtonTypeRoundedRect];
btn2.titleLabel.font = [UIFont systemFontOfSize:53];
btn2.frame = CGRectMake(20, 20, 270, 44);
[btn2 setTitle:@"test1 test2 test3 test4 test5 test6 test7" forState:UIControlStateNormal];
[btn2 setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
btn2.titleLabel.minimumFontSize = 1.0;
btn2.titleLabel.adjustsFontSizeToFitWidth = YES;
btn2.titleLabel.numberOfLines = 1;
btn2.contentVerticalAlignment = UIControlContentVerticalAlignmentTop;

【问题讨论】:

  • 字体必须是 53 号吗?

标签: ios objective-c uibutton uikit


【解决方案1】:

UIButton 有一个名为"titleEdgeInsets" 的非常漂亮的属性,您可以使用它(通过UIEdgeInsetsMake 重新定位标题的顶部和底部边距,并使事物垂直居中。

【讨论】:

  • 是的,我想我可能会使用它......但你知道为什么会这样吗?!我的意思是,wtf。
【解决方案2】:

此行为是由于按钮的titleLabelbaselineAdjustment 默认属性所致。如果你把它设置为UIBaselineAdjustmentNone,你应该会得到你想要的效果。

btn2.titleLabel.baselineAdjustment = UIBaselineAdjustmentNone;

docsUILabel

基线调整

控制文本时如何调整文本基线 需要缩小以适合标签。

@property(nonatomic) UIBaselineAdjustment baselineAdjustment

讨论

如果adjustsFontSizeToFitWidth 属性设置为YES,则在需要调整字体大小的情况下,此属性控制文本基线的行为。此属性的默认值为UIBaselineAdjustmentAlignBaselines。该属性仅在numberOfLines属性设置为1时有效。

UIBaselineAdjustmentAlignBaselines

相对于基线位置调整文本。

适用于 iOS 2.0 及更高版本。

UIBaselineAdjustmentAlignCenters

相对于边界框的中心调整文本。

适用于 iOS 2.0 及更高版本。

UIBaselineAdjustmentNone

相对于边界框的左上角调整文本。这是默认调整。

适用于 iOS 2.0 及更高版本。

请注意,UILabel 的默认调整不同于按钮的titleLabel

【讨论】:

  • btn2.titleLabel?.baselineAdjustment = .alignCenters
【解决方案3】:

看看 Storyboard 中的 Content-Alignment Vertical

【讨论】:

  • 如何以编程方式设置?我已经在我的视图中做到了,但是一旦我重新加载表格视图,它就会重置为垂直中心(虽然不是水平中心......)?
【解决方案4】:

我放弃了尝试让它以编程方式工作,只是为另一个项目设置了基线约束。它似乎在 IB(内容对齐属性)上工作得很好,即使在堆栈视图中也是如此,但在代码中它不起作用。

【讨论】: