2012-04-17 14 views
11

Ich versuche zu erstellen & Verwenden Sie eine sehr einfache UIView Unterklasse für ein Rechteck mit abgerundeten Ecken. Ich habe eine neue Klasse wie folgt erstellt:iOS - Erstellen UIView Unterklasse für abgerundetes Rechteck

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 

Ich bin mit iOS 5.1 mit Storyboards und haben die benutzerdefinierte Klasse Eigenschaft in das IB-Inspektorfenster auf "RoundedRect", aber wenn ich die App starte, hat das Rechteck noch quadratische Ecken. Habe ich etwas Offensichtliches verpasst?

Dank Jonathan

Antwort

9

Die initWithFrame Methode wird nicht aufgerufen, wenn die Ansicht von einer XIB-Datei instanziiert wird. Stattdessen wird der Initialisierer initWithCoder: aufgerufen, daher müssen Sie in dieser Methode dieselbe Initialisierung durchführen.

+0

Vielen Dank verwenden sollte, das ist der Trick gemacht! –

+0

Ich neige dazu, zusätzliche Einstellungen in '-awakeFromNib' vorzunehmen. Gibt es ein Problem damit? – d11wtq

+1

Der Unterschied ist, dass 'watchFromNib' gesendet wird, sobald alle Objekte von der XIB geladen wurden. Es kann oder darf nicht sein, was gewünscht wird, und ich nehme an, dass es in vielen Fällen überhaupt keine Rolle spielt. – Krumelur

3

Für Ansichten, die aus einer NIB-Datei geladen werden, ist der angegebene Initialisierer initWithCoder:. initWithFame: wird in diesem Fall nicht aufgerufen.

17

Die anderen Jungs haben bereits beantwortet die Frage, aber ich würde es Refactoring wie diese Verwendung in Nibs zu aktivieren und in Code

#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

In iOS 5 und höher, gibt es absolut keine Notwendigkeit, eine Unterklasse - Sie können Mach alles aus dem Interface Builder.

  1. Wählen Sie die UIView aus, die Sie ändern möchten.
  2. Gehen Sie zum Identity Inspector.
  3. Fügen Sie unter "Benutzerdefiniert & Laufzeitattribute" "layer.cornerRadius" im Schlüsselpfad hinzu. Geben Sie "Nummer" und die von Ihnen gewünschte Einstellung ein.
  4. Fügen Sie auch 'layer.masksToBounds' als Boolean hinzu.
  5. Fertig! Ohne Unterklassen und alle in IB.
0

Wenn UIView Last von Nib, Sie Methode

- (void)awakeFromNib 
Verwandte Themen