元件設定 auto layout 後,修改 frame 或 frame.size 是無效的

使用 UIKit 元件設計 iOS App 畫面時,我們通常會在元件上設定 auto layout,讓 App 畫面在各種尺寸的 iPhone 都能美美地顯示。

當元件加上 auto layout 條件後,iOS 將依據這些條件計算出元件的位置和大小,因此元件的 frame 將由 auto layout 決定。若是後來想改變元件的位置大小,建議透過以下兩種方法:

  • 方法 1: 修改元件的 auto layout 條件。
  • 方法 2: 設定元件的 transform。

除了剛剛提到的兩個方法,也許有人會想到,能不能直接修改元件的 frame 或 frame.size 呢?

很遺憾的,不行。一旦你在元件上設定 auto layout 條件,之後修改元件的 frame 或 frame.size 將不會有任何作用。

比方下圖的瓢蟲照片設定了大小跟置中的 auto layout 條件。

此時我們修改圖片的 frame 或 frame.size 將不會有任何作用。

class ViewController: UIViewController {

@IBOutlet weak var imageView: UIImageView!

override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
imageView.frame = CGRect(x: 0, y: 0, width: 100, height: 100)
}
}

不過單獨改變位置倒是可以,比方修改 frame.origin。

override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
imageView.frame.origin = .zero
}

--

--

彼得潘的 iOS App Neverland
彼得潘的 Swift iOS App 開發問題解答集

彼得潘的iOS App程式設計入門,文組生的iOS App程式設計入門講師,彼得潘的 Swift 程式設計入門,App程式設計入門作者,http://apppeterpan.strikingly.com