styleclass style showdemo example iphone uibutton

iphone - style - ui datatable css primefaces



¿Cómo sobrescribir-drawrect en la subclase UIButton? (5)

HOLA. Necesito escribir algo de texto sobre un botón personalizado. Así que subclassed UIButton. En -drawrect, escribo el texto que necesito. El problema es que el texto termina debajo del botón. Después de escribir mi texto, el drawrect de UIButton sigue adelante y se dibuja encima de mí.

Ni siquiera estoy llamando [super drawrect: rect] a pesar de que estaba esperando llamarlo antes de hacer mi dibujo. Parece que el drawrect de UIButton se llamará independientemente.

¿Algunas ideas? Gracias.


¿Qué le parece agregar una subvista sobre la vista del botón? Entonces tendrías un control total sobre él y no te importaría lo que hiciera el botón. Probablemente puedas incluso convertirlo en una Etiqueta y ahorrarte el drawRect.


Como han dicho otras personas, no es necesario que subclass UIButton - de hecho, es mejor no hacerlo ya que UIButton es bastante complejo (como usted encontró). Tienes tres opciones:

  • Deje el título del botón en blanco y agregue un nuevo campo de texto al botón en la posición que desee.
  • si está utilizando 3.0 acceda a la propiedad de la etiqueta del botón. Aunque la etiqueta en sí misma es de solo lectura, sus propiedades (incluido el marco) no lo son.
  • Subclase UIControl. UIControl es una UIView para que pueda agregar otras vistas, texto e imágenes, y es UIView la que implementa el comportamiento del mensaje de acción ( addTarget:action:forControlEvents: . UIButton implementa statefulness además de esto.

Si no necesita elementos como setTitle setTitle:forState: y la funcionalidad asociada, pero está usando muchos de estos controles, usaría la tercera opción. De lo contrario, use el primero (o el segundo si está en 3.0).


En función de su comentario sobre una de las otras respuestas, este es un caso de pregunta "¿Cómo hago X con Y para lograr Z?" cuando realmente debería estar preguntando "¿Cómo logro Z?"

Si desea un botón para dibujar texto encima de una imagen en lugar de al lado, simplemente haga que la imagen sea la imagen de fondo del botón. Use setBackgroundImage:forState: lugar de setImage:forState: luego configure el título normalmente.

En cualquier caso, tendrá que dibujar la imagen en drawRect: o mover el texto a una subvista para dibujar sobre la imagen. La solución que mencioné es una versión de la segunda opción.


No es necesario que subcriba UIButton solo para agregarle texto. Aquí hay un ejemplo de cómo configurar el título del botón para un botón personalizado dentro del método -viewDidLoad de una subclase UIViewController:

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

También puede configurar la propiedad de fuente de su botón o cambiar el color usando -setTitleColor: forState :.


esto funciona bien para mí ... (ignore el complicado código de dibujo).

  1. Crear una subclase de UIButton
  2. Crea un UIButton en tu StoryBoard
  3. Vaya al Inspector de identidad y escriba el nombre de su clase de botón personalizado

aquí mi código UIButton:

h archivo:

#import <UIKit/UIKit.h> @interface DoneButton : UIButton @property (assign, nonatomic) BOOL selected; @end

m archivo:

#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]; } }

si se selecciona el botón, dibuje el primer código, de lo contrario, dibuje el otro código. prefiero este método porque utilizo Paint Code. así que esto ahorra mucho tiempo y no es necesario crear miles de pngs o jpegs.