๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐ŸŽ iOS

[iOS/Swift] xib๋ฅผ ์ด์šฉํ•œ Custom UIView ๋งŒ๋“ค๊ธฐ

by ํ‹ด๋”” 2022. 4. 10.
728x90
๋ฐ˜์‘ํ˜•

UIViewController, UITableViewCell, UICollectionViewCell, UICollectionReusableView ๋“ฑ์„ 

์ƒ์† ๋ฐ›๋Š” subclass ํŒŒ์ผ์„ ์ƒ์„ฑํ•  ๋•Œ  xib๋ฅผ ํ•จ๊ป˜ ๋งŒ๋“ค ์ˆ˜ ์žˆ์ง€๋งŒ 

์•„์‰ฝ๊ฒŒ๋„ UIView๋Š” ํŒŒ์ผ ์ƒ์„ฑ์‹œ ํ•จ๊ป˜ xib๋ฅผ ๋งŒ๋“ค์–ด ์ค„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹น 

 

์šฐ์„ ์€ UIView์˜ Subclass์ธ CommonTextField๋ฅผ ์ƒ์„ฑํ•ด ์ฃผ๊ฒ ์Šต๋‹ˆ๋‹ค

์ƒˆ ํŒŒ์ผ์„ ์ถ”๊ฐ€ํ•˜๊ณ  Class ๋ช…์„ ์ž…๋ ฅํ•œ ํ›„ 

Subclass๋Š” UIView๋กœ ์ƒ์† ๋ฐ›์œผ๋ฉด ๋ฉ๋‹ˆ๋‹ค

Next๋ฅผ ๋ˆŒ๋Ÿฌ์„œ ์ง„ํ–‰ํ•ด ์ค๋‹ˆ๋‹ค.

 

์ด์ œ xib ํŒŒ์ผ์„ ์ƒ์„ฑํ•ด ์ค๋‹ˆ๋‹ค

์ƒˆ๋กœ์šด ํŒŒ์ผ์„ ์ถ”๊ฐ€ํ•˜๊ณ  User Interface ์„น์…˜์—์„œ ๋ณด์ด๋Š” View๋ฅผ ์„ ํƒํ•ด ์ฃผ๋ฉด

xib ํŒŒ์ผ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

์ €๋Š” ์ด์ „์— ์ƒ์„ฑํ•œ UIView ๋ฅผ ์ƒ์†๋ฐ›์€

CommonTextField์™€ ๋™์ผํ•˜๊ฒŒ

CommonTextField.xib๋กœ ์ง€์ •ํ•ด ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

 

๋Œ€๋ถ€๋ถ„ ์ปค์Šคํ…€ ๋ทฐ๋Š” VC์—์„œ ์ผ๋ถ€๋ถ„์„ ๋‹น๋‹นํ•˜๊ฒŒ ๋˜๊ธฐ ๋•Œ๋ฌธ์—

xib์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ณด์ด๋Š” view์˜ ์‚ฌ์ด์ฆˆ๋ฅผ ์ž์œ ์ž์žฌ๋กœ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•˜๋„๋ก ๋งŒ๋“ค์–ด ์ฃผ๊ฒ ์Šต๋‹ˆ๋‹ค

Attributes Inspector์—์„œ Size > Freeform์„ ๋ˆŒ๋Ÿฌ ์ค๋‹ˆ๋‹ค

๊ทธ๋Ÿฌ๋ฉด ์ด๋ ‡๊ฒŒ ์›ํ•˜๋Š” ์‚ฌ์ด์ฆˆ๋กœ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค

๋ชจ์„œ๋ฆฌ๋‚˜ ๊ฐ€์žฅ์ž๋ฆฌ๋ฅผ ์žก๊ณ  ์กฐ์ ˆํ•ด ์ฃผ์„ธ์š”!

๋ฐ˜๋“œ์‹œ File's Owner๋ฅผ ํ•œ๋ฒˆ ํด๋ฆญํ•ด ์ฃผ์‹œ๊ณ 

