[英]UIImageView retains the Storyboard “preview screen bounds” on different devices - Frame not updating based on screen size
當我在模擬器中運行我的應用程序時,我的情節提要預覽選擇手機的高度和重量仍然可以得到。
不應該選擇哪種模擬器?
例如:情節提要預覽選擇iPhoneSE,然后選擇圖像視圖
體重= 96
高度= 92
故事板預覽,選擇iPhone8,然后選擇圖像視圖
重量= 112.5
高度= 108.5
但是當我進行情節提要預覽時,無論選擇iPhone 8,iPhoneX還是選擇iPhoneSE和模擬器,...
體重= 96
高度= 92
為什么?
當我選擇不同的故事板預覽時,最奇怪的是同一台模擬器,我得到了不同的大小...
print(self.img.frame.height)
print(self.img.frame.width)
我遇到了完全相同的問題,在上面的描述中我認為它並沒有很好地解決。 要重新創建它,請執行以下步驟:
1)在Xcode中啟動一個新的“單視圖應用程序”。 我目前正在使用Xcode 10.2.1
2)進入情節提要,並添加帶有某種backgroundColor的UIView對象,使其可見
3)給此新視圖一些自動約束,例如前導,尾隨,centerY和縱橫比為1:1。 只要確保不給它固定的高度或寬度即可。
4)在ViewController.swift
,為此UIView添加一個IBOutlet變量(例如“ myView”)並連接它,以便於引用。
5)在viewDidLoad()
,添加打印語句以達到以下效果:
print("Bounds of myView: \(myView.bounds)")
現在,返回Interface Builder,將預覽或底部的“查看為”設置為“ iPhone SE”之類的內容。 然后,在頂部選擇模擬器的位置,還選擇“ iPhone SE”。 現在運行該應用程序。
在控制台中,您將看到帶有視圖邊界的打印語句,並且所有內容在視覺上看起來都很好。
現在,將Interface Builder的預覽“查看方式”選項更改為類似“ iPhone 8”的名稱, 但將模擬器選項保留在iPhone SE上,再次在“ iPhone SE”模擬器中運行該應用程序。
就像以前一樣,由於自動布局,外觀上一切正常。 但是,控制台中打印的邊界信息是不同的 。 而是與“ iPhone 8”或在Interface Builder中選擇用於預覽的任何設備匹配。
舉一個更明顯的例子,為Interface Builder選擇類似iPad Pro的東西,然后在iPhone SE模擬器上再次運行它。 再次從視覺上看一切正常,但控制台中的bounds
信息已消失。 它與接口預覽綁定,而不與要測試的設備綁定。
當您編寫在自動布局約束下使用對象的邊界信息的代碼時,這些約束沒有固定的寬度和高度,因此會出現問題。
在ViewController.swift
,在viewDidLoad()
方法之后添加以下內容
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
print("Bounds of myView in viewDidLayoutSubviews: \(myView.bounds)")
}
現在,無論我們在Interface Builder中使用哪種預覽選項,模擬器都將在生命周期中的這一點記錄正確的邊界信息。
因此,對於使用代碼中的bounds
或frame
屬性的任何項目(例如本示例中的視圖),都應在viewDidLayoutSubviews()
方法中放置任何限制邊界的代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.