Xcode 6 имеет новую функцию, в которой шрифты и размеры шрифтов в UILabel
, UITextField
и UIButton
могут быть установлены автоматически на основе класса размера текущей конфигурации устройства, прямо в раскадровке. Например, вы можете установить UILabel
размер шрифта 12 для конфигураций «любая ширина, компактная высота» (например, на iPhone в альбомной ориентации) и размер 18 для конфигураций «обычная ширина, обычная высота» (например, на iPad ). Более подробная информация доступна здесь:
developer.apple.com/size_class
Теоретически это отличная функция, потому что она может сделать ненужным программную установку различных шрифтов для функций пользовательского интерфейса в зависимости от конфигурации устройства. Прямо сейчас у меня есть условный код, который устанавливает шрифты в зависимости от типа устройства, но, очевидно, это означает, что я должен программно устанавливать шрифты во всем приложении. Так что я изначально был очень взволнован этой функцией, но я обнаружил, что у меня есть серьезная проблема фактического использования (возможно, ошибка). Обратите внимание, что я использую SDK 8 и устанавливаю минимальную цель развертывания iOS 8 , поэтому это не имеет ничего общего с совместимостью со старыми версиями iOS.
Проблема в следующем: если я устанавливаю разные размеры шрифта для разных классов размеров и использую шрифт «Системный», предоставляемый iOS , все работает, как ожидалось, и размеры шрифта меняются в зависимости от класса размера. Если я использую настраиваемый шрифт, предоставляемый моим приложением (да, он правильно настроен в моем пакете приложений, поскольку он работает программно), и устанавливаю настраиваемый шрифт для метки в раскадровке XCode 6 , это также работает, как ожидалось. Но когда я пытаюсь использовать разные размеры пользовательского шрифта для разных классов размеров в раскадровке, это внезапно не работает. Единственная разница в конфигурации - это шрифт, который я выбрал (пользовательский шрифт по сравнению с системным шрифтом). Вместо этого все шрифты отображаются наdevice и simulator в качестве системного шрифта по умолчанию с размером по умолчанию , независимо от класса размера (и я проверил через отладчик, что он заменяет системный шрифт на фактический, указанный в раскадровке). Таким образом, в основном, функция класса размера не работает для пользовательских шрифтов. Кроме того, что интересно, пользовательские шрифты на самом деле правильно отображают и регулируют размер в панели XCode 6 «Предварительный просмотр» для контроллера представления: он перестает работать только при запуске в реальной системе iOS (что заставляет меня думать, что я настраиваю его правильно) .
Я пробовал несколько разных пользовательских шрифтов, и, похоже, ни один из них не работает, но всегда работает, если я использую вместо этого «Системный».
В любом случае, кто-нибудь еще видел эту проблему в Xcode 6 ?
Любые идеи о том, является ли это ошибкой в iOS 8, Xcode или что-то в этом роде
Я делаю не так?
Как я уже сказал, единственный обходной путь, который я нашел, - это продолжить программную установку шрифтов, как я делал примерно для трех версий iOS, потому что это действительно работает.
Но я бы хотел иметь возможность использовать эту функцию, если бы я мог заставить ее работать с пользовательскими шрифтами. Использование системного шрифта неприемлемо для нашего дизайна.
ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ: Начиная с Xcode 8.0, ошибка исправлена.
Ответы:
Быстрое исправление:
1) Установите шрифты как систему для классов размеров
2) Подкласс UILabel и переопределите метод layoutSubviews, например:
Кстати, это очень удобный прием для иконических шрифтов.
источник
self.label.font = ...
Таким образом, вы можете использовать разные шрифты в разных местах.Попробовав все, я в конце концов остановился на комбинации вышеперечисленных решений. Использование Xcode 7.2, Swift 2.
@IBInspectable
позволяет установить размер шрифта в раскадровкеdidSet
наблюдателя, чтобы избежать ошибокlayoutSubviews()
(бесконечный цикл для высоты строк динамического представления таблицы) иawakeFromNib()
(см. Комментарий @ cocoaNoob)@IBDesignable
@IBDesignable
не работает вtraitCollection
соответствии с этой другой статьей о стекеUIScreen.mainScreen()
не вself
соответствии с этой статьей стекаисточник
Обходной путь для
UILabel
: сохранить тот же размер шрифта на всех размерных классов, но вместо того, чтобы изменить высоту этикетки соответственно в каждом Размер класса. На вашей этикетке должна быть включена автоматическая усадка. В моем случае это отлично сработало.источник
adjustsFontSizeToFitWidth
похоже, работает только для ширины (которую я не могу использовать, потому что текст меток динамический).Эта (и другая ошибка, связанная с Xcode - Size Classes) недавно вызвала у меня серьезное горе, так как мне пришлось пройти через огромный файл раскадровки, взламывая вещи.
Для всех, кто находится в этой должности, я хотел бы добавить что-то поверх ответа @razor28, чтобы облегчить боль.
В файле заголовка вашего настраиваемого подкласса используйте
IBInspectable
для своих атрибутов времени выполнения. Это сделает эти атрибуты доступными из «Инспектора атрибутов», визуально прямо над положением по умолчанию для настроек шрифта.Пример использования:
Это очень полезно для получения такого вывода:
Дополнительным преимуществом является то, что теперь нам не нужно вручную добавлять атрибуты времени выполнения для каждой метки. Это самое близкое к предполагаемому поведению XCode. Надеюсь, этим летом в iOS 9 появится соответствующее исправление.
источник
Решение похоже на решение @razor28, но, на мой взгляд, более универсальное. Также отлично работает на старых версиях iOS.
https://gist.github.com/softmaxsg/8a3ce30331f9f07f023e
источник
Ошибка все еще актуальна в XCode 7.0 GM.
Решение Razor28 в некоторых случаях вызывает бесконечные циклы. По моему опыту, он использовался вместе со SwipeView .
Вместо этого я предлагаю вам:
1) Подкласс UILabel и переопределить setFont:
2) Установите собственный класс ваших UILabels, а затем установите классы размера шрифта с помощью системного шрифта
источник
Проблема по-прежнему заключается в том, что вы не можете использовать эту функцию для установки шрифтов для разных классов размера из конструктора интерфейса.
Просто установите шрифт в соответствии с нужным устройством, как показано ниже:
Это отлично работает на всех устройствах.
источник
У меня ничего из этого не сработало, но это сработало. Также необходимо использовать системный шрифт в IB.
источник
Все еще нет подписанного правильного ответа. Этот код мне подходит. Вы должны сначала отключить размер шрифта для классов размеров в построителе интерфейса. В IB можно использовать собственный шрифт.
источник
Сочетание некоторых из приведенных выше ответов было полезно. Вот как я решил ошибку IB с помощью расширения Swift UILabel:
источник
Я использую Swift, XCode 6.4. Так вот что я сделал
Перейти к конструктору -> Инспектор идентичности -> Установите для класса ExUILabel
Затем перейдите в инспектор атрибутов в дизайнере и установите имя шрифта.
источник
Я придумал еще более быстрое исправление (я предполагаю, что вы всегда используете свой собственный шрифт).
Создайте категорию для UILabel и включите в файлы с помощью раскадровки с ошибками с классами размеров и настройками выделенного шрифта для различных классов:
Просто используйте свои собственные шрифты в раскадровке. Когда ошибочный интерпретатор будет использовать системный шрифт вместо вашего, эта категория переключит его на ваш собственный шрифт.
источник
У меня была такая же проблема, и я нашел одно не совсем ясное, но прекрасное решение!
источник
источник