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 |
Tags
- 리펙토링
- UICollectionView
- collectionview
- combine
- swift documentation
- Human interface guide
- RxCocoa
- 스위프트
- 리펙터링
- HIG
- Clean Code
- tableView
- ribs
- Xcode
- map
- Observable
- 클린 코드
- MVVM
- ios
- uiscrollview
- rxswift
- swiftUI
- Refactoring
- uitableview
- Protocol
- 리팩토링
- UITextView
- 애니메이션
- SWIFT
- clean architecture
Archives
- Today
- Total
김종권의 iOS 앱 개발 알아가기
[iOS - swift] Custom View (xib) 본문
.xib파일과 .swift파일 생성
//
// MyView.swift
// TestSwfit
//
// Created by 김종권 on 2020/11/01.
// Copyright © 2020 jongkwon kim. All rights reserved.
//
import Foundation
import UIKit
@IBDesignable
class MyView: UIView {
}
.xib파일에서 UI기본 설정
(초기화면)
- FIle's Owner에 클래스 정의
- Safe Area 체크 해제
- Size를 Freeform으로 설정
- 드래그하여 크기 조절 후 디자인 커스텀 (하단의 검은색 bar는 다른 파일 클릭한 다음 다시 이 파일 클릭하면 사라짐)
MyView.swift 코드 작성
- xib, nib 파일 개념 참고: ios-development.tistory.com/311
//
// MyView.swift
// TestSwfit
//
// Created by 김종권 on 2020/11/01.
// Copyright © 2020 jongkwon kim. All rights reserved.
//
import Foundation
import UIKit
@IBDesignable
class MyView: UIView {
override init(frame: CGRect) {
super.init(frame: frame)
xibSetup()
}
override func prepareForInterfaceBuilder() {
super.prepareForInterfaceBuilder()
// xibSetup() // 하면 storyboard에서 실시간(컴파일타임)에 inspector창에서 변경해도 확인 불가
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
xibSetup()
}
func xibSetup() {
guard let view = loadViewFromNib(nib: "MyView") else {
return
}
view.frame = bounds
view.autoresizingMask = [.flexibleWidth, .flexibleHeight]
addSubview(view)
}
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
}
}
- 결과 (.storyboard에서 UIView를 배치한 후 class설정 하면 완료)
custom view - @IBOutlet 커스텀 다루는 방법
- View안에 시간정보가 있는 커스텀 뷰 만들기
- nib 객체를 통해 UIView를 얻은 후 이 객체에 대해 @IBOutlet 적용 -> 현재 View에 가득 채우면 완성
@IBDesignable
class MainView: UIView {
@IBOutlet weak var lblRemainMinute: UILabel!
@IBInspectable
var remainTime: String = "남은시간 5분" {
didSet {
lblRemainMibute.text = remainTime
}
}
override init(frame: CGRect) {
super.init(frame: frame)
loadViewFromNib()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
loadViewFromNib()
}
override func prepareForInterfaceBuilder() {
super.prepareForInterfaceBuilder()
}
func loadViewFromNib() {
let bundle = Bundle(for: type(of: self))
let nib = UINib(nibName: RemainMinuteView.className, bundle: bundle)
let view = nib.instantiate(withOwner: self, options: nil)[0] as! UIView
view.frame = bounds
view.autoresizingMask = [.flexibleWidth, .flexibleHeight]
view.layer.cornerRadius = view.bounds.height / 2
view.clipsToBounds = true
self.addSubview(view)
self.view.backgroundColor = .clear
}
}
// commonExtension
extension NSObject {
var className: String {
return String(describing: type(of: self))
}
}
* 사용 시 주의사항:
- 적절한 anchor를 사용해야 동적으로 변하는 뷰 구현 가능 (아래 링크 참고)
- width, height에 관한 constraint를 주지 않고 intrinsic size로 사용하여 내부 내용에 따라 동적으로 크기가 변할 수도록 사용
'iOS 응용 (swift)' 카테고리의 다른 글
[Deeplink] 딥링크 (URL Scheme, Universal Link) (0) | 2020.11.07 |
---|---|
Xcode 불필요한 캐시를 안정적으로 삭제 (0) | 2020.11.01 |
[iOS - swift] custom cell(일반 cell, Header cell), Hugging, Compression (0) | 2020.11.01 |
[iOS - swift] Nib, File's Owner, First Responder 개념 (0) | 2020.11.01 |
[iOS - swfit] Codable 사용방법 (Encode, Decode) (0) | 2020.10.18 |
Comments