11

角が丸い長方形の非常に単純な 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」に設定しましたが、アプリを実行すると、四角形の角はまだ直角です。明らかな何かを見逃しましたか?

ありがとうジョナサン

4

5 に答える 5

23

iOS 5 以降では、サブクラス化する必要はまったくありません。Interface Builder からすべて実行できます。

  1. 変更する UIView を選択します。
  2. アイデンティティ インスペクタに移動します。
  3. "User Defined & Runtime Attributes" で、Key Path に "layer.cornerRadius" を追加します。Type は "Number" で、必要な設定は何でも構いません。
  4. 「layer.masksToBounds」もブール値として追加します。
  5. 終わり!サブクラス化なしで、すべて IB で。
于 2013-01-30T02:16:17.293 に答える
18

他の人はすでに質問に答えていますが、ペン先とコードで使用できるように、このようにリファクタリングします

#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
于 2012-04-17T12:03:32.417 に答える
10

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

于 2012-04-17T11:55:26.267 に答える
3

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

于 2012-04-17T11:55:52.267 に答える
0

UIView が Nib から読み込まれる場合は、メソッドを使用する必要があります

- (void)awakeFromNib
于 2014-12-18T03:23:04.747 に答える