首页 > 解决方案 > View 的 Frame 被调用两次并导致剪辑错误

问题描述

我有一个基本的 UIView,它有一个 visualEffectView 作为它的子视图。我将 visualEffectView 的视图 frame.height 设置为 80。当呈现给 ViewController 时,我想将其高度重置为 120。目前,当呈现时,高度最初是 120,但随后迅速回落到 80。我的框架不应该在我的 ViewController 会覆盖 UIView 中设置的框架吗?我在 ViewController 中的框架首先被调用,但后来它被 UIView 调用,导致剪辑错误。

class CardView: UIView {

let visualEffectView = UIVisualEffectView(effect: UIBlurEffect(style: .light))

override init(frame: CGRect) {
    super.init(frame: frame)
    clipsToBounds = true
    addSubview(visualEffectView)
}

override func layoutSubviews() {
    super.layoutSubviews()

    visualEffectView.anchor(top: topAnchor, left: leftAnchor, bottom: nil, right: rightAnchor, paddingTop: 0, paddingLeft: 0, paddingBottom: 0, paddingRight: 0, width: 0, height: 80)

  }
}

class ViewController: ViewController {

let cardView: CardView = {
    let cv = CardView()
    cv.imageView.clipsToBounds = true
    cv.layer.cornerRadius = 18
    return cv
}()

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    let superviewFrame = view.frame.height
    cardView.frame = CGRect(x: 10, y: superviewFrame / 8, width: view.frame.width - 20, height: superviewFrame - (superviewFrame / 5))
    cardView.visualEffectView.anchor(top: cardView.topAnchor, left: cardView.leftAnchor, bottom: nil, right: cardView.rightAnchor, paddingTop: 0, paddingLeft: 0, paddingBottom: 0, paddingRight: 0, width: 0, height: 120)     
  }
}

标签: iosswiftlayoutuikit

解决方案


try moving this code

visualEffectView.anchor(top: topAnchor, left: leftAnchor, bottom: nil, right: rightAnchor, paddingTop: 0, paddingLeft: 0, paddingBottom: 0, paddingRight: 0, width: 0, height: 80)

from override func layoutSubviews() { to override init(frame: CGRect) {

after super.init()


推荐阅读