當設備方向發生變化時,我正在尋找如何更新 UI,但我現在卡住了,需要一些幫助。
我用 Swift 制作了一個登錄螢屏,并以編程方式創建了它的 UI。對于 info.plist 中支持的方向,我設定
- 肖像
- 橫向右
- 橫向左
這是登錄螢屏。

當我使用 Portrait 構建和運行時,它作業正常,但是當我旋轉設備時,UI 變成這樣。

這就像設備方向更改為橫向,但 UI 保持縱向,因此螢屏右側變為黑色。
這是視圖檔案(我沒有放整個代碼),我有一個包含其他 UI 的堆疊視圖。
class LoginView: UIView {
lazy private var stackView = UIStackView()
override init(frame: CGRect) {
super.init(frame: frame)
setupStackView()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
private func setupStackView() {
stackView.translatesAutoresizingMaskIntoConstraints = false
self.addSubview(stackView)
stackView.axis = .vertical
stackView.alignment = .fill
stackView.spacing = 20
stackView.distribution = .fill
stackView.addArrangedSubview(titleText)
stackView.addArrangedSubview(greenView)
NSLayoutConstraint.activate([
stackView.widthAnchor.constraint(equalTo: self.widthAnchor, multiplier: 0.9),
stackView.centerXAnchor.constraint(equalTo: self.centerXAnchor),
stackView.centerYAnchor.constraint(equalTo: self.centerYAnchor)
])
}
視圖控制器是這樣的。
class LoginViewController: UIViewController {
private let loginView = LoginView()
override func viewDidLoad() {
view.addSubview(loginView)
loginView.frame = CGRect(origin: .zero, size: view.bounds.size)
}
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
print("the view is rotated")
}
}
我收到訊息“視圖已旋轉”,并且旋轉部分似乎沒有問題,但無法將視圖控制器本身更新為水平并更新 UI。
我想知道為什么我的視圖控制器在設備處于橫向模式時保持垂直,以及如何更新它。
任何人都可以請我指引正確的方向嗎?
uj5u.com熱心網友回復:
實際上通過使用
loginView.frame = CGRect(origin: .zero, size: view.bounds.size)
您為登錄視圖分配了一個框架,該框架不會在設備旋轉時改變。
您可能也想在這里使用約束方法:
// try replacing
// loginView.frame = CGRect(origin: .zero, size: view.bounds.size)
// with
loginView.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
loginView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
loginView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
loginView.topAnchor.constraint(equalTo: view.topAnchor),
loginView.bottomAnchor.constraint(equalTo: view.bottomAnchor)
])
另一種方法是更新登錄視圖的框架,例如
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
super.traitCollectionDidChange(previousTraitCollection)
loginView.frame = CGRect(origin: .zero, size: view.bounds.size)
}
最后但并非最不重要的一點是,您可以在 viewDidLoad
loginView.frame = CGRect(origin: .zero, size: view.bounds.size)
loginView.autoresizingMask = [.flexibleHeight, .flexibleWidth]
PS我之前的評論有誤導性,因為登錄框架沒有在 setupStackView() 函式中設定
和我的最后評論:
// you can replace
loginView.frame = CGRect(origin: .zero, size: view.bounds.size)
// with
loginView.frame = view.bounds
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/420334.html
標籤:
