2012-04-17 10 views
11

私は&を作成しようとしていますが、角が丸い四角形の非常に単純なUIViewサブクラスを使用しています。iOS - 角丸矩形のUIViewサブクラスを作成

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 

私は絵コンテでのiOS 5.1を使用していますし、中にカスタムクラスのプロパティを設定しているが、次のように私は、新しいクラスを作成しましたIBインスペクタウインドウを 'RoundedRect'に設定します。ただし、アプリを実行すると四角形が四角形になります。明白な何かを逃したことがありますか?

おかげ ジョナサン

答えて

9

ビューはXIBファイルからインスタンス化されるときinitWithFrameメソッドが呼び出されていません。代わりにinitWithCoder:イニシャライザが呼び出されるため、このメソッドで同じ初期化を実行する必要があります。

+0

多くの感謝を、使用する必要があります! –

+0

私は '-awakeFromNib'で追加の設定をする傾向があります。それに問題はありますか? – d11wtq

+1

違いは、すべてのオブジェクトがXIBからロードされると、 'awakeFromNib'が送信されることです。それは望まれているかもしれませんし、そうでないかもしれません、そして、私は多くの場合、全く問題ではないと思います。 – Krumelur

3

NIBファイルからロードされるビューの場合、指定された初期化子はinitWithCoder:です。この場合、initWithFame:は呼び出されません。

17

他の人がすでに質問に答えているが、私はニブでの使用を有効にするには、このようにそれをリファクタリングでしょうし、コード内のiOS 5では

#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

をしてまで、サブクラス化する必要は全くありません - あなたがすることができますInterface Builderからすべて実行します。

  1. 変更するUIViewを選択します。
  2. アイデンティティ・インスペクタに移動します。
  3. 「ユーザー定義の&ランタイム属性」で、キーパスに「layer.cornerRadius」を追加します。タイプには「番号」と必要な設定が必要です。
  4. また、 'layer.masksToBounds'をブール値として追加します。
  5. 完了!サブクラス化なしで、すべてIBで。
0

ペン先からのUIViewロードする場合は、法にトリックを行うの

- (void)awakeFromNib 
関連する問題