簡體   English   中英

self.view 有限制嗎?

[英]Does self.view has constraints?

self.view 在 ViewController 上。 它有什么限制嗎? 我發現它有一個頂部和一個左側約束。 它肯定有一個框架。 自動布局系統從 self.view 開始。 我的意思是直到 self.view iOS 系統仍然使用框架來定位視圖。 之后,我們的視圖可以通過自動布局添加。 所以在視圖控制器中,我使用 self.frame.size.width 作為我自己視圖的寬度約束是正確的做法嗎? 我對嗎?

使用SCREEN_WIDTH並且很容易獲得您的設備大小並正確管理您自己的視圖:

let SCREEN_WIDTH : CGFloat = UIScreen.main.bounds.width
let SCREEN_HEIGHT : CGFloat = UIScreen.main.bounds.height

有關更多信息,您可以參考: 鏈接

示例:您應該以編程方式添加自己的新視圖。

import UIKit

class ViewController: UIViewController {

override func viewDidLoad() {
    super.viewDidLoad()

    let SCREEN_WIDTH : CGFloat = UIScreen.main.bounds.width
    let SCREEN_HEIGHT : CGFloat = UIScreen.main.bounds.height

    let newView = UIView()
    newView.translatesAutoresizingMaskIntoConstraints = false
    newView.backgroundColor = UIColor.black

    newView.frame.size = CGSize(width: SCREEN_WIDTH * 0.5 , height: SCREEN_HEIGHT * 0.5)

    self.view.addSubview(newView)
    self.view.layoutIfNeeded()
  }
}

在這里,我將框架賦予我的自定義視圖的約束。 我不想以 frame.size 的格式給出這個值。 我想使用像constraint.constant這樣的東西。 我的意思是純粹的自動布局。圖片

self.view.frame僅在第一次調用viewDidLayoutSubviews()時才准確,通常是在viewDidAppear之前,這意味着如果您嘗試在viewDidLoad或第一次viewWillAppear中訪問該框架將是錯誤的。

因此,您應該只檢查viewDidLayoutSubviews() (但請注意,只要布局更改,就會調用 function (這並不意味着您在表格視圖上滾動,這意味着實際約束會更改屏幕旋轉的 bc 或其他)

如果你不能等到那個方法或者有一些不是冪等的代碼並且不想有一些像hasSetup bool 來確保你只做一次......那么你可以直接通過UIScreen.main.bounds

或者

我不一定會推薦以下內容,但為了完整起見,我還使用了一些技巧來讓視圖更早地布局,例如在視圖生命周期的早期或在初始化的視圖 controller 上調用view.layoutIfNeeded()

let myVC = MyViewController()
_ = myVC.view // fixes frame for some reason

在這里正確使用 AutoLayout

您想使用約束,但如果您進行相對約束,則框架根本不重要。 Aka 而不是說height = constant您會說“使其與 vc.view 具有相同的高度”或“使該視圖的前緣在 vc.view 的前緣右側 20 像素”。

就像是:

    let myView = UIView()
    self.view.addSubview(myView)
    myView.translatesAutoresizingMaskIntoConstraints = false
    myView.heightAnchor.constraint(equalTo: self.view.heightAnchor)
    myView.leadingAnchor.constraint(equalTo: vc.view.leadingAnchor, constant: 20.0) // 20 pixels to right of vc.view leading

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM