Как подклассифицировать элементы пользовательского интерфейса, такие как UILabel, UIButton

Я подклассифицирую UILabel в CustomLabel class . У меня проблемы, когда я пытаюсь использовать простой UILabel и я буду подклассифицировать другие элементы в будущем. Я прочитал, что могу создать category UILabel . Что из этого лучше? категории или подкласса?

Вот мой код, пытающийся подкласс. Он не работает в методе setFont .

 @interface WPCustomLabel : UILabel @property (strong, nonatomic) UIColor *color; @property (strong, nonatomic) UIFont *font; @end #import "WPCustomLabel.h" @implementation WPCustomLabel - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { [self setBackgroundColor:[UIColor clearColor]]; } return self; } -(void)setColor:(UIColor *)color { self.color = color; } -(void)setFont:(UIFont *)font { self.font = font; } @end 

и я вызываю эту CustomLabel в моем ViewController.

 @property (strong, nonatomic) WPCustomLabel *titleLbl; titleLbl = [[WPCustomLabel alloc] initWithFrame:CGRectMake(75, 25, 200, 14)]; [titleLbl setTextColor:[UIColor blackColor]]; [titleLbl setFont:[UIFont systemFontOfSize:14]]; [titleLbl setBackgroundColor:[UIColor clearColor]]; [titleLbl setText:@"Here I AM"]; [self.view addSubview:titleLbl]; 

  • Как создать UIButton с двумя строками текста, а первая строка текста будет больше второй?
  • Сделать интерактивный UILabel с помощью Swift
  • Неестественный рывок с высотой ячейки UITableView динамически изменяется
  • Создайте UIImage из 2 UIImages и ярлыков
  • Как я могу отступать только в первой строке многострочного UILabel в iOS?
  • Как нарисовать границу вокруг абзаца в UILabel?
  • Минимальный размер шрифта, устаревший на версии ios 6.0
  • Как достичь фонового изображения в UILabel, как в pic?
  • 4 Solutions collect form web for “Как подклассифицировать элементы пользовательского интерфейса, такие как UILabel, UIButton”

    Как подклассифицировать элементы пользовательского интерфейса, такие как UILabel, UIButton

    Никоим образом не.

    Я прочитал, что могу создать категорию UILabel

    Это верно. На самом деле, если вы хотите расширить класс, скорее всего, вы должны использовать категорию (см. Предыдущий ответ).

    Он не работает в методе setFont.

    Вы не указали, как это «не удается», но все, что я могу догадаться, в результате приводит к бесконечной рекурсии и ошибке переполнения / сегментации стека. Это потому что

     self.font = font; 

    эквивалентно

     [self setFont:font]; 

    Таким образом, вы вызываете метод из себя, безоговорочно.

    Если вам не нужно настраивать поведение этих свойств, просто оставьте его. 🙂 Если да, то просто вызовите реализацию суперкласса, когда вы закончите:

     - (void)setFont:(UIFont *)font { [self doScaryCustomMagicStuff]; [super setFont:font]; } 

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

    Ваша проблема здесь в том, что в сеттерах вы вспоминаете сеттеров:

     -(void)setFont:(UIFont *)font { self.font = font; } 

    компилируется в (это то же самое):

     -(void)setFont:(UIFont *)font { [self setFont:font]; } 

    Вы должны уметь видеть эту проблему. Вы не можете выйти из этого метода, как только вы его назовете. Здесь вы вводите в заблуждение свойства и переменные экземпляра. Переопределяющие сеттеры не должны устанавливаться через свойство, а скорее непосредственно в переменную экземпляра. Так:

     // LOOK AT EDIT -- Do not do this for 'font' -(void)setFont:(UIFont *)font { _font = font; } 

    РЕДАКТИРОВАТЬ:

    Я не думал прямо. Поскольку вы подклассифицируете UILabel вас уже есть свойство font . Вы не должны указывать это напрямую, поскольку ваш суперкласс ( UILabel ) уже имеет его. Поэтому избавитесь от этих объявлений свойств. При этом, если color не нужен, категория, вероятно, станет лучшим решением для вас. Несмотря на это, вы можете переопределить свой setFont: :

     -(void)setFont:(UIFont *)font { [super setFont:font]; // do custom stuff } 

    И поскольку color не является свойством UILabel вы должны установить его через переменную экземпляра (например, выше: _color = color ), не вызывайте super на этом UILabel так как UILabel не отвечает на него.

    UILabel реализацию UILabel , поскольку вы являетесь подклассом этого.

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

    Но, если вы хотите использовать аналогичные UILabels в нескольких местах вашего приложения, чем вы должны подклассифицировать UILabel, измените его соответствующим образом в initWithFrame или awakeFromNib и используйте свою собственную реализацию везде, где вы этого хотите.

    В вашем случае я предлагаю подклассифицировать его. Метод SetFont уже существует в стандартном UILabel, и вы можете использовать setTextColor вместо setColor.

    Я не знаю о UIButton, но, согласно Apple, UILabel может свободно настраиваться подклассом. Из документации Apple:

    Базовый класс UILabel обеспечивает поддержку как простого, так и сложного стиля текста ярлыка. Вы также можете контролировать аспекты внешнего вида, например, использует ли метка тень или рисует с подсветкой. При необходимости вы можете настроить внешний вид своего текста, добавив подклассом.

    Interesting Posts

    Есть ли метод UIViewController, который автоматически вызывается, когда приложение перемещается на задний план?

    iPhone UIButton – позиция изображения

    CocoaPods и Swift – безопасно использовать?

    SecKeyGeneratePair возвращает errSecUnimplemented

    Как читать массив из plist iOS

    Как запретить WKWebView неоднократно запрашивать разрешение на доступ к местоположению?

    Проверьте, была ли Apple возвращена невозобновляемая подписка?

    Как получить UIColor из ассоциативного массива в Swift

    Xcode Множественные статические библиотеки и повторяющиеся символы

    Не работает проверка подлинности ShareKit + Facebook

    Почему print () печатает мою строку как необязательный?

    Как я могу сделать UINavigationController прозрачным только в одном контроллере?

    Почему мой сбой?

    Вставка или добавление новой команды загрузки библиотеки в двоичный файл iOS (ipa)

    Определите высоту UILabel для центрирования при использовании adjustFontSizeToFitWidth

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.