1

myViewController.m で、 AlbumViewというカスタム UIView をサブビューとして追加しようとしています:

-(void)viewDidLoad {

 AlbumView *album = [[AlbumView alloc]init];

 [self.view addSubView:album];

 NSLog(@"album-frame: %@",NSStringFromCGRect(album.frame));

}

NSLog は印刷中です: album-frame:{{0, 0}, {0, 0}}

AlbumView クラスには次の Xib があるため、初期化に initWithFrame: メソッドを使用していなくても、アプリをビルドして実行すると、正しいサイズで表示されます。だから私は疑問に思っていました:

- viewDidLoad (または viewDidAppear) で NSLogging を行っているときに、正しいフレーム サイズにアクセスできなかったのはなぜですか?

ここに画像の説明を入力

編集:以下は Xib クラスです - AlbumView.m

-(void)setupView{

    [[NSBundle mainBundle] loadNibNamed:@"AlbumView" owner:self options:nil];
    [self addSubview:self.view]; //where self.view is IBOutlet connected with the actual Xib view I posted above 


}

-(id)initWithFrame:(CGRect)frame{
    if((self = [super initWithFrame:frame])){
        [self setupView];
    }

    return self;
}

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

    return self;
}


- (void) awakeFromNib
{
    [super awakeFromNib];

    [self addSubview:self.view];
}
4

2 に答える 2

1
// AlbumView.h

+ (instancetype)getView;

// AlbumView.m

+ (instancetype)getView {
    return [[[UINib nibWithNibName:@"AlbumView" bundle:nil] instantiateWithOwner:self options:nil] lastObject];
}

// myViewController.m

...

- (void)viewDidLoad {

 AlbumView *album = [AlbumView getView];

 [self.view addSubView:album];

 NSLog(@"album-frame: %@",NSStringFromCGRect(album.frame));

}

...
于 2013-03-30T18:30:45.227 に答える