将容器添加到另一个容器 - container.frame.origin 有问题

add container to another container - problem with container.frame.origin

我正在测试平移手势识别器。 我添加了一个白色容器来查看,然后在白色容器中添加了另一个红色容器。

当我打印 whiteContainer.frame.orgin 时,我得到正确的 CGPoint 数字,但是当我打印 redContaner CGPoint 数字时,我得到 0.0, 0.0

class ViewController6 : UIViewController {

let whiteContainer = UIView()
let redContainer = UIView()

var pointOrigin2: CGPoint?
var pointOrigin3: CGPoint?

override func viewDidLoad() {
    super.viewDidLoad()
    setupView()
}

override func viewDidLayoutSubviews() {
    
    pointOrigin2 = whiteContainer.frame.origin
    print(pointOrigin2!)
    pointOrigin3 = redContainer.frame.origin
    print(pointOrigin3!)

}
private func setupView() {
    view.backgroundColor = .black
    
    configureContainer()
    configureRedContainer()
    addPanGestureRecognizare()
}

func configureContainer() {
    view.addSubview(whiteContainer)
    whiteContainer.translatesAutoresizingMaskIntoConstraints = false
    
    whiteContainer.backgroundColor = .white
    
    NSLayoutConstraint.activate([
        whiteContainer.centerXAnchor.constraint(equalTo: view.centerXAnchor),
        whiteContainer.centerYAnchor.constraint(equalTo: view.centerYAnchor),
        whiteContainer.widthAnchor.constraint(equalToConstant: 200),
        whiteContainer.heightAnchor.constraint(equalToConstant: 200)
    ])
}
func configureRedContainer() {
    whiteContainer.addSubview(redContainer)
    redContainer.translatesAutoresizingMaskIntoConstraints = false
    
    redContainer.backgroundColor = .red
    
    NSLayoutConstraint.activate([
        redContainer.centerXAnchor.constraint(equalTo: view.centerXAnchor),
        redContainer.centerYAnchor.constraint(equalTo: view.centerYAnchor),
        redContainer.widthAnchor.constraint(equalToConstant: 50),
        redContainer.heightAnchor.constraint(equalToConstant: 50)
    ])
}

当我添加红色容器进行查看时(不是whiteContainer.addSubview(红色容器))我得到了白色和红色容器的正确 CGPoint 编号。

为什么?

Viewcontroller 如果您在 viewDidLoad 中添加,则子视图不在自己的视图中的帧没有任何计算。如果您将子视图添加到 ViewController 的视图,那么 ViewController 会对该视图进行计算,但如果您将子视图添加到视图的子视图,则不会。这就是为什么您可以看到 whiteContainer 帧不为零且 redContainer 为零的原因。

要做到这一点,你应该说 'view , you should calculation it'。这就是为什么你必须在约束设置后使用 view.layoutIfNeeded() .

这会解决你的问题

 func configureRedContainer() {

    whiteContainer.addSubview(redContainer)

    redContainer.translatesAutoresizingMaskIntoConstraints = false
    
    redContainer.backgroundColor = .red
    
    NSLayoutConstraint.activate([
        redContainer.centerXAnchor.constraint(equalTo: view.centerXAnchor),
        redContainer.centerYAnchor.constraint(equalTo: view.centerYAnchor),
        redContainer.widthAnchor.constraint(equalToConstant: 50),
        redContainer.heightAnchor.constraint(equalToConstant: 50)
    ])
    view.layoutIfNeeded() // must add after setting constraints

}

现在我的 func PanGestute 工作不正常。 “在白色容器外”的条件一直被触发 @OmerTekbiyik ?

    func addPanGestureRecognizare() {
    let pan = UIPanGestureRecognizer(target: self, action: #selector(handlePanGesture2(sender:)))
    redContainer.addGestureRecognizer(pan)
}

@objc func handlePanGesture2(sender : UIPanGestureRecognizer) {
    let fileView = sender.view!
    
    switch sender.state {
    case .began, .changed:
        
        let translation = sender.translation(in: fileView)
        fileView.center = CGPoint(x: fileView.center.x + translation.x, y: fileView.center.y + translation.y)
        sender.setTranslation(CGPoint.zero, in: fileView)
    case .ended:
        if fileView.frame.intersects(whiteContainer.frame) {
            print("in white container")
        } else {
            print("outside the white container")
            UIView.animate(withDuration: 0.3, animations: { fileView.frame.origin = self.pointOrigin3!})
        }
    default:
        break
    }
}