【问题标题】:IBDesignable not working when added to UIStackViewIBDesignable 添加到 UIStackView 时不起作用
【发布时间】:2016-12-12 14:18:01
【问题描述】:

我有这个相当简单的IBDesignable RoundedLabel。它在 Interface Builder 中以及在模拟器中运行时呈现良好。如果我将视图添加到UIStackView 中,即使它在 IB 中渲染得很好,圆角半径也只应用于左上角。

import UIKit

@IBDesignable class RoundedLabel: UILabel {
    @IBInspectable var cornerRadius : CGFloat = 46 {
        didSet {
            self.drawTheLabel()
        }
    }

    @IBInspectable var roundRightCorners : Bool = false {
        didSet {
            self.drawTheLabel()
        }
    }

    @IBInspectable var roundLeftCorners : Bool = false {
        didSet {
            self.drawTheLabel()
        }
    }
    @IBInspectable var borderRadius : CGFloat = 3 {
        didSet {
            self.layer.borderWidth = borderRadius
        }
    }
    @IBInspectable var borderColor : UIColor = .black {
        didSet {
            self.layer.borderColor = borderColor.cgColor
        }
    }

    private func drawTheLabel() {
        var tCorners : UIRectCorner = []
        if roundRightCorners {
            tCorners.insert(.topRight)
            tCorners.insert(.bottomRight)
        }
        if roundLeftCorners {
            tCorners.insert(.bottomLeft)
            tCorners.insert(.topLeft)
        }

        let path = UIBezierPath(roundedRect:self.bounds,
                                byRoundingCorners:tCorners,
                                cornerRadii: CGSize(width: cornerRadius, height:  cornerRadius))

        let maskLayer = CAShapeLayer()

        maskLayer.path = path.cgPath
        self.layer.mask = maskLayer
        self.layer.masksToBounds = true
    }

}

不在uistackview时的视图

添加到uistackview时的视图

【问题讨论】:

    标签: ios swift uistackview ibdesignable


    【解决方案1】:

    问题出在这一行:

    let path = UIBezierPath(roundedRect:self.bounds,
    

    self 实际上拥有正确的bounds 之前,那条线毫无意义。但是当调用drawTheLabel时,它还没有正确的bounds。 (可能是 1000x1000 或其他一些无意义的大小;您可以轻松地记录/调试并找出。)在堆栈视图对其排列的子视图执行布局之前,您正在调用 drawTheLabel 太快

    因此,您添加的蒙版对于最终尺寸的视图来说太大了,您只能看到蒙版的左上角;蒙版的其他角都在右侧和底部,对视图没有影响,因为它们不重叠。

    【讨论】:

    • 谢谢!我从来没有想过在运行时检查边界:/
    【解决方案2】:

    您必须覆盖 layoutSubviews 并调用 super,然后调用 drawTheLabel()

    这将在框架发生变化时应用圆角效果。

    【讨论】:

      猜你喜欢
      • 2023-03-13
      • 2015-10-23
      • 1970-01-01
      • 1970-01-01
      • 2014-11-19
      • 2020-02-06
      • 1970-01-01
      • 1970-01-01
      • 2019-02-13
      相关资源
      最近更新 更多