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 ?

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

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

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

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

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

  • UIScrollView не отвечает
  • Новая четкая карта места
  • iPhone, как реализовать «широкий» UITableViewCell?
  • Обнаружение нижней части UIScrollview
  • Вид прокрутки iOS позволяет прокручивать предыдущее содержимое
  • UIScrollView с разбивкой по страницам + отображение части предыдущей / следующих страниц
  • Как я могу заставить UIAlertView отображать полное сообщение без прокрутки в ландшафтном режиме?
  • UICollectionViewCell, встроенный в UITableViewCell, изменяет положение прокрутки при повторном появлении
  • UIPageControl не отображается в сочетании с UIScrollView
  • Маршрутное сенсорное событие для просмотра под UIScrollView, если жестом салфетки не распознается - например, приложение iPad Twitter
  • Автоматическая компоновка iOS 7 - Невозможно выровнять правое подзону справа от UIScrollView
  • Interesting Posts

    изображение в рамке круга iOS

    Отзывчивый дизайн, когда страница загружается в веб-представление приложения iOS

    Преобразование содержимого UIWebview в UIImage, когда веб-просмотр больше экрана

    В какой версии LLVM и XCode мне нужно использовать массивный синтаксис Array в Objective-C?

    Обработка новых размеров экрана iPhone с фоновым изображением

    Ошибка локализации в панели Dev

    Запрос API Google Place Picker для мест с приложениями?

    Жизненный цикл объекта с методом, получающим блок, под ARC

    Рамка не найдена GoogleToolboxForMac

    TBXML-анализ синтаксического анализа xml в массив

    Не удается получить местоположение в iOS (код GEOErrorDomain = -204)

    IOS 7.1, Ограничения обычной ширины на универсальном раскадровке игнорируются, если целевое семейство устройств установлено на iPad

    Как создать пользовательский UICollectionViewCell и добавить изображение из URL-адреса на него?

    конвертировать UIImage в NSData

    Восстановить сопряженные устройства, подключенные через Bluetooth в iOS

    Давайте будем гением компьютера.