【问题标题】:add container to another container - problem with container.frame.origin将容器添加到另一个容器 - container.frame.origin 的问题
【发布时间】:2022-01-06 07:11:34
【问题描述】:

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

当我打印 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)
    ])
}

当我将红色容器添加到视图时(not whiteContainer.addSubview(red Container)),我得到了白色和红色容器的正确 CGPoint 编号。

为什么?

【问题讨论】:

    标签: swift view frame


    【解决方案1】:

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

    要做到这一点,您应该说“查看,您应该计算它”。这就是为什么你必须在约束设置之后使用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 工作不正常。 “白色容器外”的条件一直被触发
    【解决方案2】:

    现在我的 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
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-02
      • 1970-01-01
      • 2021-03-03
      相关资源
      最近更新 更多