【问题标题】:UISegmentedControl text with multiple linesUISegmentedControl 多行文本
【发布时间】:2016-12-17 01:35:15
【问题描述】:

是否有可能在 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


    【解决方案1】:

    也许有点晚了,但这是我在 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
                        }
                    }
                }
            }
        }
    
    }
    

    【讨论】:

      【解决方案2】:

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

      for segmentViews in segmentedControl.subviews {
          for segmentLabel in segmentViews.subviews {
              if segmentLabel is UILabel {
                  (segmentLabel as! UILabel).numberOfLines = 0
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2011-08-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-06
        • 2012-10-17
        相关资源
        最近更新 更多