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

[iOS/UI] ์ปค์Šคํ…€ XIB UIView ์ ์šฉํ•ด๋ณด๊ธฐ (UITableView,UICollectionView ํฌํ•จ)

by Fomagran ๐Ÿ’ป 2021. 2. 18.
728x90
๋ฐ˜์‘ํ˜•

์•ˆ๋…•ํ•˜์„ธ์š” Foma ์ž…๋‹ˆ๋‹ค!

 

์š”์ฆ˜ ๋“ค์–ด ๋‚ ์”จ ๋„์šฐ๊ธฐ๋ฅผ ๊ณต๋ถ€ํ•˜๊ณ  ์žˆ๋Š”๋ฐ์š”.

 

์Šคํฌ๋กค๋ทฐ์— ์ปค์Šคํ…€ํ•œ UIView๋ฅผ ๋„ฃ๊ธฐ ์œ„ํ•ด์„œ xib๋กœ ๋”ฐ๋กœ ๋ ˆ์ด์•„์›ƒ์„ ์žก์•„์„œ ๋งŒ๋“ค๊ณ  ์ ์šฉํ–ˆ๋Š”๋ฐ์š”.

 

์ด ๊ณผ์ •์„ ์ •๋ฆฌํ•ด๋†“๊ณ  ๊ณต์œ ํ•ด๋“œ๋ฆฌ๊ณ  ์‹ถ์–ด์„œ ๊ธ€์„ ์ ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค!

 

๋ฐ”๋กœ ์‹œ์ž‘ํ• ๊ฒŒ์š”~


Preview

 

์ œ๊ฐ€ ๋งŒ๋“ค๊ณ ์‹ถ์€ ํ™”๋ฉด ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

ScrollVIew ์œ„์— ์ปค์Šคํ…€ํ•œ UIView๋ฅผ ์–น์–ด์„œ ์Šคํฌ๋กค์ด ์ขŒ์šฐ๋กœ ๋˜๊ฒŒ๋” ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

 

UIView์—๋Š” ํ…Œ์ด๋ธ”๋ทฐ์™€ ์ปฌ๋ ‰์…˜๋ทฐ๋„ ๋“ค์–ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

 ๋จผ์ € WeatherView๋ผ๋Š” UIView Swift ํŒŒ์ผ๊ณผ xib ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด์ค๋‹ˆ๋‹ค.

 

 

xib ํŒŒ์ผ์„ ๋งŒ๋“œ๋Š” ๋ฒ•์€ new File์—์„œ User Interface์—์„œ View๋ฅผ ๊ณจ๋ผ์ฃผ์‹œ๊ณ  ์ƒ์„ฑํ•ด์ฃผ์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 


Xib

 

xibํŒŒ์ผ์—์„œ ์›ํ•˜์‹œ๋Š” ๋ ˆ์ด์•„์›ƒ์„ ์„ค์ •ํ•ด์ฃผ์„ธ์š”!

 

 

์ €๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ธํŒ…ํ–ˆ์Šต๋‹ˆ๋‹ค.

728x90

 

 

์ฃผ์˜ํ•˜์‹ค์ ์€ xibํŒŒ์ผ์˜ ์™ผ์ชฝ ๋ถ€๋ถ„์— File's Owner๊ฐ€ ๋ณด์ด์‹ค๊ฑฐ์—์š”.

 

์ด๊ฑธ ํด๋ฆญํ•ด์ฃผ์‹  ๋’ค์—

 

 

Custom Class ์ด๋ฆ„๊ณผ File's Owner Class ์ด๋ฆ„์„ WeatherView๋กœ ํ•ด์ฃผ์„ธ์š”!

 


WeatherView

 

WeatherView์— ๋ชจ๋‘ ์—ฐ๊ฒฐํ•ด์ฃผ๊ณ  ์•„๋ž˜์™€ ๊ฐ™์ด ์ดˆ๊ธฐํ™”๋ฅผ ํ•ด์ค๋‹ˆ๋‹ค.

class WeatherView: UIView {

    //MARK:IBOutlets
    
    @IBOutlet weak var cityLabel: UILabel!
    @IBOutlet weak var dataLabel: UILabel!
    @IBOutlet weak var tempLabel: UILabel!
    @IBOutlet weak var weatherInfoLabel: UILabel!
    @IBOutlet weak var weeklyTableView: UITableView!
    @IBOutlet weak var hourlyInfoCollectionView: UICollectionView!
    @IBOutlet weak var hourlyCollectionView: UICollectionView!
    
    //MARK:LifeCycle
    
