将容器的原点设置为另一个容器故障(Swift 4.2)

问题描述 投票:1回答:1

我正在尝试将一个UIView(红色)的原点和宽度/高度设置为第二个UIView(蓝色)。

我调用UIView.frame.origin或大小,由于某种原因,y起源不起作用。

我也尝试过布局约束(请参阅下面的注释),但这会覆盖我的蓝色完全约束视图。

然后我有一个按钮,可以将红色视图设置为侧面,这样您就可以看到下方的蓝色视图,但我无法让它们排成一行。以下是我的代码。在界面构建器中,我将两个UIViews设置为容器。蓝色完全受限于自动布局,红色没有约束。

import UIKit

class ViewController: UIViewController 
{

    @IBOutlet weak var blueContainer: UIView!
    @IBOutlet weak var redContainer: UIView!
    @IBOutlet weak var button: UIButton!

    override func viewDidLoad() {
        super.viewDidLoad()
        print(redContainer.frame)

        redContainer.frame.origin.x = view.frame.width/2
        redContainer.frame.size.width = view.frame.width

        //try to line up y with origin and size
        redContainer.frame.origin.y = blueContainer.frame.origin.y
        redContainer.frame.size.height = blueContainer.frame.size.height

        //also tried by using constraints
        //redContainer.topAnchor.constraint(equalTo: blueContainer.topAnchor).isActive = true
        //redContainer.heightAnchor.constraint(equalTo: blueContainer.heightAnchor).isActive = true

        print(redContainer.frame)
    }

    @IBAction func slideRed(_ sender: Any) {
        if redContainer.frame.origin.x == 0 {
            UIView.animate(withDuration: 0.5) {
                self.redContainer.frame.origin.x = self.view.frame.width/2
            }
            button.setTitle("Come Back Red!", for: .normal)
        } else {
            UIView.animate(withDuration: 0.5) {
                self.redContainer.frame.origin.x = 0
            }
            button.setTitle("Go Away Red!", for: .normal)
        }
    }
}
ios swift user-interface interface-builder
1个回答
2
投票

ViewDidLoad不保证观点已经制定了它的约束。因此当blueContainerframesizezero时,你不会看到对redContainer有任何影响。你应该使用viewDidLayoutSubviewsframe获得正确的sizeblueContainer

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    redContainer.frame.origin.x = view.frame.width/2
    redContainer.frame.size.width = view.frame.width

    //try to line up y with origin and size
    redContainer.frame.origin.y = blueContainer.frame.origin.y
    redContainer.frame.size.height = blueContainer.frame.size.height
}
© www.soinside.com 2019 - 2024. All rights reserved.