2012-04-17 22 views
11

Próbuję utworzyć & użyć bardzo prostej podklasy UIView dla prostokąta z zaokrąglonymi narożnikami. I utworzeniu nowej klasy następująco:iOS - Utwórz podklasę UIView dla zaokrąglonego prostokąta

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 

używam iOS 5.1 z storyboardów i ustawiono właściwość niestandardowej klasy w okno inspektora IB do "RoundedRect", ale po uruchomieniu aplikacji prostokąt nadal ma kwadratowe rogi. Czy przegapiłem coś oczywistego?

Dzięki Jonathan

Odpowiedz

9

Sposób initWithFrame nie jest wywoływana, gdy widok jest tworzony z pliku XIB. Zamiast tego wywoływany jest inicjator initWithCoder:, więc w tej metodzie należy wykonać tę samą inicjalizację.

+0

Wielkie dzięki, że się robi trick! –

+0

Zwykle robię dodatkowe ustawienia w '-awakeFromNib'. Czy jest z tym jakiś problem? – d11wtq

+1

Różnica polega na tym, że 'awakeFromNib' jest wysyłany, gdy wszystkie obiekty zostały załadowane z XIB. Może, ale nie musi być to, co jest pożądane, i przypuszczam, że w wielu przypadkach nie ma to żadnego znaczenia. – Krumelur

3

Dla widoków załadowanych z pliku NIB wskazany inicjator to initWithCoder:. initWithFame: nie jest w tym przypadku wywoływana.

17

Pozostali chłopcy już odpowiedział na pytanie, ale chciałbym byłaby to tak, aby umożliwić korzystanie w śrucie iw kodzie

#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

W iOS 5 i do góry, nie ma absolutnie żadnej potrzeby, aby podklasy - można zrób to wszystko z programu Interface Builder.

  1. Wybierz UIView, który chcesz zmodyfikować.
  2. Przejdź do Inspektora tożsamości.
  3. W "Zdefiniowanych przez użytkownika Atrybutach wykonawczych &" dodaj "layer.cornerRadius" w ścieżce klucza, typem powinno być "Numer" i dowolne wymagane ustawienie.
  4. Dodaj również "layer.masksToBounds" jako Boolean.
  5. Gotowe! Bez podklasy i wszystko w IB.
0

Jeśli obciążenie UIView od nib, należy użyć metody

- (void)awakeFromNib 
Powiązane problemy