์ด์ œ ์ด๋ฏธ์ง€์— ๋‚˜์™€ ์žˆ๋Š” Help inspector๊ฐ€ ์•„๋‹ˆ๋ผ(ใ… ใ… ) 

Identity inspector(๋„ค๋ฒˆ์งธ ํƒญ)๋กœ ๊ฐ€์…”์„œ class์˜ ๋ช…์„

์ด์ „์— ์ƒ์„ฑํ–ˆ๋˜ swift ํŒŒ์ผ๋กœ ์ง€์ •ํ•ด์ฃผ์„ธ์š”~

๋งŒ์•ฝ์— xib์ด๋ฆ„์€ CommonView.xib ์ด๊ณ ,

class ์˜ ์ด๋ฆ„์€ CommonTextField.swift๋ผ๋ฉด

์ €๊ธฐ์—๋Š” CommonTextField๊ฐ€ ๋“ค์–ด๊ฐ€๋ฉด ๋˜๋Š” ๊ฑฐ์ฃ !

 

์ด๋Ÿฌ๋ฉด ๋์ด๋ƒ ํ•˜๊ธฐ ์ „์— 

File's owner์„ ์ดํ•ดํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค

 

์ธํ„ฐํŽ˜์ด์Šค ๋นŒ๋”์ธ .xib ํŒŒ์ผ์„ ์ปดํŒŒ์ผํ•˜์—ฌ nib ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

nib ํŒŒ์ผ์€ UI ๊ด€๋ จ ๊ฐ์ฒด์™€ ์†์„ฑ, ๊ฐ์ฒด๊ฐ„ ์—ฐ๊ฒฐ ์ •๋ณด๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์–ด์š”

 

์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•œ ๊ฒƒ

File's owner๋Š” 

loadNibNamed: ํ˜น์€ initWithNibName: ์„ ์ด์šฉํ•˜์—ฌ nib๋ฅผ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค

๋Ÿฐํƒ€์ž„ ๋™์•ˆ xib ํŒŒ์ผ์ด nib ํŒŒ์ผ๋กœ ์ปดํŒŒ์ผ ๋˜์–ด ๋กœ๋“œ ๋˜๋ฉด

file's owner์—์„œ ์„ค์ •ํ•œ outlet์„ ์‚ฌ์šฉํ•˜์—ฌ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ 

์„œ๋ธŒ๋ทฐ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

ํ˜„์žฌ File's owner๋กœ๋งŒ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค

File's owner๋กœ CommonTextField๋ฅผ ์„ค์ •ํ•ด ์ฃผ์—ˆ๊ธฐ ๋•Œ๋ฌธ์—

CommonTextField์—์„œ  IBAction์ด๋‚˜ IBOutlet์„ ์—ฐ๊ฒฐํ•˜์—ฌ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‚˜

loadNibNamed๋กœ ๋กœ๋“œํ•ด ์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค

 

Extension์„ ์ƒ์„ฑํ•ด ์ฃผ๊ฒ ์Šต๋‹ˆ๋‹ค

 

extension UIView {
    func loadXib() {
        // 1
        let identifier = String(describing: type(of: self))
        // 2
        let nibs = Bundle.main.loadNibNamed(identifier, owner: self, options: nil)
        // 3
        guard let customView = nibs?.first as? UIView else { return }
        // 4
        customView.frame = self.bounds
        // 5
        self.addSubview(customView)
    }
}

์ถœ์ฒ˜ : https://dongminyoon.tistory.com/50

 

[iOS] ์ปค์Šคํ…€ UIView - xib์ด์šฉํ•˜๊ธฐ (2๊ฐ€์ง€ ๋ฐฉ๋ฒ•)

