不明白为什么我的 UILabel 不遵循 safeareaLayout 约束

Don't understand why my UILabel won't follow safeareaLayout constraints

我没有使用故事板,下面是我的主菜单屏幕的 UIViewController 的完整代码。虽然看起来一切正常,但我犯了一个错误,但不明白结果。

myView,灰色区域设置为safeareaLayout约束
fillRects 是一个函数,我在其中预填充将放置在 myView

上的标签和按钮的所有矩形

一不小心,我将错误的视图传递给了 fillRects,而不是预期的 myView。因此我在下面创建的 UILabel 比它应该的要大。

但我的理解是它应该被裁剪,因为它是 myView 的子项,受限于 safeAreaLayout 指南。然而,从包含的图像中,您可以看到它超出了屏幕上 myView 的区域。

我应用safeareaLayout guides的方式有误吗?或者我对它们如何工作的理解?

import UIKit

class MainMenuCtrl: UIViewController {

    var viewBounds          : CGRect = .zero
    var topLabelRect        : CGRect = .zero
    var bottomLabelRect     : CGRect = .zero
    var menuRect            : CGRect = .zero
    
    private let myView : UIView = {
        let myView = UIView()
        myView.translatesAutoresizingMaskIntoConstraints = false
        myView.backgroundColor = .gray
        return myView
    }()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Set background color func
        setBGC(vc: view)
    }

    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
        view.backgroundColor = .green
        view.addSubview(myView)
        addContraints(main: view, child: myView)
        

        ////fill the CGRects for all the labels, and buttons
        fillRects(vc: self)
        
        let label = UILabel(frame: self.topLabelRect)
        label.textAlignment = .center
        label.backgroundColor = .red
        label.text = "hello"
        label.textColor = nameColor
        label.font = .systemFont(ofSize: 40)
        label.adjustsFontSizeToFitWidth = true
        label.minimumScaleFactor = 0.7
        
        myView.addSubview(label)
        
    }
    
    override var prefersStatusBarHidden: Bool {
           return false
       }

    override var preferredStatusBarStyle: UIStatusBarStyle {
       return .darkContent
    }
}

这里是 fillRects 的代码 func fillRects (vc: MainMenuCtrl) {

vc.viewBounds = vc.view.frame

vc.topLabelRect = CGRect(x: vc.viewBounds.minX, y: vc.viewBounds.minY,
                         width: vc.viewBounds.width, height: vc.viewBounds.height * 0.05)
vc.bottomLabelRect   = CGRect(x: vc.viewBounds.minX, y: vc.viewBounds.height * 0.9,
                              width: vc.viewBounds.width, height: vc.viewBounds.height * 0.05)
vc.menuRect          = CGRect(x: vc.viewBounds.minX, y: vc.viewBounds.height * 0.2,
                              width: vc.viewBounds.width, height: vc.viewBounds.height * 0.6)

}

视图有一个 clipToBounds 属性 指示子视图是否限制在其父视图的范围内。默认值为 false,它解释了您遇到的行为。

在父视图上设置 view.clipToBounds = true 应该会导致子视图按照您的预期运行。