我正在尝试将一个 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 已经布置了它的约束。因此,当 blueContainer
的 frame
和 size
为 0
时,您不会看到对 redContainer 有任何影响
。您应该使用 viewDidLayoutSubviews
从 blueContainer
获取正确的 frame
和 size
。
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/