iOS ๊ฐœ๋ฐœ์„ ํ•˜๋‹ค๋ณด๋ฉด UIView๋ฅผ ์ปค์Šคํ…€์œผ๋กœ ์ œ์ž‘ํ•ด์•ผํ•˜๋Š” ์ƒํ™ฉ์ด ๋งŽ์ด ์ƒ๊ธฐ์ฃ ? ๊ทธ๋•Œ ๋‹ค๋“ค ์–ด๋–ป๊ฒŒ ๊ฐœ๋ฐœํ•˜์…จ๋‚˜์š”. ์˜ค๋Š˜์€ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•๋“ค๋„ ์กด์žฌํ•˜๊ฒ ์ง€๋งŒ ์žฌ์‚ฌ์šฉ์„ ํ•˜๊ธฐ ์ข‹๊ณ  ๋”์šฑ ์ง๊ด€์ ์œผ๋กœ ๋ทฐ๋ฅผ ์•Œ์•„

dongminyoon.tistory.com

1.

ํ˜„์žฌ loadXib๋ฅผ ํ˜ธ์ถœํ•œ ํด๋ž˜์Šค์˜ ์ด๋ฆ„์„ identifier ๋ณ€์ˆ˜๋กœ ๋ฐ›์Šต๋‹ˆ๋‹ค

2. 

loadNibNamed๋กœ nib๋ฅผ ๋กœ๋“œํ•ด ์ค๋‹ˆ๋‹ค owner๋Š”

ํ˜„์žฌ ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” File's owner์ธ CommonTextField ์ด๊ณ  self๋กœ ์ง€์ •ํ•ด ์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค

3.

xib ์ธํ„ฐํŽ˜์ด์Šค ๋นŒ๋” ์•ˆ์—๋Š” ์—ฌ๋Ÿฌ๊ฐœ์˜ ๋ทฐ๋ฅผ ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

๋”ฐ๋ผ์„œ loadNibNamed๋ฅผ ํ•ด์ค„ ๋•Œ ํ•˜๋‚˜์˜ ๋ทฐ๋งŒ ๊ฐ€์ง€๊ณ  ์˜ค๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ

์ตœ์ƒ์œ„์— ์ถ”๊ฐ€ํ•ด ์ค€ ๋ทฐ๋“ค์„ array๋กœ ๊ฐ€์ง€๊ณ  ์˜ค๊ธฐ ๋•Œ๋ฌธ์—

๊ทธ ์ค‘ ์ฒซ ๋ฒˆ์งธ (์ง€๊ธˆ์€ ํ•˜๋‚˜์˜ view ๋ฐ–์— ์—†์ง€๋งŒ)๋ฅผ ๊ฐ€์ง€๊ณ  ์˜ค๋Š”๊ฑฐ์—์š”

4. 

๋ทฐ ํฌ๊ธฐ์— ๋งž์ถฐ์„œ customView์˜ ์‚ฌ์ด์ฆˆ์™€ ์œ„์น˜๋ฅผ์ง€์ •ํ•ด ์ค๋‹ˆ๋‹ค.

5. 

ํ˜„์žฌ UIView์— nib๋ฅผ ํ†ตํ•ด ๋กœ๋“œํ•œ customView ๋ฅผ ์ถ”๊ฐ€ ํ•ด ์ค๋‹ˆ๋‹ค. 

class CommonTextField: UIView {
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        self.loadXib()
    }
    
    required init?(coder: NSCoder) {
        super.init(coder: coder)
        self.loadXib()
    }
}

์ด์ œ ์ปค์Šคํ…€ ๋ทฐ๋กœ ๋Œ์•„์™€์„œ ์ด๋‹ˆ์…œ๋ผ์ด์ €์—

extension ์—์„œ ์ง€์ •ํ•œ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค

๋งˆ์ง€๋ง‰์œผ๋กœ ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•˜๋Š” VC์— 

view๋ฅผ ์ถ”๊ฐ€ํ•ด ์ฃผ์‹œ๊ณ 

Custom class๋ฅผ ์ง€์ •ํ•ด ์ฃผ์‹œ๋ฉด ์„ฑ๊ณต์ ์œผ๋กœ ๋กœ๋“œ ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด์š”

 

 

์ด ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด UIView ๊ฐ€ File's owner๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์—

