ios - 将容器的来源设置为另一个容器的问题(Swift 4.2)

标签 ios swift user-interface interface-builder

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

我正在调用 UIView.frame.origin 或 size 并且由于某种原因 y 原点不起作用。

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

然后我有一个按钮可以将红色 View 动画化到一侧,这样您就可以看到下方的蓝色 View ,但我无法让它们在开始时排成一行。下面是我的代码。在界面生成器中,我将两个 UIView 都设置为容器。蓝色完全受自动布局约束,红色没有约束。

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)
        }
    }
}

最佳答案

ViewDidLoad 不保证 View 已经布置了它的约束。因此,当 blueContainerframesize0 时,您不会看到对 redContainer 有任何影响。您应该使用 viewDidLayoutSubviewsblueContainer 获取正确的 framesize

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
}

关于ios - 将容器的来源设置为另一个容器的问题(Swift 4.2),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55447955/

相关文章:

ios - 取消 dispatch_after() 方法?

ios - UIRectCornerTopRight 的圆角不起作用

swift - 快速实现带有内部类的公共(public)协议(protocol)

ios - Swift协议(protocol)问题,如何表达

python - 是否有用于自定义自动完成的 Python 库?

iphone - 如何在UITextview/UILabel中使用自定义表情?

c++ - 仅将应用程序提交到架构为 armv7s 及更高版本的应用程序商店。

ios - 可选类型 UILabel 的值未展开。

java - Java 中 GUI 的 JUnit 测试

python - 如何在 gtk3-python 中执行后台任务?