2012-04-17 16 views
11

Estoy tratando de crear & use una subclase UIView muy simple para un rectángulo con esquinas redondeadas. He creado una nueva clase de la siguiente manera:iOS - Crear la subclase UIView para el rectángulo redondeado

RoundedRect.h

#import <UIKit/UIKit.h> 
#import <QuartzCore/QuartzCore.h> 

@interface RoundedRect : UIView 
@end 

RoundedRect.m

#import "RoundedRect.h" 

@implementation RoundedRect 

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     // Initialization code 
     [[self layer] setCornerRadius:10.0f]; 
     [[self layer] setMasksToBounds:YES]; 
    } 
    return self; 
} 
@end 

estoy usando iOS 5.1 con guiones y ha establecido la propiedad de clase personalizada la ventana del inspector de IB a 'RoundedRect', pero cuando ejecuto la aplicación el rectángulo todavía tiene esquinas cuadradas. ¿Me he perdido algo obvio?

Gracias Jonathan

Respuesta

9

El método initWithFrame no se llama cuando la vista se crea una instancia de un archivo XI ter. En su lugar, se llama al inicializador initWithCoder:, por lo que debe realizar la misma inicialización en este método.

+0

Muchas gracias, eso se hace el truco! –

+0

Tiendo a hacer configuraciones adicionales en '-awakeFromNib'. ¿Hay algún problema con eso? – d11wtq

+1

La diferencia es que 'awakeFromNib' se envía una vez que todos los objetos se han cargado desde el XIB. Puede o no ser lo que se desea, y supongo que en muchos casos no importa en absoluto. – Krumelur

3

Para las vistas que se cargan desde un archivo NIB, el inicializador designado es initWithCoder:. initWithFame: no se llama en este caso.

17

Los otros chicos ya han respondido a la pregunta pero yo refactorearlo como esto para permitir su uso en puntas y en el código

#import "RoundedRect.h" 

@implementation RoundedRect 

- (id)initWithFrame:(CGRect)frame; 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     [self commonInit]; 
    } 
    return self; 
} 

- (id)initWithCoder:(NSCoder *)aDecoder; 
{ 
    self = [super initWithCoder:aDecoder]; 
    if (self) { 
     [self commonInit]; 
    } 
    return self; 
} 

- (void)commonInit; 
{ 
    CALayer *layer = self.layer; 
    layer.cornerRadius = 10.0f; 
    layer.masksToBounds = YES; 
} 

@end 
22

En iOS 5 en adelante, no hay absolutamente ninguna necesidad de subclase - se puede hazlo todo desde Interface Builder.

  1. Seleccione la UIView que desea modificar.
  2. Vaya al Inspector de identidad.
  3. En "Definido por el usuario & Runtime Attributes", agregue "layer.cornerRadius" en Key Path, Type debe ser "Number" y cualquier ajuste que necesite.
  4. También agregue 'layer.masksToBounds' como Boolean.
  5. ¡Listo! Sin subclases, y todo en IB.
0

Si la carga UIView a partir de cacao, se debe utilizar el método

- (void)awakeFromNib 
Cuestiones relacionadas