2015-10-29 2 views
0

Im разрабатывает приложение с несколькими UIViewControllers, содержащее компоненты UILabel. У UIViewControllers есть одинаковые настройки для названия, субтитров, подтекста и/или текста. В каждом UIViewControllers я постоянно менял размер шрифта, цвет и другие переменные, поэтому я хотел использовать что-то вроде стиля для всех компонентов UIView, поэтому все изменения влияют на все компоненты во всех ViewControllers.Стилирование UILabel через все приложение

Я создал пользовательские классы UILabel и связал их в своих раскадках с пользовательским классом, который реализует стиль по умолчанию. Но он работает неправильно.

class UICustomLabel: UILabel 
{ 
    override func layoutSubviews() 
    { 
    super.layoutSubviews() 
    self.font = UIFont(name: Style.FontNameDefault, size: Style.FontSizeDefault); 
    } 
} 

class UILabelTitle: UILabel 
{ 
    override func layoutSubviews() 
    { 
    super.layoutSubviews() 
    self.font = UIFont(name: Style.FontNameTitle, size: Style.FontSizeTitle); 
    } 
} 

Есть ли лучший способ соединить все компоненты UIView через все приложение так же?

+0

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

+0

Oke, и если я исправлю это, это способ пойти или есть лучшее решение для стилизации всех UILabel в нескольких ViewControllers? – Jurdefur

+0

Ну, это вопрос мнения, вы можете использовать ['UIAppearance proxy'] (https://developer.apple.com/library/prerelease/ios/documentation/UIKit/Reference/UIAppearance_Protocol/index.html) или установить шрифт в 'loadView' каждого контроллера. Это действительно зависит от вас. – rckoenes

ответ

0

Я считаю, это очень полезно библиотеки:

NUI, Motif.

Это как CSS для iOS.

Но если вы ищете чистое решение iOS, попробуйте установить свойства шрифта в awakeFromNib или в init вместо layoutSubviews. Кроме того, убедитесь, что ваш IBOutlets в ViewControllers имеет правильные заявления (например, UITitleLabel вместо UILabel)

1

Вы можете сделать расширение на UILabel, что обеспечивает ряд фабричных методов для всех типов этикеток вам нужно.

extension UILabel { 
    class func stl_titleLabel() -> UILabel { 
     let label = UILabel() 
     label.font = ... 
     return label 
    } 
    class func stl_commentLabel(frame: CGRect, color: UIColor) -> UILabel { // whatever arguments you need 
     let label = UILabel(frame) 
     label.font = ... 
     label.textColor = color 
     return label 
    } 
} 

Есть могут быть некоторые синтаксические ошибки в коде, так как я не так хорошо с быстрым, но я думаю, вы получите идею. Я надеюсь, что это поможет.

EDIT: Ой, я пропустил, что вы используете раскадровки. Мое решение будет работать, если метки были созданы с кодом. Может быть, есть способ объединить его с раскадровки, но я не знаю, как это сделать.

0

Существует встроенный способ достижения этого - это называется UIAppearance. Этот протокол реализуется всеми представлениями системы. Вы можете прочитать больше here

И маленький пример:

[[UILabel appearance] setTextColor:[UIColor whiteColor]]; 
[[UILabel appearanceWhenContainedIn:[MyCustomView class]] setTextColor:[UIColor blueColor]] 

К сожалению, например, в Obj-C, это также в Swift доклада доступен.

Первая строка устанавливает цвет текста для всех UILabels в белый цвет. Вторая строка делает текст синим цветом, но только если UILabel является подзоном MyCustomView. Таким образом, вы можете легко добавлять исключения из общего правила, если таковые имеются.

Также обратите внимание, что эффекты вступят в силу для UILabels, добавленных после запуска этого кода, поэтому лучшее место для этого можно использовать в AppDelegate.

Смежные вопросы