Ios 是否可以创建多行UISegmentedControl?

Ios 是否可以创建多行UISegmentedControl?,ios,uisegmentedcontrol,Ios,Uisegmentedcontrol,我的分段控件中有相对较长的文本项,因此我需要在某些点打断文本。是否可以使用换行符?我知道在按钮处需要将换行设置为换行,但如何为UISegmentedControl设置换行。添加[yourSegmentedControl LayoutFneed]

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

添加
[yourSegmentedControl LayoutFneed]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];
        }
    }];     
}];
您可能还需要设置实例的
高度


注意:我需要补充一点警告——正如rmaddy正确指出的那样——这是一个非常脆弱的解决方案,因为如果分段控件的视图层次结构在未来的iOS版本中发生更改,那么代码可能无法正常工作。

请参阅

Swift 3+

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

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

我对此代码做了一点修改,下面是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 ... 
            }
        }
    }

不要忘记将分段控件的高度设置为字体高度的两倍。

如果
语句,则不需要使用第一个
。根据定义,所有子视图都必须是
UIView
实例。应该指出,这样的解决方案是脆弱的。虽然此代码进行了适当的检查以避免崩溃,但如果Apple更改分段控件的内部视图层次结构,它可能会在iOS更新期间轻易停止工作。是的,不幸的是,从您所指出的角度来看,这是非常脆弱的。我想我刚刚添加了第一个
if
语句,因为例程。。。它不会痛,但是——正如你所说——它完全没有用。