Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- Clean Code
- Protocol
- tableView
- 리펙토링
- uitableview
- 리펙터링
- 리팩토링
- 스위프트
- ribs
- Observable
- collectionview
- swift documentation
- swiftUI
- combine
- SWIFT
- clean architecture
- 애니메이션
- Refactoring
- map
- 클린 코드
- UICollectionView
- rxswift
- HIG
- RxCocoa
- Human interface guide
- UITextView
- Xcode
- MVVM
- uiscrollview
- ios
Archives
- Today
- Total
김종권의 iOS 앱 개발 알아가기
[iOS - swift] custom view (xib) 내부 내용에 따라 동적으로 크기 조절 본문
* custom view (only code) 참고: ios-development.tistory.com/399
커스텀 xib 생성
- 만드는 설명 참고: ios-development.tistory.com/20
//
// 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
}
}
'iOS 응용 (swift)' 카테고리의 다른 글
[iOS - swift] CAGradientLayer, layer.mask (+ 텍스트 gradient fade out 처리) (0) | 2021.03.26 |
---|---|
[iOS - swift] UIBezierPath, CAShapeLayer으로 말풍선 구현 (0) | 2021.03.25 |
[iOS - swift] 빈 화면 탭 시 키보드 내리는 방법 (화면 터치 시 키보드 숨김처리) (0) | 2021.03.22 |
[iOS - swift] long touch 시 개발자모드 불러오기 (0) | 2021.03.22 |
[iOS - swift] 로컬 푸시 (local notification) (5) | 2021.03.21 |
Comments