iPadとPlaygroundsで学ぶ:メンバーの初期化を「lazy」で+配置を修正
前回はUIButtonとMKMapViewを使いました。 schagerl.hatenablog.com
ビューの初期化と配置についてもう少し整理します。
仕様
前回と同じです。
コード
全体
import UIKit import MapKit class ViewController : UIViewController { lazy var map = MKMapView() lazy var button = UIButton() override func loadView() { super.loadView() } override func viewDidLoad() { super.viewDidLoad() self.button.backgroundColor = UIColor.red self.button.addTarget(self, action:#selector(buttonEvent(_:)), for: UIButton.Event.touchUpInside) self.view.addSubview(self.map) self.view.addSubview(self.button) } override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() self.map.frame.size = self.view.frame.size self.map.frame.origin.x = 0 self.map.frame.origin.y = 0 self.button.frame.size = CGSize(width:50, height:50) self.button.frame.origin.x = 100 self.button.frame.origin.y = 100 } @objc func buttonEvent(_ sender: UIButton) { self.map.centerCoordinate = CLLocationCoordinate2D(latitude: 35.0, longitude:135.0) } } import PlaygroundSupport PlaygroundPage.current.liveView = ViewController()
以下で各処理について説明します。
サブビュー初期化
サブビューはViewController
の先頭で下記のように生成しています。
lazy var map = MKMapView() lazy var button = UIButton()
lazy
は初期化に関するキーワードで、初めて使われるときに一度だけ初期化処理が実行されます。
サブビュー登録
サブビューの基本的な設定と登録はviewDidLoad
で行います。
viewDidLoad
はメインビューがロードされたタイミングで呼ばれるので、サブビューを登録するにはちょうど良さそうです。
サブビューのサイズ設定と配置
サブビューのサイズ設定と配置はviewDidLayoutSubviews
で行います。
viewDidLayoutSubviews
はメインビューのboundsが変更され、サブビューの配置が変更されたときに呼ばれます。
メインビューのサイズや位置が変わった時にサブビューの位置とサイズを合わせるという処理になっています。
前回のコードではloadView
でサブビューのサイズ設定を行なっていたため、サイズが確定する前のメインビューにサイズを合わせていたことになります。
また、メインビューのサイズが変わった場合に何もしていないのも良くないですね。画面の向きが変わったり、何かの要因で表示領域が小さくなる場合には対応できていませんでした。
色々スッキリしました。