Подтвердить что ты не робот

Сделать шрифт растут вместе с UILabel (измененный с помощью Auto Layout) - как это сделать в Interface Builder?

В простое приложение для iPhone Я показываю плитку писем (пользовательский UIView с изображением и 2 метками) следующим кодом в viewDidLoad:

app screenshot

DraggedTile *tile = [[[NSBundle mainBundle] loadNibNamed:@"DraggedTile"
                                                   owner:self
                                                 options:nil] firstObject];
tile.frame = CGRectMake(10 + arc4random_uniform(100),
                        10 + arc4random_uniform(100),
                        kWidth,
                        kHeight);
[self.view addSubview:tile];

Это работает нормально, но я хотел бы, чтобы плитка письма увеличивалась - когда я поставляю большие параметры ширины и высоты в CGRectMake.

Итак, в Xcode 5.1 Interface Builder я открываю DraggedTile.xib и включаю "Автоматический макет".

Затем для image и letter я добавляю ограничения в левый, верхний, правый, нижние ребра родителя.

Для метки letter я также установил "Линии" на 0 и "Приоритет устойчивости сжатия содержимого" до 1000 (здесь fullscreen 1 и fullscreen 2):

Xcode screenshot

Xcode screenshot

Затем я изменяю код, чтобы использовать большую ширину и высоту:

tile.frame = CGRectMake(10 + arc4random_uniform(100),
                        10 + arc4random_uniform(100),
                        2 * kWidth,
                        2 * kHeight);

Вот результат:

app screenshot

Как фоновая метка image, так и метка letter, похоже, выросли по назначению.

Однако размер шрифта метки не вырос.

Я искал вокруг, и я думаю, что мне нужно что-то вроде tile.letter.adjustsFontSizeToFitWidth = YES. Но в то же время я не могу использовать его при включенной автоматической компоновке...

Итак, мой вопрос, если в "Interface Builder" есть какая-либо опция, позволяющая увеличить размер шрифта?

UPDATE:

Я попытался предложить ismailgulek установить размер шрифта до 200 в Interface Builder и в коде tile.letter.adjustsFontSizeToFitWidth = YES и выглядит многообещающим (здесь полноэкранного):

Xcode screenshot

но у меня теперь есть проблема, что я установил 40px в качестве ограничения letter.bottom в Interface Builder. Но что, если мне нужна большая рамка для плитки? Есть ли способ использовать процент, а не абсолютное значение пикселя в этом ограничении?

И еще один вопрос, если можно установить adjustsFontSizeToFitWidth где-нибудь в построителе интерфейса или мне нужно использовать исходный код для этого? Я попытался добавить ключ к "Атрибутам пользовательской настройки времени выполнения" - но затем приложение вылетает во время выполнения:

Xcode screenshot

4b9b3361

Ответ 1

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

Но, если вы установите размер шрифта достаточно большим (скажем 200) и установите adjustsFontSizeToFitWidth на YES, я думаю, вы получите интересные результаты.

И не забудьте установить Baseline как Align Centers, иначе ваш текст может не отображаться должным образом.

Пожалуйста, сообщите нам о ваших результатах.

Ответ 2

Для тех, кто пришел сюда по названию и нуждается в простое решение (после нескольких часов исследований):

Пример проблемы:. Если вы используете автоматическую компоновку и устанавливаете высоту UILabel, которая будет пропорциональна высоте экрана, вы получите фрейм, который является низким для iPhone (пейзаж) и высоким для iPad. Как настроить высоту шрифта автоматически?

Решение: в интерфейсе Builder,

  • Установите "Автозапуск" на "Минимальный размер шрифта" и установите что-то для размера (оно влияет на слишком широкий текст, но требуется для нашего решения).
  • Установите "Линии" 0 и сделайте размер шрифта выше кадра, который вы получите в iPad.

Это приведет к тому, что шрифт автоматически увеличится до текущей высоты.

Ответ 3

Вы можете выполнить то, что хотите, установив Autoshrink в раскадровку. Это приведет к сокращению метки до минимального масштаба/явного размера, когда размер экрана станет меньше. Заставьте его работать с самым большим размером экрана, а затем убедитесь, что он сжимается до нужного размера в предварительном просмотре раскадровки.

Ответ 4

Вы можете заменить класс в Interface Builder своим собственным производным классом и изменить его размер.

Пример:

/**
MYLabel does exactly the same like UILabel, except that the font size will automatically shrink 
if the code is executed on an iPhone.
*/

class MYLabel: UILabel {

    var onlyOnceToken: dispatch_once_t = 0

    override func drawRect(rect: CGRect) {

        dispatch_once(&onlyOnceToken) {

            if let usedFont:UIFont = self.font {

                // define your reference size here
                let iPadHeight:CGFloat = 768
                let screenBounds = UIScreen.mainScreen().bounds
                let scale:CGFloat =  screenBounds.height / iPadHeight
                self.font = UIFont(name: usedFont.fontName, size: CGFloat(usedFont.pointSize) * scale)
            }
        }

        super.drawRect(rect)
    }
}

С этого момента вам просто нужно заменить класс UILabel на MYLabel в инспекторе идентификации IB, и все ваши шрифты автоматически изменяют размер пропорционально высоте ваших устройств.

Если вы хотите просто увеличить его вместе с размером метки, замените

let screenBounds = UIScreen.mainScreen().bounds

с

let screenBounds = self.bounds.height

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

Ответ 5

Шрифт не будет расти автоматически.
Вы должны увеличить/уменьшить его самостоятельно, в IB или программно.