#ios #iphone #xcode #layout #interface-builder
#iOS #iPhone #xcode #макет #конструктор интерфейса
Вопрос:
заранее извиняюсь, если на вопрос был дан ответ в другом месте, но я искал и не нашел эквивалентного решения. Не стесняйтесь ссылаться на меня, если таковой был создан.
Я создал целое приложение для раскадровки (с примерно 50-60 макетами контроллера просмотра в файле xib) для 4-дюймового iPhone 5 / 5c / 5s, и я ищу способ уменьшить масштаб экрана.
Под «уменьшением масштаба» я подразумеваю автоматическое использование каждого экрана, который я выложил в storyboard, и масштабирование его по аспектам, когда программа запускается на меньшем iPhone, например iPhone 4S, 4, 3G или любой другой модели меньшего размера, совместимой с iOS 7.1.
У меня нет времени индивидуально изменять конфигурацию каждого отдельного элемента макета в раскадровке, поскольку это составляет 1000 объектов, поэтому, пожалуйста, ограничьте любые ответы или предложения, которые у вас есть, чем-то более масштабным. Конечно, должен существовать какой-то метод библиотеки, который позволяет нам просто перемещать все в меньшее окно на меньшем iPhone без обрезки или обрезки. Даже если сжатие / сжатие приводит к размытию или размытию шрифта, это гораздо предпочтительнее, чтобы целые части экрана не отображались на экране.
Глобальная настройка, позволяющая просто масштабировать аспекты, умножая каждое измерение каждого объекта в раскадровке на destinationPhoneWidth / iPhone5Width для горизонтального измерения и destinationPhoneHeight / iPhone5Height, была бы удовлетворительным решением. Я не знаю ни одного, который существует…
Ответ №1:
Для достижения вашей цели существует одно решение, и это АВТОМАТИЧЕСКОЕ ОПИСАНИЕ
Помимо этого, я не думаю, что для достижения такой цели существует какая-либо библиотека, и, конечно же, это займет у вас много времени, поскольку, как вы упоминаете, есть контроллер просмотра 50-60. Извините, но вы должны были решить раньше для совместимости вашего приложения по размеру. Так что всего наилучшего и продолжайте кодировать. Кроме того, в следующий раз, при запуске с приложением, соблюдайте его совместимость, чтобы избежать такой большой работы в конце.
Комментарии:
1. Как бы это сделать с помощью автозапуска? Будьте более конкретными. Мне пришлось снять этот флажок для многих объектов, потому что это все портит. На самом деле, я заранее решил, что приложение будет совместимо, но, как вы можете судить по iPad и другим симуляторам, кажется здравым смыслом, что масштабирование встроено в IB, потому что вы можете установить 1x и 2x, как если бы приложение запускалось в эмуляторе iPhone на большом iPad. Это то, чего я хочу достичь. Поэтому я определенно решил очень рано, и это кажется вполне возможным, учитывая, что для iPad Xcode simulator вы можете сжимать или расширять все по желанию одним щелчком мыши.
2. Я нажал на вашу ссылку, но это очень общее руководство, не относящееся к моей проблеме. Автозаполнение также относится к отдельным объектам, которые знают, где они должны быть на экране, а не к массовому масштабированию — все по размеру, что я ищу. Если вам нужен лучший пример, зайдите в Xcode и запустите / создайте любое приложение для iPhone для iPad simulator. Посмотрите, как можно переключаться между 1x и 2x? Этот эффект только для небольших iPhone. Я хочу избежать необходимости устанавливать флажок для каждого отдельного объекта, плюс автоматическое описание также относится к другим вещам, поэтому, пожалуйста, будьте более конкретны, чем размещение ссылки или видео.
3. Во-первых, комментарий, который вы написали, не что иное, как заставляет вас казаться новичком. Итак, почему вы проголосовали против меня. Кроме того, автозапуск — это единственный способ для вас достичь своей цели. Вам нужно будет применить автозапуск к каждому компоненту вашего контроллера представления, запустить / собрать его и проверить, подходит ли он для обоих экранов или нет. Автозапуск — это способ сделать ваш экран гибким как для iphone, так и для ipad. Также да, это общая ссылка, которую я вам дал, поскольку вы не имеете представления о функции автозапуска, поэтому вы просто не можете перейти на экспертный уровень, если вы не супермен (: D)
4. до сих пор я не видел ни одной библиотеки, которая бы выполнила вашу цель в мгновение ока. Так что садитесь и читайте об этом (автозапуск), и это выгодно. Тогда вы, возможно, знаете. Также не стоит просто голосовать против, если вы не знаете о функции Apple provide для iphone или ipad.
5. Также, если вы столкнетесь с какой-либо удивительной библиотекой, которая сделает это за вас, пока вы просто смотрите на экран, дайте мне знать.
Ответ №2:
Решение 1. Используйте аффинное преобразование
Несколько лет назад я масштабировал макет iPad до размера iPhone, без автоматической компоновки. Решение состоит в том, чтобы применить аффинное преобразование к вашей иерархии представлений, точно так же, как это:
containerView.transform = CGAffineTransformMakeScale(myScale, myScale);
Вот некоторые детали, которые вам нужно будет рассмотреть.
- Вероятно, вам потребуется объединить масштабирующее преобразование с некоторым преобразованием перевода, чтобы правильно определить местоположение вашего представления. Порядок объединения действительно имеет значение.
- Будьте осторожны, используя аффинные преобразования вместе с автоматической компоновкой. Они работают вместе, но их поведение может меняться в разных версиях iOS. Кроме того, вам, вероятно, потребуется добавить некоторый перевод, как с аффинным преобразованием, так и с автоматической компоновкой.
- Я бы перенес все VCS в корневой контейнер VC, который решает задачу масштабирования. Однако
UIWindow
прямое масштабирование также может работать, я этого не тестировал. - Ваша иерархия представлений по-прежнему будет отображаться на холсте исходного размера, который будет уменьшен. Таким образом, у вас будет некоторое размытие.
Решение 2. Рекурсивно изменять размер всех фреймов / ограничений во время выполнения
Я использую этот подход в своем текущем проекте для настройки макета на разных устройствах. Идея состоит в том, чтобы получить ваш вид сразу после загрузки из nib и рекурсивно просматривать его, умножая каждый размер. Не только рамки, Но и размеры шрифта, ширину границ и т. Д.
Без автоматической компоновки вам придется напрямую манипулировать рамками. С автоматической компоновкой вам придется учитывать все ограничения и умножать их на константы.
Вот категория, которая решает эту задачу с помощью автоматической компоновки. Он заботится о размерах шрифта в UILabel
, UITextField
, UITextView
, UIButton
, и вам придется вручную расширить его с помощью других видов, которые вам нужны. Кроме того, вам придется переопределить -zoomCustomAttributesWithScale:
и -shouldMultiplySubviews:
в ваших пользовательских представлениях.
@interface UIView (MultiplyLayout)
- (void)zoomLayoutWithScale:(CGFloat)scale;
- (BOOL)shouldMultiplySubviews;
- (void)zoomCustomAttributesWithScale:(CGFloat)scale;
@end
@implementation UIView (MultiplyLayout)
- (void)zoomLayoutWithScale:(CGFloat)scale {
CGRect oldFrame = self.frame;
CGRect newFrame = oldFrame;
newFrame.size.width *= scale;
newFrame.size.height *= scale;
for (NSLayoutConstraint *constraint in self.constraints)
constraint.constant *= scale;
if (self.shouldMultiplySubviews)
for (UIView *subview in self.subviews)
[subview zoomLayoutWithScale:scale];
[self zoomCustomAttributesWithScale:scale];
self.frame = newFrame;
}
- (void)zoomCustomAttributesWithScale:(CGFloat)scale {
}
- (BOOL)shouldMultiplySubviews {
return (self.class == [UIView class] ||
self.class == [UIScrollView class]);
}
@end
@interface UIFont (MultiplyLayout)
- (instancetype)zoomedWithScale:(CGFloat)scale;
@end
@implementation UIFont (MultiplyLayout)
- (instancetype)zoomedWithScale:(CGFloat)scale {
return [UIFont fontWithName:self.fontName size:self.pointSize * scale];
}
@end
@implementation UILabel (MultiplyLayout)
- (void)zoomCustomAttributesWithScale:(CGFloat)scale {
self.font = [self.font zoomedWithScale:scale];
}
@end
@implementation UITextField (MultiplyLayout)
- (void)zoomCustomAttributesWithScale:(CGFloat)scale {
self.font = [self.font zoomedWithScale:scale];
}
@end
@implementation UITextView (MultiplyLayout)
- (void)zoomCustomAttributesWithScale:(CGFloat)scale {
self.font = [self.font zoomedWithScale:scale];
}
@end
@implementation UIButton (MultiplyLayout)
- (void)zoomCustomAttributesWithScale:(CGFloat)scale {
self.titleLabel.font = [self.titleLabel.font zoomedWithScale:scale];
}
@end