์ด custom view๋ฅผ ์ƒ์„ฑํ•  UIViewController์˜ File's owner๋ฅผ ์ง€์ •ํ•ด ์ฃผ๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

์›๋ž˜ ์ง€์ •ํ•ด ์ฃผ์—ˆ๋˜ File's Owner์—์„œ ์ปค์Šคํ…€ ํด๋ž˜์Šค๋ฅผ ์ง€์›Œ ์ค๋‹ˆ๋‹ค

์ง€์šฐ๊ณ  ์—”ํ„ฐ ๋ˆ„๋ฅด๊ธฐ!

๋ทฐ๋ฅผ ๋ˆ„๋ฅด๊ณ  ์ธ์ŠคํŽ™ํ„ฐ๋กœ ๋Œ์•„๊ฐ€์„œ

์ปค์Šคํ…€ ํด๋ž˜์Šค๋ฅผ ์ง€์ •ํ•ด ์ค๋‹ˆ๋‹ค

class CommonTextField: UIView {
    
    override init(frame: CGRect) {
        super.init(frame: frame)
//        self.loadXib()
    }
    
    required init?(coder: NSCoder) {
        super.init(coder: coder)
//        self.loadXib()
    }
}

์ด๋‹ˆ์…œ๋ผ์ด์ €์—์„œ ํ˜ธ์ถœํ–ˆ๋˜ ์ต์Šคํ…์…˜ ํ•จ์ˆ˜๋ฅผ ์ฃผ์„ ์ฒ˜๋ฆฌํ•ด ์ฃผ์„ธ์š”

VC์™€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค ๋นŒ๋”์— ์ถ”๊ฐ€ํ•ด ์ค€ ๋ทฐ์˜ 

Custom class ๋„ ์ง€์›Œ์ค๋‹ˆ๋‹ค

๊ทธ๋ฆฌ๊ณ  ์ด ๋ทฐ๋ฅผ VC์— IBOutlet์œผ๋กœ ์—ฐ๊ฒฐํ•ด ์ฃผ์„ธ์š”

@IBOutlet weak var customView: UIView!
class RegisterFirstViewController: UIViewController {

    @IBOutlet weak var customView: UIView!
    
    override func viewDidLoad() {
        super.viewDidLoad()

        let nibs = Bundle.main.loadNibNamed("CommonTextField", owner: self)
        guard let commonTextField = nibs?.first as? CommonTextField else {
            return
        }
        
        commonTextField.frame = customView.bounds
        customView.addSubview(commonTextField)
    }
}

์ด์ œ ์ด custom UIView๋ฅผ ํ•„์š”๋กœ ํ•˜๋Š” VC์—์„œ 

ํ•„์š”ํ•œ ๊ณณ์— ๋กœ๋“œํ•ด ์ฃผ๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด File's Owner๋ฅผ VC๊ฐ€ ๊ฐ€์ ธ๊ฐˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

 

custom class ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค -> xib ํŒŒ์ผ์„ ์ƒ์„ฑํ•œ๋‹ค -> nib ํŒŒ์ผ๋กœ ๋กœ๋“œํ•œ๋‹ค 

์ด๋ ‡๊ฒŒ ์ •๋ฆฌํ•˜์‹œ๋ฉด ๋ ๊ฑฐ ๊ฐ™์•„์š”

 

ํ˜น์‹œ ๋ฌธ์ œ๊ฐ€ ์žˆ๊ฑฐ๋‚˜ ํ‹€๋ฆฐ ๋ถ€๋ถ„์ด ์žˆ๋‹ค๋ฉด ์–ธ์ œ๋“ ์ง€ ์•Œ๋ ค์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค!


์ฐธ๊ณ  ๋„์„œ ๋ฐ ์‚ฌ์ดํŠธ


 

https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/LoadingResources/CocoaNibs/CocoaNibs.html

 

https://velog.io/@lena_/UINib

 

https://stackoverflow.com/questions/15251370/what-is-the-files-owner-in-interface-builder

 

 

 

728x90
๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€