UIKit에서 SwiftUI처럼 Preview를 사용하는 방법

2023. 10. 2. 23:54·UIKit

아래 코드를 Preview를 보고싶은 ViewController에 붙여넣으면 SwiftUI처럼 Preview를 사용할 수 있다.

// UIKit으로 짠 화면을 SwiftUI로 바로 볼 수 있게 해주는 코드
import SwiftUI

#if DEBUG
extension UIViewController {
    private struct Preview: UIViewControllerRepresentable {
            let viewController: UIViewController

            func makeUIViewController(context: Context) -> UIViewController {
                return viewController
            }

            func updateUIViewController(_ uiViewController: UIViewController, context: Context) {
            }
        }

        func toPreview() -> some View {
            Preview(viewController: self)
        }
}
#endif

import SwiftUI
@available(iOS 13.0.0, *)
struct ViewControllerPreView: PreviewProvider {
    static var previews: some View {
        ViewController().toPreview()
    }
}

위 코드를 뷰 컨트롤러를 만들 때마다 매번 반복하여 적지 않기 위해서는 Extension+ViewControllerPreView을 만들어 Extension부분을 따로 빼고, Preview부분만 각 컨트롤러에 넣어주는 것도 가능하다.

 

1. Extension+UIViewController.swift에 Extension을 따로 분리해서 작성한다.

// Extension+UIViewController.swift
// UIKit으로 짠 화면을 SwiftUI로 바로 볼 수 있게 해주는 코드
import SwiftUI

#if DEBUG
extension UIViewController {
    private struct Preview: UIViewControllerRepresentable {
            let viewController: UIViewController

            func makeUIViewController(context: Context) -> UIViewController {
                return viewController
            }

            func updateUIViewController(_ uiViewController: UIViewController, context: Context) {
            }
        }

        func toPreview() -> some View {
            Preview(viewController: self)
        }
}
#endif

2. 각 컨트롤러별로 동일하게 Preview에 관련된 코드를 작성한다. 이 때, 위에서 선언한 Extension부분은 빼도 된다.

//
//  UIViewTest.swift
//  UIKit-Study
//
//  Created by Kyungsoo Lee on 2023/09/30.
//

import UIKit

class UIViewTest: UIViewController {
    // MARK: - UIView
    private lazy var uiView: UIView = {
        let view = UIView()
        view.backgroundColor = .red
        view.translatesAutoresizingMaskIntoConstraints = false
        
        return view
    }()

    // MARK: - viewDidLoad
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        
        self.view.backgroundColor = .systemGray
        
        // 뷰 추가(아직 layout 설정 안된 상태)
        self.view.addSubview(uiView)
        
        setLayout()
    }

    // MARK: - UIView 제약조건
    private func setUIViewLayout() {
        let uiViewConstraint = [
            uiView.centerXAnchor.constraint(equalTo: view.centerXAnchor),
            uiView.centerYAnchor.constraint(equalTo: view.centerYAnchor),
            uiView.widthAnchor.constraint(equalToConstant: 100),
            uiView.heightAnchor.constraint(equalToConstant: 100)
        ]
        // 제약 조건을 활성화 시켜 오토 레이아웃 설정한다.
        NSLayoutConstraint.activate(uiViewConstraint)
    }

    // MARK: - 전체 제약조건 설정
        // 컴포넌트들의 레이아웃을 설정한다
        private func setLayout() {
            // 프레임 기반의 레이아웃을 비활성화 하여 오토 레이아웃을 기반으로 설정할 수 있도록 한다.
            
            // UIView 제약조건 설정
            setUIViewLayout()
        }
}

// 이 부분이 Preview부분이 된다. Extension을 따로 두어 컨트롤러마다 선언해 줄 필요가 없어졌다.
import SwiftUI

@available(iOS 13.0.0, *)
struct UIViewTestPrebiew: PreviewProvider {
    static var previews: some View {
        UIViewTest().toPreview()
    }
}

'UIKit' 카테고리의 다른 글

코드베이스로 UITextField 구현하기  (1) 2023.10.06
코드베이스로 UIButton 구현하기  (1) 2023.10.05
코드베이스로 UILabel 구현하기  (0) 2023.10.04
코드베이스로 UIView 작성하기  (0) 2023.10.03
UIKit에서 스토리보드 없이 개발환경 설정하는 방법  (0) 2023.10.02
'UIKit' 카테고리의 다른 글
  • 코드베이스로 UIButton 구현하기
  • 코드베이스로 UILabel 구현하기
  • 코드베이스로 UIView 작성하기
  • UIKit에서 스토리보드 없이 개발환경 설정하는 방법
리버🐦‍🔥
리버🐦‍🔥
개발새발 개발일기
  • 리버🐦‍🔥
    개발도 개발새발
    리버🐦‍🔥
  • 전체
    오늘
    어제
    • 분류 전체보기 N
      • CS N
        • DB N
      • 백준 알고리즘
        • Python
        • Java
      • 프로그래머스 알고리즘
        • Python
        • Swift
        • Java
      • 코드트리 알고리즘
        • Python
      • Spring boot N
        • 스프링 부트 3 백엔드 개발자 되기(자바편)
      • SwiftUI
      • UIKit
      • Programming Language
        • Swift
        • Java
      • 공부해야될 것
        • iOS
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    데이터베이스
    programmers
    백준
    스프링 부트 3 백엔드 개발자 되기 : 자바편
    uikit
    Baekjoon
    Python
    스프링 부트
    Code-based
    너비 우선 탐색
    Java
    깊이 우선 탐색
    Swift
    파이썬
    큐
    코드베이스
    ios
    프로그래머스
    그리디 알고리즘
    ci/cd
    문자열
    애너테이션
    구현
    백앤드 개발자
    그래프
    스위프트
    스프링 부트 3 백앤드 개발자 되기 : 자바편
    스프링 부트 3
    UITextView
    자바
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
리버🐦‍🔥
UIKit에서 SwiftUI처럼 Preview를 사용하는 방법
상단으로

티스토리툴바