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でサブビューのサイズ設定を行なっていたため、サイズが確定する前のメインビューにサイズを合わせていたことになります。 また、メインビューのサイズが変わった場合に何もしていないのも良くないですね。画面の向きが変わったり、何かの要因で表示領域が小さくなる場合には対応できていませんでした。

色々スッキリしました。