Повторное использование xiv в раскадровке

Обычно мне нравится создавать и разрабатывать мои uiviews в построителе интерфейса. Иногда мне нужно создать единый вид в xib, который можно повторно использовать в нескольких controllerах представлений в раскадровке.

    Повторное использование и рендеринг xib в раскадровке.

    Протестировано с помощью Swift 2.2 и Xcode 7.3.1

    1 —- Создайте новый UIView с именем ‘DesignableXibView’

    • File> New> File> Source> Cocoa Touch Class> UIView

    2 —- Создайте соответствующий файл xib с именем ‘DesignableXibView’

    • Файл> Создать> Файл> Пользовательский интерфейс> Просмотр

    3 —- Установите владельца файла xib

    1. выберите xib
    2. выбрать владельца файла
    3. установить индивидуальный class в «DesignableXibView» в Identity Inspector.

    Установка владельца Xib в пользовательский класс

    • Примечание. Не устанавливайте пользовательский class представления на xib. Только владелец файла!

    4 —- Внедрение DesignableXibView

    // DesignableXibView.swift import UIKit @IBDesignable class DesignableXibView: UIView { var contentView : UIView? override init(frame: CGRect) { super.init(frame: frame) xibSetup() } required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) xibSetup() } func xibSetup() { contentView = loadViewFromNib() // use bounds not frame or it'll be offset contentView!.frame = bounds // Make the view stretch with containing view contentView!.autoresizingMask = [UIViewAutoresizing.FlexibleWidth, UIViewAutoresizing.FlexibleHeight] // Adding custom subview on top of our view (over any custom drawing > see note below) addSubview(contentView!) } func loadViewFromNib() -> UIView! { let bundle = NSBundle(forClass: self.dynamicType) let nib = UINib(nibName: String(self.dynamicType), bundle: bundle) let view = nib.instantiateWithOwner(self, options: nil)[0] as! UIView return view } } 

    5 —- Проверьте свое повторное использование в раскадровке

    1. Откройте раскадровку
    2. Добавить просмотр
    3. Установите пользовательский class этого вида
    4. подождите секунду … BOOM !!

    Xib-рендеринг внутри контроллера просмотра раскадровки

    NEW! обновленный ответ с возможностью визуализации непосредственно в раскадровке (и быстро!)

    Работает в Xcode 6.3.1

    Создайте новый UIView с именем ‘ReuseableView’

    • File> New> File> Source> Cocoa Touch Class> UIView

    Создайте соответствующий xib-файл с именем «ReuseableView»

    • Файл> Создать> Файл> Пользовательский интерфейс> Просмотр

    Установите владельца файла xib

    1. выберите xib
    2. выбрать владельца файла
    3. установите специальный class в «ReusableView» в Identity Inspector. введите описание изображения здесь

      • Примечание. Не устанавливайте пользовательский class представления на xib. Только владелец файла!

    Сделайте вывод из представления в ReuseableView.xib интерфейсу ReuseableView.h

    1. Открыть помощник редактора
    2. Управление + Перетаскивание из представления в интерфейс

    введите описание изображения здесь

    Добавьте реализацию initWithCoder для загрузки представления и добавления в качестве подзапроса.

     - (id)initWithCoder:(NSCoder *)aDecoder{ self = [super initWithCoder:aDecoder]; if (self) { // 1. load the interface [[NSBundle mainBundle] loadNibNamed:NSStringFromClass([self class]) owner:self options:nil]; // 2. add as subview [self addSubview:self.view]; // 3. allow for autolayout self.view.translatesAutoresizingMaskIntoConstraints = NO; // 4. add constraints to span entire view [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[view]|" options:0 metrics:nil views:@{@"view":self.view}]]; [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[view]|" options:0 metrics:nil views:@{@"view":self.view}]]; } return self; } 

    введите описание изображения здесь

    Протестируйте свое повторно используемое представление в раскадровке

    1. Откройте раскадровку
    2. Добавить просмотр
    3. Установите пользовательский class этого вида

    введите описание изображения здесь

    Бегите и наблюдайте! введите описание изображения здесь

    Свифт 3 и 4 Обновление до принятого ответа

    1. Создайте новый UIView с именем ‘DesignableXibView’

    • File> New> File> Source> Cocoa Touch Class> UIView

    2. Создайте соответствующий xib-файл с именем «DesignableXibView»

    • Файл> Создать> Файл> Пользовательский интерфейс> Просмотр

    3. Установите владельца файла xib

    Выберите «DesignableXibView.xib»> «Владелец файла»> установите «Пользовательский class» в «DesignableXibView» в Identity Inspector.

    • Примечание. Не устанавливайте пользовательский class представления на xib. Только владелец файла!

    4. Внедрение DesignableXibView

      import UIKit @IBDesignable class DesignableXibView: UIView { var contentView : UIView! override init(frame: CGRect) { super.init(frame: frame) xibSetup() } required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) xibSetup() } func xibSetup() { contentView = loadViewFromNib() // use bounds not frame or it'll be offset contentView.frame = bounds // Make the view stretch with containing view contentView.autoresizingMask = [UIViewAutoresizing.flexibleWidth, UIViewAutoresizing.flexibleHeight] // Adding custom subview on top of our view (over any custom drawing > see note below) addSubview(contentView) } func loadViewFromNib() -> UIView! { let bundle = Bundle(for: type(of: self)) let nib = UINib(nibName: String(describing: type(of: self)), bundle: bundle) let view = nib.instantiate(withOwner: self, options: nil).first as! UIView return view } } 

    5 Протестируйте свое многоразовое представление в раскадровке

    • Откройте раскадровку

    • Добавить просмотр

    • Установите пользовательский class этого вида

    Функция initWithCoder в swift 2, если у кого-то возникают проблемы с переводом:

     required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) UINib(nibName: String(self.dynamicType), bundle: NSBundle.mainBundle()).instantiateWithOwner(self, options: nil) self.addSubview(view) self.view.translatesAutoresizingMaskIntoConstraints = false self.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|[view]|", options: NSLayoutFormatOptions.AlignAllCenterY , metrics: nil, views: ["view": self.view])) self.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|[view]|", options: NSLayoutFormatOptions.AlignAllCenterX , metrics: nil, views: ["view": self.view])) } 
    Давайте будем гением компьютера.