15

初期化中にプログラムでサブビューを追加するカスタム UIView サブクラスがあります。このサブビューをカスタム UIView と同じ幅にしたいと考えています。

プログラムでカスタム UIView を追加すると、私のコードは正常に動作します。ただし、StoryBoardを介して UIView を初期化すると、カスタム UIView の幅を取得できません。

// Init programatically
- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        NSLog (@"view: %f", self.frame.size.width);   //WILL return width
        NSLog (@"view: %f", self.bounds.size.width);  //WILL return width
    }
    return self;
}

// Init from storyboard
- (id)initWithCoder:(NSCoder *)aDecoder {
    self = [super initWithCoder:aDecoder];
    if (self) {

        NSLog (@"view: %f", self.frame.size.width);   //Returns 0
        NSLog (@"view: %f", self.bounds.size.width);  //Returns 0
    }
    return self;
}

initWithCoder: が StoryBoard によって実行されると、UIView のフレームと境界がすべて 0 として返されます。initWithCoder内でUIView のディメンションにアクセスする方法はありますか?? または、少なくともdrawRect: が呼び出される前に寸法にアクセスしますか?

ありがとう。

4

2 に答える 2

13

init 関数でサブビューのサイズを設定するのではなく、カスタム ビューの layoutSubviews メソッドでカスタム ビューに対して相対的に設定します。ここでこれを行うと、初期化後の任意の時点でカスタム ビューのサイズを変更した場合でも、サブビューの幅も常にカスタム ビューの幅に合わせて変更されます。

于 2013-03-02T09:21:29.387 に答える
2

通常の通話を再利用できますinitWithFrame

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

        [self initWithFrame:[self frame]];

        NSLog (@"view: %f", self.frame.size.width);   
        NSLog (@"view: %f", self.bounds.size.width); 
    }
    return self;
}
于 2013-03-02T04:11:57.417 に答える