Авто макет против размеров кадра

Поэтому мне немного неловко спрашивать об этом, потому что это кажется таким рудиментарным, но с тех пор, как я начал разрабатывать iOS (около года самостоятельного обучения в интернете), когда я не использовал раскадровки, я сильно полагался на размеры кадров и очень экономно использовал автоматическую разметку. В Objective C я оказываюсь в ситуации, когда мне нужно чаще использовать Auto Layout, но с помощью Swift я могу анимировать происхождение фрейма x и y, его центр и т. Д. Я никогда не сталкивался с ситуацией, когда я не мог выполнить то, что я хочу только с размерами кадра и расположением пикселей, и я сделал довольно сложную работу с видом. Мой вопрос заключается в том, каковы преимущества использования автоматической компоновки, а не размеров кадра и расположения пикселей? Я не хотел бы упустить некоторые большие преимущества производительности из-за невежества и привычки. Спасибо!

4 ответа

Решение

tl;dr Узнайте, как использовать Auto Layout - это огромная экономия времени для реальных приложений!

Длинный ответ:

Наконец, вам решать, хотите ли вы использовать такие функции, как Auto Layout или Size Classes, которые предоставляет Apple. Основное их преимущество - не совсем производительность с точки зрения визуализации пользовательского интерфейса в конечном продукте. Это время, когда вам нужно подумать о всех крайних случаях, если вы планируете разработать приложение, которое работает на экранах разных размеров и ориентаций.

Допустим, вы хотите выполнить всю работу, необходимую для поддержки размера экрана iPhone 4/4s, размера экрана iPhone 5/5s, размера экрана iPhone 6/6s (Plus) и размера экрана iPad, а также портретного и альбомного режимов для всех режимов. Вы выше размеров экрана сами ( вот хороший обзор): Ну, в этом нет ничего плохого, просто сделайте это. Тогда вам, конечно, нужно будет очень тщательно протестировать вещи, а также всегда обновлять этот список - в каждом приложении вы используете свое собственное решение. Если это для вас, сделайте это.

Но большинство людей хотят выдвинуть свои идеи, не слишком много борясь с такими вещами, как экран другого размера. Вы, конечно, могли бы извлечь свою собственную логику из одного приложения, чтобы использовать ее во всех своих приложениях, и это именно то, о чем говорят Auto Layout и Screen Sizes. Проще говоря, Apple выполнила всю работу по настройке фрейма на разных экранах. Вам просто нужно использовать их новый словарь (ограничения), чтобы он работал.

Другими словами: это слой абстракции поверх обработки непосредственно с помощью логики рендеринга экрана. Если вам не нравится это, отпустите. Но если вы планируете создавать серьезные приложения, которые должны работать на разных поколениях iPhone / iPad, а также поддерживать их, то, пожалуйста, узнайте, как работать с классами Auto Layout и Size. Это сэкономит вам и всем будущим сопровождающим довольно много времени в разработке.

Хорошей отправной точкой являются документы. Или учебник, как этот на raywenderlich.com.

Apple говорит следующее об этой трудности сами (в документах, связанных выше):

Во многих отношениях программное определение фрейма представления обеспечивает большую гибкость и мощность. Когда происходит изменение, вы можете буквально вносить любые изменения, которые вы хотите. Тем не менее, поскольку вы также должны сами управлять всеми изменениями, разработка простого пользовательского интерфейса требует значительных усилий для разработки, отладки и обслуживания. Создание действительно адаптивного пользовательского интерфейса увеличивает сложность на порядок.

Кстати: нет никакой разницы в использовании Auto Layouts или Frames в отношении языка программирования: и Swift, и Objective-C отлично поддерживают оба способа. Кажется, вы просто еще не узнали, как менять кадры в Obj-C.;)

Еще одна вещь: вам также не нужно использовать раскадровки для использования Auto Layout. Вы можете использовать Auto Layout из кода. Смотрите документы здесь. Есть даже множество фреймворков, пытающихся сделать это проще (оригинальные API от Apple, как правило, не очень красивы во многих отношениях), я могу порекомендовать SnapKit.

Опираясь на размеры кадра равняется вычислению размеров. При использовании процентов или пропорций, он может работать на разных моделях телефонов, но все еще может выглядеть иногда странно на нескольких разрешениях. Затем вы бы добавили еще один условный оператор, потому что, например, на iPhone 4s вы бы хотели немного другой макет. Ваш код становится все более сложным и может привести к тому, что любое изменение представляет собой риск. Это выполнимо, но зачем изобретать велосипед?

