UISegmentedControl文本有多行

问题描述 投票:4回答:2

是否有可能在iOs 9+中使用多行文本制作UISegmentedControl?

到目前为止我已经尝试过:

  1. 来自SO主题的变体:This, this and this one
  2. 进行扩展: extension UISegmentedControl { func makeMultiline(numberOfLines: Int) { for segment in self.subviews { let labels = segment.subviews.filter { $0 is UILabel } // [AnyObject] labels.map { ($0 as UILabel).numberOfLines = numberOfLines } } } }
  3. 继承自UISegmentedControl并在Identity Inspector中将新类设置为SegmentedControl class MultilineSegmentedControl: UISegmentedControl { override func didMoveToSuperview() { for segment in subviews { for subview in segment.subviews { if let segmentLabel = subview as? UILabel { segmentLabel.numberOfLines = 2 } } } } }
  4. 使用文本而不是标题设置图像并更改UISegmentedControl的框架 viewDidLayoutSubviews() 方法。它使UISegmentedControl高度更大,但是图像保持高度,就好像UISegmentedControl没有放大,并且在第一次交互时UISegmentedControl缩小到它的默认高度。
ios swift uisegmentedcontrol
2个回答
4
投票

也许它有点晚了但是这是我的子类来解决swift 3中的这个问题:

@IBDesignable class MySegmentedControl: UISegmentedControl {

    @IBInspectable var height: CGFloat = 29 {
        didSet {
            let centerSave = center
            frame = CGRect(x: frame.minX, y: frame.minY, width: frame.width, height: height)
            center = centerSave
        }
    }

    @IBInspectable var multilinesMode: Bool = false

    override func layoutSubviews() {
        super.layoutSubviews()
        for segment in self.subviews {
            for subview in segment.subviews {
                if let segmentLabel = subview as? UILabel {
                    segmentLabel.frame = CGRect(x: 0, y: 0, width: segmentLabel.frame.size.width, height: segmentLabel.frame.size.height * 1.6)
                    if (multilinesMode == true)
                    {
                        segmentLabel.numberOfLines = 0
                    }
                    else
                    {
                        segmentLabel.numberOfLines = 1
                    }
                }
            }
        }
    }

}

3
投票

尝试下面的代码,找出所有segmentedControl sub UILabel并设置numberOfLines

for segmentViews in segmentedControl.subviews {
    for segmentLabel in segmentViews.subviews {
        if segmentLabel is UILabel {
            (segmentLabel as! UILabel).numberOfLines = 0
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.