Как можно масштабировать интерфейс или экран для iOS 7.1, чтобы они соответствовали меньшим моделям iPhone?

#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