是否可以创建多行 UISegmentedControl?

Is it possible to create multi line UISegmentedControl?

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

添加 [yourSegmentedControl layoutIfNeeded]; 方法,然后将其添加为子视图。然后遍历所有的SegmentedControl子view,修改title标签的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;
   }
}

如果你有一个标准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 版本中更改,代码可能不再正常工作。

请参考this answer

Swift 3+

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

Objective C

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

我稍微修改了这个 link 的代码,这里是 Swift 扩展:

extension UISegmentedControl {

  func makeTitleMultiline(){
    for i in 0...self.numberOfSegments - 1 {
      let label = UILabel(frame: CGRect(x: 0, y: -7, width: (self.frame.width-10)/CGFloat(self.numberOfSegments), height: self.frame.height))
      label.textColor = i == 0 ? UIColor.red : UIColor.blue
      label.text = self.titleForSegment(at: i)
      label.numberOfLines = 0
      label.textAlignment = .center
      label.adjustsFontSizeToFitWidth = true
      label.tag = i
      self.setTitle("", forSegmentAt: i)
      self.subviews[i].addSubview(label)
    }
  }

  func setSelectedTitleColor() {
    for i in 0...self.numberOfSegments - 1 {
      let label = self.subviews[self.numberOfSegments - 1 - i].subviews[1] as? UILabel
      label?.textColor = label?.tag == self.selectedSegmentIndex ? UIColor.red : UIColor.blue
    }
  }
}

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 的 高度设置为两倍的字体高度。