【问题标题】:Custom UIVIew is not shown未显示自定义 UIVIew
【发布时间】:2017-03-01 23:08:23
【问题描述】:

我创建了一个简单的 UIView 类,它将在运行时显示标签。

@IBDesignable
class CalendarDayView: UIView {

    var dayLabel = UILabel()

    @IBInspectable
    var day: Int {
        set {
            dayLabel.text = String(newValue)
        }
        get {
            return Int(dayLabel.text!)!
        }
    }

    override init(frame: CGRect) {
        super.init(frame: frame)
        prepareSubviews()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        prepareSubviews()
    }

    func prepareSubviews() {
        dayLabel.backgroundColor = UIColor.blue
        addSubview(dayLabel)
        dayLabel.centerXAnchor.constraint(equalTo: self.centerXAnchor)
        dayLabel.centerYAnchor.constraint(equalTo: self.centerYAnchor)
        dayLabel.widthAnchor.constraint(equalTo: self.widthAnchor)
        dayLabel.heightAnchor.constraint(equalTo: self.heightAnchor)
        setNeedsLayout()
    }
}

我在情节提要的一个简单视图控制器上添加了一个 UIView,并将其宽度和高度设置为 100。在属性检查器中,将天值设置为 1。

我看不到自定义视图背景颜色(应该是蓝色),也看不到标签(应该显示 1)。我错过了什么吗?

【问题讨论】:

  • dayLabel的宽高你设置了吗?
  • 自动布局约束不应该解决这个问题吗?
  • 但是,您可能需要设置dayLabel.translatesAutoresizingMaskIntoConstraints = false
  • 另外,您是否明确设置了CalendarDayView 的框架?尝试在框架初始化并添加到您添加到的任何超级视图后放置一个断点并打印出框架。
  • 这并不能解决我的自定义视图背景颜色未显示的原因。

标签: swift uiview


【解决方案1】:

哇,我自己可能遇到过这个错误 1000 次,不敢相信我第一眼就没有认出它(这可能也是我遇到过 1000 次的原因)。

// .isActive = true
dayLabel.centerXAnchor.constraint(equalTo: self.centerXAnchor).isActive = true
dayLabel.centerYAnchor.constraint(equalTo: self.centerYAnchor).isActive = true
dayLabel.widthAnchor.constraint(equalTo: self.widthAnchor).isActive = true
dayLabel.heightAnchor.constraint(equalTo: self.heightAnchor).isActive = true

【讨论】:

  • "dayLabel.translatesAutoresizingMaskIntoConstraints = false" 有帮助。这是做什么的?
  • iOS 将自动为以编程方式创建的 UIView 生成约束。这些将与您自己添加的任何约束相冲突。该行告诉 IOS 不要创建这些约束,因此唯一重要的约束是您以编程方式创建的约束。
  • 谢谢你的解释,但是IOS会生成什么作为默认约束呢?
  • 不完全确定。我认为这取决于您如何设置框架边界和位置,以及您如何设置自动调整大小的蒙版。我一直觉得它太复杂了,不值得。相反,我编写了一个 UIView 扩展来封装所有 AutoLayout 功能。我也真的不喜欢 Interface Builder。
猜你喜欢
  • 2020-03-30
  • 1970-01-01
  • 2012-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多