initWithCoder在ios中显示错误的帧

时间:2015-06-11 10:51:50

标签: ios iphone xcode autolayout uistoryboard

我在项目中使用故事板。故事板具有自动布局的自定义视图。

CustomView.h

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

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

如果我运行应用程序,它会显示错误的框架。

帮我解决这个问题

2 个答案:

答案 0 :(得分:2)

因为在initWithCoder中,constraints尚未应用于视图。

示例:

代码

-(void)viewDidAppear:(BOOL)animated{
    NSLog (@"viewDidAppear: %f", self.testview.frame.size.width);
}
-(void)viewDidLayoutSubviews{
    NSLog (@"viewDidLayoutSubviews: %f", self.testview.frame.size.width);
}
-(void)awakeFromNib{
    NSLog (@"awakeFromNib: %f", self.testview.frame.size.width);
}
-(instancetype)initWithCoder:(NSCoder *)aDecoder{
    if (self = [super initWithCoder:aDecoder]) {
        NSLog (@"initWithCoder: %f", self.testview.frame.size.width);
    }
    return self;
}

并记录

2015-06-11 19:09:27.647 OCTest[717:20692] initWithCoder: 0.000000
2015-06-11 19:09:27.649 OCTest[717:20692] awakeFromNib: 0.000000
2015-06-11 19:09:27.696 OCTest[717:20692] viewDidLayoutSubviews: 320.000000
2015-06-11 19:09:27.746 OCTest[717:20692] viewDidAppear: 320.000000

答案 1 :(得分:0)

我遇到了同样的问题,如果你想在InitWithCoder方法中取屏幕的大小 - 这样做吧

CGFloat x = [UIScreen mainScreen].bounds.size.width;
CGFloat y = [UIScreen mainScreen].bounds.size.height;

不是来自UIView尚未存在的界限,而是来自UIScreen。