    override init(frame: CGRect) {
        super.init(frame: frame)

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

WeatherViewController

 

์ด UIView๋ฅผ ๋„์šฐ๊ธฐ ์œ„ํ•œ WeatherViewController๋ฅผ ๋งŒ๋“ค์–ด์ฃผ์„ธ์š”!

 

 

viewDidLoad()์— ์•„๋ž˜์™€ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ๋ถ™์—ฌ๋„ฃ์–ด์ค๋‹ˆ๋‹ค.

 

์ €๋Š” scrollView์— addSubView ํ•˜๋Š”๊ฑฐ๋ผ scrollView๋กœ ํ–ˆ๋Š”๋ฐ view์— ์ ์šฉํ•˜์‹ค๋ถ„๋“ค์€ scrollView๋งŒ view๋กœ ๋ฐ”๊ฟ”์ฃผ์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

    override func viewDidLoad() {
        super.viewDidLoad()
        
        guard let weatherView = Bundle.main.loadNibNamed("WeatherView", owner: self, options: nil)?.first as? WeatherView else { return}
        weatherView.frame = CGRect(x: 0, y: 0, width: scrollView.bounds.width, height: scrollView.bounds.height)
        scrollView.addSubview(weatherView)
        
        //view์— ๋„ฃ์„๋• ์•„๋ž˜์™€ ๊ฐ™์ด ํ•ด์ฃผ์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.
//        weatherView.frame = CGRect(x: 0, y: 0, width: view.bounds.width, height: view.bounds.height)
//        self.view.addSubview(weatherView)
    }

Bonus

 

์œ„์™€ ๊ฐ™์ด UIView์— ์ปฌ๋ ‰์…˜๋ทฐ์™€ ํ…Œ์ด๋ธ”๋ทฐ๋ฅผ ๋„์šฐ๊ธฐ ์œ„ํ•ด์„ 

 

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ธํŒ…์„ ํ•ด์ฃผ์…”์•ผํ•ฉ๋‹ˆ๋‹ค.

 

์›ํ•˜์‹œ๋Š” tableView or CollectionView๋ฅผ

 

register(UINib(nibName:ํ…Œ์ด๋ธ”๋ทฐ์…€์ด๋ฆ„,bundle:Bundle.main),forCellReuseIdentifie:์…€์•„์ด๋ดํ‹ฐํ”ผ์–ด)๋กœ ํ•ด์ค๋‹ˆ๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  ๋ฐ˜๋“œ์‹œ ํ…Œ์ด๋ธ”๋ทฐ or ์ปฌ๋ ‰์…˜๋ทฐ์˜ dataSource๋ฅผ self๋กœ ํ•ด์ฃผ์„ธ์š”

 

class WeatherView: UIView {

    //MARK:IBOutlets
    
    @IBOutlet weak var cityLabel: UILabel!
    @IBOutlet weak var dataLabel: UILabel!
    @IBOutlet weak var tempLabel: UILabel!
    @IBOutlet weak var weatherInfoLabel: UILabel!
    @IBOutlet weak var weeklyTableView: UITableView!
    @IBOutlet weak var hourlyInfoCollectionView: UICollectionView!
    @IBOutlet weak var hourlyCollectionView: UICollectionView!
    
    //MARK:LifeCycle
    
    override init(frame: CGRect) {
        super.init(frame: frame)
    }
    
    required init?(coder: NSCoder) {
        super.init(coder: coder)
      
    }
    
    
    func setupTableView() {
        weeklyTableView.register(UINib(nibName: "WeeklyTableViewCell", bundle: Bundle.main), forCellReuseIdentifier: "Cell")
        weeklyTableView.dataSource = self
    }
    
    func setupCollectionView(){
        hourlyCollectionView.register(UINib(nibName: "HourlyCollectionViewCell", bundle: Bundle.main), forCellWithReuseIdentifier: "Cell")
        hourlyCollectionView.dataSource = self
        
        hourlyInfoCollectionView.register(UINib(nibName: "HourlyInfoCollectionViewCell", bundle: Bundle.main), forCellWithReuseIdentifier: "Cell")
        hourlyInfoCollectionView.dataSource = self
    }

๊ทธ๋ฆฌ๊ณค ๋‹ค์‹œ WeatherViewController๋กœ ์ด๋™ํ•ด์„œ 

 

์•„๋ž˜์™€ ๊ฐ™์ด ๋งŒ๋“ค์–ด์ค€ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰์‹œ์ผœ์ค๋‹ˆ๋‹ค.

 


WeatherViewController

 

        guard let weatherView = Bundle.main.loadNibNamed("WeatherView", owner: self, options: nil)?.first as? WeatherView else { return}
        weatherView.frame = CGRect(x: 0, y: 0, width: scrollView.bounds.width, height: scrollView.bounds.height)
        weatherView.setupTableView()
        weatherView.setupCollectionView()
        scrollView.addSubview(weatherView)

 

์ด๋ ‡๊ฒŒ ์‹คํ–‰ํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ํ™”๋ฉด์ด ์ •์ƒ์ ์œผ๋กœ ๋œจ๋Š”๊ฑธ ๋ณผ ์ˆ˜ ์žˆ์„๊ฑฐ์—์š”!

 


P.S

์ฒ˜์Œ์— WeatherView์˜ override init์—์„œ WeatherViewController์—์„œ ํ•˜๋Š” ๊ณผ์ •๋“ค์„ ๋„ฃ์—ˆ๋‹ค.

 

๊ทธ๋Ÿฐ๋ฐ ๊ณ„์† required init์—์„œ fatalError๊ฐ€ ๋‚˜๊ณ  ๊ทธ๋ƒฅ fatalError๋ฅผ ๋นผ๋ฒ„๋ฆฌ๊ณ  ํ•˜๋‹ˆ๊น tableView์—์„œ ์—๋Ÿฌ๊ฐ€ ๋‚˜๊ณ  ๊ทธ๋žฌ๋‹ค.

 

๊ฒฐ๊ตญ ViewController์—์„œ loadnibNamed๋ฅผ ํ•ด์ฃผ๊ณ  tableView,collectionView register ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰์‹œ์ผœ์ฃผ๋‹ˆ ์—๋Ÿฌ๊ฐ€ ํ•ด๊ฒฐ๋๋‹ค.

728x90
๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€