Такие инструменты, как базовые ограничения, заменяют иногда действительно огромные логические блоки для макетов. Логика сжатия одной метки, когда расширяется вторая, означает несколько операций if. Подумайте о 10 ярлыках. С добавлением классов размеров, включением / отключением ограничений, сжатием и объятиями автоматическое расположение стало для меня незаменимым, и я бы посоветовал взглянуть на него, поскольку большинство компаний используют его, если не в раскадровках, то в Xibs или в код, но с автоматической разметкой.

iOS на основе фреймов против AutoLayout

Frame-based- позиционирование через (х, у, с, высота). Расчетов и вариантов в многоэкранной ситуации очень много.

Autoresizing Masksповедение изменения размера представления на основе родительского представления. Добавляет немного динамики

      view.autoresizingMask = [.flexibleRightMargin]

Auto Layout- использует ограничения для установки отношений между представлениями. Рамка представления рассчитывается динамически на основе ограничений


      view.translatesAutoresizingMaskIntoConstraints = false // false for autolayout

view.topAnchor.constraint(equalTo: parentView.topAnchor, constant: 16).isActive = true

AutoLayout используется в UITableViewс UITableView.automaticDimensionв func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloatкоторые позволяют вам не заботиться о высоте просмотра.

Также установите ограничение, когда представление уже было добавлено в представление для печати.

      parentView.addSubview(view)
view.topAnchor.constraint(equalTo: self.topAnchor, constant: 16).isActive = true

или вы получаете

      Terminating app due to uncaught exception 'NSGenericException', reason: 'Unable to activate constraint with anchors <> because they have no common ancestor. Does the constraint or its anchors reference items in different view hierarchies? That's illegal.'

Auto Layout был разработан, чтобы позволить программистам писать программы для iOS для экранов и представлений произвольных размеров. Ранее для первых четырех поколений iPhone разработчики iOS могли ориентировать свои разработки на один размер экрана, но, как показала недавняя история, Apple открыта для создания аппаратных средств различных форм и размеров. Автоматическая разметка предоставляет удобный способ создания пользовательского интерфейса, который можно адаптировать к различным размерам экрана и вида. Можно ли разработать пользовательский интерфейс без автоматического макета, который будет использовать преимущества различных размеров представления? Да. Но для создания действительно изменяемых размеров представлений с несколькими элементами пользовательского интерфейса, как правило, программистам приходится прибегать к определению размера элемента относительно другого элемента пользовательского интерфейса, который сам по себе должен был иметь размеры и расположение. Например:

NSString *nameString = [NSString stringWithFormat:@"%@", self.name];
        CGSize nameSize = [nameString sizeWithAttributes:attribs];

        [nameString drawAtPoint:CGPointMake(self.bounds.size.width*0.5-nameSize.width*0.5, IMAGE_INSET+4*CONTENT_BUFFER(self.bounds.size.height)+facePicHeight) withAttributes:attribs];

        questionFont = [UIFont systemFontOfSize:self.bounds.size.height*0.025];
        attribs = @{NSFontAttributeName: questionFont, NSParagraphStyleAttributeName:paragraphStyle};

        NSString *maleString = [NSString stringWithFormat:@"%@", self.male];
        CGSize maleSize = [maleString sizeWithAttributes:attribs];
        [maleString drawAtPoint:CGPointMake(self.bounds.size.width*0.5-maleSize.width*0.5,
                                            IMAGE_INSET+5*CONTENT_BUFFER(self.bounds.size.height)+facePicHeight+nameSize.height) withAttributes:attribs];

        NSString *femaleString = [NSString stringWithFormat:@"%@", self.female];
        CGSize femaleSize = [femaleString sizeWithAttributes:attribs];
        [femaleString drawAtPoint:CGPointMake(self.bounds.size.width*0.5-femaleSize.width*0.5,
                                              IMAGE_INSET+6*CONTENT_BUFFER(self.bounds.size.height)+facePicHeight+nameSize.height+maleSize.height) withAttributes:attribs];

        NSString *babyString = [NSString stringWithFormat:@"%@", self.baby];
        CGSize babySize = [babyString sizeWithAttributes:attribs];
        [babyString drawInRect:CGRectMake(IMAGE_INSET+CONTENT_BUFFER(self.bounds.size.height), IMAGE_INSET+7*CONTENT_BUFFER(self.bounds.size.height)+facePicHeight+nameSize.height+maleSize.height+femaleSize.height, self.bounds.size.width-2.0*(IMAGE_INSET+CONTENT_BUFFER(self.bounds.size.height)), babySize.height) withAttributes:attribs];

Все это может стать немного неуклюжим. Очевидно, что некоторые представления проще, чем другие, но если у вас сложное представление о том, что вы хотите поддерживать многозадачность и локализацию, а также другие вещи, которые будут влиять на компоновку вашего пользовательского интерфейса, обычно гораздо проще использовать автоматическую компоновку.

Другие вопросы по тегам