Как переопределить -drawrect в подclassе UIButton?

ЗДРАВСТВУЙ. Мне нужно написать текст над пользовательской кнопкой. Поэтому я подclassифицировал UIButton. В -drawrect я пишу текст, который мне нужен. Проблема в том, что текст заканчивается под кнопкой. После того, как я напишу свой текст, верховный лидер UIButton идет вперед и опирается на меня.

Я даже не звонил [super drawrect: rect], хотя я ожидал, что позвоню ему, прежде чем сделать свой рисунок. Кажется, что верховный UIButton будет вызван независимо.

Есть идеи? Благодарю.

Как говорили другие люди, вам не нужно подclassифицировать UIButton – infact, это лучше всего не делать, поскольку UIButton довольно сложный (как вы нашли). У вас есть три варианта:

  • Оставьте заголовок кнопки пустым и добавьте новое текстовое поле к кнопке в нужном месте.
  • если вы используете 3.0, доступ к свойству ярлыка кнопки. Хотя сам ярлык читается только его свойства (включая рамку), нет.
  • Подclass UIControl. UIControl – это UIView, поэтому вы можете добавлять другие представления – текст и изображения, а UIView реализует поведение сообщения о действиях ( addTarget:action:forControlEvents: . UIButton реализует государственность на вершине этого.

Если вам не нужны такие вещи, как setTitle setTitle:forState: и связанные функции, но вы используете много этих элементов управления, я бы использовал третий вариант. В противном случае используйте первый (или второй, если вы на 3.0).

это хорошо работает для меня … (игнорируйте сложный код рисования).

  1. Создайте подclass UIButton
  2. Создайте UIButton в своем StoryBoard
  3. Перейдите в Инспектор удостоверений и введите имя своего настраиваемого classа кнопок.

здесь мой код UIButton:

h файл:

 #import  @interface DoneButton : UIButton @property (assign, nonatomic) BOOL selected; @end 

m файл:

  #import "DoneButton.h" @implementation DoneButton @synthesize selected = _selected; - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { // Initialization code } return self; } - (void)setSelected:(BOOL)selected { if (_selected != selected) { _selected = selected; [self setNeedsDisplay]; } } - (void)drawRect:(CGRect)rect { // Drawing code if (_selected) { //// Color Declarations UIColor* color2 = [UIColor colorWithRed: 0 green: 0 blue: 0 alpha: 1]; //// Bezier Drawing UIBezierPath* bezierPath = [UIBezierPath bezierPath]; [bezierPath moveToPoint: CGPointMake(49.39, 31.25)]; [bezierPath addLineToPoint: CGPointMake(49.39, 31.25)]; [bezierPath addCurveToPoint: CGPointMake(46.64, 25.19) controlPoint1: CGPointMake(49.39, 29.02) controlPoint2: CGPointMake(48.38, 26.94)]; [bezierPath addCurveToPoint: CGPointMake(44.3, 18.95) controlPoint1: CGPointMake(46.63, 22.72) controlPoint2: CGPointMake(45.88, 20.53)]; [bezierPath addCurveToPoint: CGPointMake(42.44, 17.59) controlPoint1: CGPointMake(43.75, 18.4) controlPoint2: CGPointMake(43.13, 17.95)]; [bezierPath addCurveToPoint: CGPointMake(38.07, 16.61) controlPoint1: CGPointMake(41.17, 16.93) controlPoint2: CGPointMake(39.67, 16.62)]; [bezierPath addCurveToPoint: CGPointMake(33.15, 13.95) controlPoint1: CGPointMake(36.62, 15.18) controlPoint2: CGPointMake(34.95, 14.23)]; [bezierPath addCurveToPoint: CGPointMake(32.78, 13.92) controlPoint1: CGPointMake(33.03, 13.93) controlPoint2: CGPointMake(32.9, 13.93)]; [bezierPath addCurveToPoint: CGPointMake(32, 13.86) controlPoint1: CGPointMake(32.52, 13.89) controlPoint2: CGPointMake(32.26, 13.86)]; [bezierPath addLineToPoint: CGPointMake(32, 13.86)]; [bezierPath addLineToPoint: CGPointMake(32, 13.86)]; [bezierPath addLineToPoint: CGPointMake(32, 13.86)]; [bezierPath addLineToPoint: CGPointMake(32, 13.86)]; [bezierPath addCurveToPoint: CGPointMake(31.38, 13.91) controlPoint1: CGPointMake(31.79, 13.86) controlPoint2: CGPointMake(31.59, 13.89)]; [bezierPath addCurveToPoint: CGPointMake(30.85, 13.95) controlPoint1: CGPointMake(31.2, 13.92) controlPoint2: CGPointMake(31.02, 13.92)]; [bezierPath addCurveToPoint: CGPointMake(26.92, 15.74) controlPoint1: CGPointMake(29.44, 14.17) controlPoint2: CGPointMake(28.12, 14.8)]; [bezierPath addCurveToPoint: CGPointMake(25.94, 16.61) controlPoint1: CGPointMake(26.58, 16.01) controlPoint2: CGPointMake(26.25, 16.29)]; [bezierPath addCurveToPoint: CGPointMake(24.13, 16.76) controlPoint1: CGPointMake(25.31, 16.61) controlPoint2: CGPointMake(24.71, 16.66)]; [bezierPath addCurveToPoint: CGPointMake(19.7, 18.95) controlPoint1: CGPointMake(22.41, 17.06) controlPoint2: CGPointMake(20.88, 17.77)]; [bezierPath addCurveToPoint: CGPointMake(17.36, 25.19) controlPoint1: CGPointMake(18.12, 20.53) controlPoint2: CGPointMake(17.37, 22.72)]; [bezierPath addCurveToPoint: CGPointMake(14.61, 31.25) controlPoint1: CGPointMake(15.62, 26.94) controlPoint2: CGPointMake(14.61, 29.02)]; [bezierPath addLineToPoint: CGPointMake(14.61, 31.25)]; [bezierPath addCurveToPoint: CGPointMake(14.61, 31.25) controlPoint1: CGPointMake(14.61, 31.25) controlPoint2: CGPointMake(14.61, 31.25)]; [bezierPath addCurveToPoint: CGPointMake(14.66, 31.92) controlPoint1: CGPointMake(14.61, 31.48) controlPoint2: CGPointMake(14.64, 31.7)]; [bezierPath addCurveToPoint: CGPointMake(14.7, 32.4) controlPoint1: CGPointMake(14.67, 32.08) controlPoint2: CGPointMake(14.67, 32.24)]; [bezierPath addCurveToPoint: CGPointMake(15.86, 35.44) controlPoint1: CGPointMake(14.86, 33.46) controlPoint2: CGPointMake(15.27, 34.48)]; [bezierPath addCurveToPoint: CGPointMake(15.97, 35.64) controlPoint1: CGPointMake(15.9, 35.5) controlPoint2: CGPointMake(15.93, 35.57)]; [bezierPath addCurveToPoint: CGPointMake(17.36, 37.32) controlPoint1: CGPointMake(16.36, 36.23) controlPoint2: CGPointMake(16.83, 36.78)]; [bezierPath addCurveToPoint: CGPointMake(17.49, 38.98) controlPoint1: CGPointMake(17.36, 37.89) controlPoint2: CGPointMake(17.41, 38.44)]; [bezierPath addCurveToPoint: CGPointMake(18.35, 41.7) controlPoint1: CGPointMake(17.65, 39.95) controlPoint2: CGPointMake(17.92, 40.87)]; [bezierPath addCurveToPoint: CGPointMake(19.7, 43.55) controlPoint1: CGPointMake(18.7, 42.38) controlPoint2: CGPointMake(19.15, 43)]; [bezierPath addCurveToPoint: CGPointMake(25.93, 45.89) controlPoint1: CGPointMake(21.28, 45.13) controlPoint2: CGPointMake(23.47, 45.88)]; [bezierPath addCurveToPoint: CGPointMake(27.61, 47.28) controlPoint1: CGPointMake(26.47, 46.42) controlPoint2: CGPointMake(27.02, 46.89)]; [bezierPath addCurveToPoint: CGPointMake(32, 48.64) controlPoint1: CGPointMake(28.96, 48.16) controlPoint2: CGPointMake(30.44, 48.64)]; [bezierPath addLineToPoint: CGPointMake(32, 48.64)]; [bezierPath addLineToPoint: CGPointMake(32, 48.64)]; [bezierPath addLineToPoint: CGPointMake(32, 48.64)]; [bezierPath addLineToPoint: CGPointMake(32, 48.64)]; [bezierPath addCurveToPoint: CGPointMake(38.06, 45.89) controlPoint1: CGPointMake(34.23, 48.64) controlPoint2: CGPointMake(36.31, 47.63)]; [bezierPath addCurveToPoint: CGPointMake(44.3, 43.55) controlPoint1: CGPointMake(40.53, 45.88) controlPoint2: CGPointMake(42.72, 45.13)]; [bezierPath addLineToPoint: CGPointMake(44.3, 43.55)]; [bezierPath addLineToPoint: CGPointMake(44.3, 43.55)]; [bezierPath addCurveToPoint: CGPointMake(46.64, 37.31) controlPoint1: CGPointMake(45.88, 41.97) controlPoint2: CGPointMake(46.63, 39.78)]; [bezierPath addCurveToPoint: CGPointMake(49.39, 31.25) controlPoint1: CGPointMake(48.38, 35.56) controlPoint2: CGPointMake(49.39, 33.48)]; [bezierPath addLineToPoint: CGPointMake(49.39, 31.25)]; [bezierPath closePath]; [color2 setStroke]; bezierPath.lineWidth = 1; [bezierPath stroke]; //// Bezier 2 Drawing UIBezierPath* bezier2Path = [UIBezierPath bezierPath]; [bezier2Path moveToPoint: CGPointMake(22.42, 29.85)]; [bezier2Path addLineToPoint: CGPointMake(29.74, 37.17)]; [bezier2Path addLineToPoint: CGPointMake(41.58, 25.33)]; bezier2Path.usesEvenOddFillRule = YES; [color2 setStroke]; bezier2Path.lineWidth = 1; [bezier2Path stroke]; } else { //// Color Declarations UIColor* color3 = [UIColor colorWithRed: 0.5 green: 0.5 blue: 0.5 alpha: 1]; //// Bezier 2 Drawing UIBezierPath* bezier2Path = [UIBezierPath bezierPath]; [bezier2Path moveToPoint: CGPointMake(22.42, 29.85)]; [bezier2Path addLineToPoint: CGPointMake(29.74, 37.17)]; [bezier2Path addLineToPoint: CGPointMake(41.58, 25.33)]; bezier2Path.usesEvenOddFillRule = YES; [color3 setStroke]; bezier2Path.lineWidth = 1; [bezier2Path stroke]; } } 

если кнопка выбрана, нарисуйте первый код, иначе нарисуйте другой код. Я предпочитаю этот метод, потому что я использую Paint Code. поэтому это экономит много времени, и вам не нужно создавать тысячи png или jpeg.

Основываясь на вашем комментарии к одному из других ответов, это случай запроса «Как мне сделать X с Y для достижения Z?» когда вы действительно должны спрашивать: «Как мне достичь Z?»

Если вы хотите, чтобы кнопка рисовала текст поверх изображения, а не рядом с ним, просто сделайте изображение фоновым изображением кнопки. Используйте setBackgroundImage:forState: а не setImage:forState: затем установите заголовок в обычном режиме.

В любом случае вам нужно будет нарисовать изображение в drawRect: или переместить текст в подвью, чтобы он рисовал выше изображения. Решение, о котором я упоминал, является вариантом второго варианта.

Вам не нужно подclassифицировать UIButton, чтобы добавить к нему какой-либо текст. Ниже приведен пример установки названия кнопки для пользовательской кнопки в методе -viewDidLoad подclassа UIViewController:

 UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; button.frame = CGRectMake(0, 0, 44, 44); [button setTitle:@"x" forState:UIControlStateNormal]; [self.view addSubview:button]; 

Вы также можете установить свойство шрифта вашей кнопки или изменить цвет с помощью -setTitleColor: forState :.

Как добавить надвью над представлением кнопки? Тогда у вас будет полный контроль над ним и не волнует, что сделала кнопка. Возможно, вы даже можете сделать это ярлыком и сохранить себя drawRect.

  • Установка изображения UIButton приводит к синей кнопке в iOS 7
  • Ярлык под изображением в UIButton
  • Как обнаружить одну кнопку в ячейке таблицы
  • Сохранение UIButton, выбранного после касания
  • Почему UINavigationBar крадет события касания?
  • Вызов распознавателя жестов и действия кнопок
  • Как остановить нежелательную анимацию UIButton при изменении названия?
  • Прикрепите параметр к действию button.addTarget в Swift
  • Получить нажатие кнопки внутри UITableViewCell
  • UIButton: как центрировать изображение и текст с помощью imageEdgeInsets и titleEdgeInsets?
  • Как я могу создать базовый UIButton программно?
  • Давайте будем гением компьютера.