是否可以创建多行UISegmentedControl?

时间:2015-01-19 15:56:58

标签: ios uisegmentedcontrol

我的分段控件中有相对较长的文本项,所以我需要在某些点打破文本。是否可以使用换行符?我知道在按钮上我需要设置换行到自动换行,但是如何为UISegmentedControl设置它。

5 个答案:

答案 0 :(得分:21)

请参阅this answer

Swift 3 +

UILabel.appearance(whenContainedInInstancesOf: [UISegmentedControl.self]).numberOfLines = 0

目标C

[[UILabel appearanceWhenContainedIn:[UISegmentedControl class], nil] setNumberOfLines:0];

答案 1 :(得分:4)

如果您有标准UISegmentedControl,则可以使用以下提示:

[_segmentedControl.subviews enumerateObjectsUsingBlock:^(UIView * obj, NSUInteger idx, BOOL *stop) {
    [obj.subviews enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        if ([obj isKindOfClass:[UILabel class]]) {
            UILabel *_tempLabel = (UILabel *)obj;
            [_tempLabel setNumberOfLines:0];
        }
    }];     
}];

您可能还需要设置实例的height


注意:我需要添加一些警告 - 正如rmaddy也正确指出的那样 - 这是一个非常脆弱的解决方案,因为如果分段控件的视图层次结构会在未来的iOS版本代码可能无法正常工作。

答案 2 :(得分:1)

添加[yourSegmentedControl layoutIfNeeded];方法,然后将其添加为子视图。然后迭代所有SegmentedControl子视图并修改标题标签的numberOfLines属性。

这是代码

for (id segmentItem in [yourSegmentedControl subviews])
{
  if ([segmentItem isKindOfClass:[UILabel class]])
   {
     UILabel *titleLabel = (UILabel *) segmentItem;
     titleLabel.frame = CGRectMake(0, 0, 100, 50); //modify the frame if the second line is not showing.
     titleLabel.numberOfLines = 0;
   }
}

答案 3 :(得分:0)

我改变了这个link的代码,这里是Swift扩展名:

<memory>

答案 4 :(得分:0)

解决方案的Swift 4版本。 segmentedControl 是您的UISegmentedControl实例。

        for segmentItem : UIView in segmentedControl.subviews
    {
        for item : Any in segmentItem.subviews {
            if let i = item as? UILabel {
                i.numberOfLines = 0
                // change other parameters: color, font, height ... 
            }
        }
    }

不要忘记将 segmentedControl的高度设置为字体高度的两倍。