작은 View Controller로 화면 조립

10562 단어 SwiftiOS
View가 아닌ViewController로 화면 부품을 세분화하여 조립한 샘플입니다.
다음은 Toolbar입니다. 이외에도 WebView라는 간단한 화면입니다.
간단한 내용이지만 두 개올가미에 빠지다가 있기 때문에 다른 사람의 도움이 될 것으로 기대하고 메시지를 남긴다.

WebViewController


화면 이외의 코드가 없습니다.
밖에서 URL을 지정해서 읽는 기능 등 필요하면 각자 추가하세요🙇‍♂️
WebViewController.swift
import UIKit
import WebKit

class WebViewController: UIViewController {

    var webView: WKWebView!

    override func loadView() {
        let configuration = WKWebViewConfiguration()
        webView = WKWebView(frame: .zero, configuration: configuration)
        view = webView
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        let url = URL(string: "https://google.com")!
        let request = URLRequest(url: url)
        webView.load(request)
    }

}

ToolbarViewController


여기도 화면 이외의 코드가 없다.
ToolbarViewController.swift
import UIKit

class ToolbarViewController: UIViewController {

    var toolbar: UIToolbar!

    override func loadView() {
        toolbar = UIToolbar(frame: .zero)
        let back = UIBarButtonItem(title: "back", style: .plain, target: nil, action: nil)
        toolbar.items = [back]
        view = toolbar
    }
}

조립 화면

import UIKit

class ViewController: UIViewController {

    let toolbar = ToolbarViewController()
    let webView = WebViewController()

    override func loadView() {
        view = UIView(frame: .zero)

        webView.view.translatesAutoresizingMaskIntoConstraints = false
        addChild(webView)
        view.addSubview(webView.view)
        webView.didMove(toParent: self)

        toolbar.view.translatesAutoresizingMaskIntoConstraints = false
        addChild(toolbar)
        view.addSubview(toolbar.view)
        toolbar.didMove(toParent: self)

        let guide = view.safeAreaLayoutGuide
        NSLayoutConstraint.activate([
            webView.view.topAnchor.constraint(equalTo: view.topAnchor),
            webView.view.leftAnchor.constraint(equalTo: view.leftAnchor),
            webView.view.bottomAnchor.constraint(equalTo: toolbar.view.topAnchor),
            webView.view.rightAnchor.constraint(equalTo: view.rightAnchor),
            toolbar.view.leftAnchor.constraint(equalTo: view.leftAnchor),
            toolbar.view.bottomAnchor.constraint(equalTo: guide.bottomAnchor),
            toolbar.view.rightAnchor.constraint(equalTo: view.rightAnchor)
            ])
    }

}
어려운 것도 없고!
작은 View Controller는 View 하나만 있으면 AutoLayout 코드를 쓸 필요가 없습니다.
2,3개의 중첩을 누르면 AutoLayout 코드는 간단명료하고 알기 쉬운 범위 내에 유지됩니다.
따라서 xib를 사용하지 않아도 쓰기 쉬운 경우가 많다.
(반대로xib가 VC의 수량만 늘리면 관리가 좀 번거로울 수 있습니다.)

주의사항


뷰에서 직접 UIToolbar 설정

var UIViewController.view에서 UIToolbar를 직접 설정하십시오.
아래와 같이 UIVIew에서 UIToolbaraddSubview를 사용할 수 없습니다.
    override func loadView() {
        view = UIView(frame: .zero)

        toolbar = UIToolbar(frame: .zero)
        toolbar.translatesAutoresizingMaskIntoConstraints = false
        let back = UIBarButtonItem(title: "back", style: .plain, target: nil, action: nil)
        toolbar.items = [back]
        view.addSubview(toolbar)

        NSLayoutConstraint.activate([
            toolbar.topAnchor.constraint(equalTo: view.topAnchor),
            toolbar.leftAnchor.constraint(equalTo: view.leftAnchor),
            toolbar.bottomAnchor.constraint(equalTo: view.bottomAnchor),
            toolbar.rightAnchor.constraint(equalTo: view.rightAnchor)
            ])
    }
UIVIEW에 UIToolbar 구성을 추가하면 Toolbar의 Safe Area가 작동하지 않습니다!
아래와 같이 표시됩니다.

UIVIew Controller에서 self.view.translatesAutoresizingMaskIntoConstraints=false


위 샘플의 예는 WebViewController의 loadView()self.view.translatesAutoresizingMaskIntoConstraints = false기대한 대로 움직인다.
그런데 그걸 하면 WebView Controller가 모드로 표시되면 제대로 표시되지 않아요!
아마도 모드 디스플레이에서 마스크의 자동 변환을 자동으로 조정하는 것이 동작의 전제 조건일 것이다.
Toolbar라면 문제 없어요.
통일되면 길을 잃지 않기 때문에 UIVIew Controller를 만드는 쪽이 밖에서vc.view.translatesAutoresizingMaskIntoConstraints = false사용자 정의 모양새를 정의합니다.

좋은 웹페이지 즐겨찾기