Notice
Recent Posts
Recent Comments
Link
관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - swift] custom view (xib) 내부 내용에 따라 동적으로 크기 조절 본문

iOS 응용 (swift)

[iOS - swift] custom view (xib) 내부 내용에 따라 동적으로 크기 조절

jake-kim 2021. 3. 25. 01:17

* custom view (only code) 참고: ios-development.tistory.com/399

커스텀 xib 생성

//
//  MyView.swift
//  CustomView
//
//  Created by 김종권 on 2021/03/25.
//

import Foundation
import UIKit

struct MyViewModel {
    let first: String
    let seconds: String
}

class MyView: UIView {
    @IBOutlet weak var firstLabel: UILabel!
    @IBOutlet weak var secondLabel: UILabel!

    var data: MyViewModel? = nil {
        didSet {
            firstLabel.text = data?.first
            secondLabel.text = data?.seconds
        }
    }

    required init?(coder: NSCoder) {
        super.init(coder: coder)
        setUpView()
    }

    override init(frame: CGRect) {
        super.init(frame: frame)
        setUpView()
    }

    override class func prepareForInterfaceBuilder() {
        super.prepareForInterfaceBuilder()
    }

    private func setUpView() {
        guard let myView = loadViewFromNib(nib: "MyView") else {
            return
        }
        addSubview(myView)
        
        // 생성된 뷰의 위치 설정: bottom + centerX
        balloonView.translatesAutoresizingMaskIntoConstraints = false
        balloonView.bottomAnchor.constraint(equalTo: bottomAnchor).isActive = true
        balloonView.centerXAnchor.constraint(equalTo: centerXAnchor).isActive = true
    }
}

extension UIView {
    func loadViewFromNib(nib: String) -> UIView? {
        let bundle = Bundle(for: type(of: self))
        let nib = UINib(nibName: nib, bundle: bundle)
        return nib.instantiate(withOwner: self, options: nil).first as? UIView
    }
}
  • xib

  • 주의: safe area를 체크해제 안하면 auto layout에서 버그가 생기는 경우가 존재하므로 꼭 체크해제 필요

내부 내용에 따라 동적으로 크기 조절

  • 사용할때 width constraint를 주지 않고 intrinsic size를 주면 내부 크기에 따라 동적으로 조절
  • UIView를 생성 -> 위에서 만든 MyView class 지정 -> center x, y 정렬: 내부 크기가 정해지지 않아 에러

  • intrinsic size를 지정하여 해결 (여기서 constraint를 주면 내부 크기에 따라 동적으로 뷰가 바뀌지 않고 고정)

  • 테스트1: 짧은 내용
class ViewController: UIViewController {

    @IBOutlet weak var myView: MyView!
    override func viewDidLoad() {
        super.viewDidLoad()
        myView.data = .init(first: "짧은 label1", seconds: "짧은 label2")
    }
}

  • 테스트2: 긴 내용
class ViewController: UIViewController {

    @IBOutlet weak var myView: MyView!
    override func viewDidLoad() {
        super.viewDidLoad()
        myView.data = .init(first: "긴 label1(abcde)", seconds: "긴 label2(가나다라마바)")
    }
}

 

IntrinsicContentSize

  • UIView는 자체적으로 intrinsicContentSize변수를 override할 수 있게했으므로, 특정 상황에서 크기를 지정 가능
class MyView: UIView {
    
    ...

    override var intrinsicContentSize: CGSize {
        let customSize = 12
        return customSize
    }
    
}

 

Comments