UIView: layoutSubviews vs initWithFrame

При подклассификации UIView я обычно UIView все свои инициализации и макет кода в свой метод init . Но мне сказали, что код макета должен быть сделан путем переопределения layoutSuviews . Там есть сообщение, которое объясняет, когда каждый метод вызван, но я хотел бы знать, как использовать их на практике.

В настоящее время я поместил весь свой код в метод init , например:

MyLongView.m

 - (id)initWithHorizontalPlates:(int)theNumberOfPlates { self = [super initWithFrame:CGRectMake(0, 0, 768, 1024)]; if (self) { // Initialization code _numberOfPlates = theNumberOfPlates; UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:self.frame]; [scrollView setContentSize:CGSizeMake(self.bounds.size.width* _numberOfPlates, self.bounds.size.height)]; [self addSubview:scrollView]; for(int i = 0; i < _numberOfPlates; i++){ UIImage *img = [UIImage imageNamed:[NSString stringWithFormat:@"a1greatnorth_normal_%d.jpg", i+1]]; UIImageView *plateImage = [[UIImageView alloc] initWithImage:img]; [scrollView addSubview:plateImage]; plateImage.center = CGPointMake((plateImage.bounds.size.width/2) + plateImage.bounds.size.width*i, plateImage.bounds.size.height/2); } } return self; } 

Это обычные задачи: настройка рамы представления, инициализация ivar, настройка scrollview, инициализация UIImages, размещение их в UIImageViews, их выкладка.

Мой вопрос: какой из них должен выполняться в init , и какой из них должен выполняться в layoutSubviews ?

2 Solutions collect form web for “UIView: layoutSubviews vs initWithFrame”

Ваш init должен создать все объекты с необходимыми данными. Любой кадр, который вы передаете им в init, в идеале должен быть их исходными позициями.

Затем в layoutSubviews :, вы меняете рамки всех своих элементов, чтобы поместить их туда, куда они должны идти. В layoutSubviews не должно быть выделение или init'ing: только изменение их позиций, размеров и т. Д. …

В случае, если вы выполняете автореализацию, вы можете просто использовать init, чтобы настроить весь вид, просто используя autoresizingFlags или автозапуск.

Но в целом вы должны делать макет в layoutSubviews, так как это будет вызываться при каждом изменении ракурса представлений и в другой ситуации, когда макет нужен снова. Иногда вы просто не знаете конечный кадр представления внутри init, поэтому вам нужно быть гибким, как упомянуто, или использовать layoutSubviews, так как вы делаете макет там после того, как окончательный размер был установлен.

Как упоминалось WDUK, все инициализирующий код / ​​создание объекта должны быть в вашем методе init или в любом месте, но не в layoutSubviews.

  • Как иметь обработчик для повторения UIView animateWithDuration?
  • UIViewController предотвращает просмотр с разгрузки
  • Захват UIView без использования renderInContext:
  • iOS, Xamarin, UIView, Draw, динамическая анимация не работает
  • IOS 9 - UIButton на subview не запускает выход IBAction
  • ios - Вид уменьшается при уменьшении
  • Использование размытого фона с помощью раскадровки в iOS
  • iOS CGRect находится внутри другого CGRect
  • UIView.animateWithDuration изменение в Xcode 6 Beta 5
  • Отображение HUD, в то время как изображение уменьшено по размеру
  • Как сделать полупрозрачный UIViewController
  • PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.