Повторное использование 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
- выберите xib
- выбрать владельца файла
- установить индивидуальный class в «DesignableXibView» в Identity Inspector.
- Примечание. Не устанавливайте пользовательский 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 —- Проверьте свое повторное использование в раскадровке
- Откройте раскадровку
- Добавить просмотр
- Установите пользовательский class этого вида
- подождите секунду … BOOM !!
NEW! обновленный ответ с возможностью визуализации непосредственно в раскадровке (и быстро!)
Работает в Xcode 6.3.1
Создайте новый UIView с именем ‘ReuseableView’
- File> New> File> Source> Cocoa Touch Class> UIView
Создайте соответствующий xib-файл с именем «ReuseableView»
- Файл> Создать> Файл> Пользовательский интерфейс> Просмотр
Установите владельца файла xib
- выберите xib
- выбрать владельца файла
-
установите специальный class в «ReusableView» в Identity Inspector.
- Примечание. Не устанавливайте пользовательский class представления на xib. Только владелец файла!
Сделайте вывод из представления в ReuseableView.xib интерфейсу ReuseableView.h
- Открыть помощник редактора
- Управление + Перетаскивание из представления в интерфейс
Добавьте реализацию 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; }
Протестируйте свое повторно используемое представление в раскадровке
- Откройте раскадровку
- Добавить просмотр
- Установите пользовательский 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])) }