Nib加载会产生错误的帧大小

时间:2015-04-06 13:18:33

标签: ios objective-c xcode

我正在尝试创建一个要求用户的电子邮件的叠加层,我使用带有自己的自定义UIView类的笔尖设计它。重写的实例化方法就像这样

-(instancetype)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame: frame];
    if (self)
    {
        self = [[[NSBundle mainBundle] loadNibNamed:@"EmailOverlayView" owner: self options: nil] firstObject];
    }

    return self;
}

但每当我尝试在视图控制器中实例化视图时(这些都是nib加载,没有故事板),无论我放入的宽度和高度是什么值,视图都会完全忽略它们并放入600x600如果我使用大小类,或者如果我不使用大小类,则使用不正确的帧大小,这是令人难以置信的加重。我在viewDidAppear中创建了视图并注销了值来说明我的意思。

NSLog(@"%f, %f", self.view.frame.size.width, self.view.frame.size.height); --> 320.000000, 519.000000
CPREmailOverlayView *overlay = [[CPREmailOverlayView alloc] initWithFrame: CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height)]; 
[overlay layoutIfNeeded];
NSLog(@"%f, %f", overlay.frame.size.width, overlay.frame.size.height); --> 320.000000, 568.000000
[self.view addSubview: overlay];
[self.view bringSubviewToFront: overlay];

使用特定值创建视图令人难以置信的加剧,然后系统将它们更改为背后,所以任何帮助都会非常受欢迎,因为我不想以编程方式创建所有这些视图。

2 个答案:

答案 0 :(得分:1)

像这样修改你的代码:

[overlay setTranslatesAutoresizingMaskIntoConstraints:NO];
[self.view addSubview: overlay];
[self.view bringSubviewToFront: overlay];
[self activateConstraintsForView:overlay respectToParentView:self.view];

- (void)activateConstraintsForView:(UIView *)view respectToParentView:(UIView *)parentView
{
    NSLayoutConstraint *bottomConstraint = [NSLayoutConstraint constraintWithItem:view
                                                                    attribute:NSLayoutAttributeBottom
                                                                    relatedBy:NSLayoutRelationEqual
                                                                       toItem:parentView
                                                                    attribute:NSLayoutAttributeBottom
                                                                   multiplier:1.0
                                                                     constant:0];

    NSLayoutConstraint *topConstraint = [NSLayoutConstraint constraintWithItem:view
                                                                 attribute:NSLayoutAttributeTop
                                                                 relatedBy:NSLayoutRelationEqual
                                                                    toItem:parentView
                                                                 attribute:NSLayoutAttributeTop
                                                                multiplier:1.0
                                                                  constant:0];

    NSLayoutConstraint *leftConstraint = [NSLayoutConstraint constraintWithItem:view
                                                                  attribute:NSLayoutAttributeLeft
                                                                  relatedBy:NSLayoutRelationEqual
                                                                     toItem:parentView
                                                                  attribute:NSLayoutAttributeLeft
                                                                 multiplier:1.0
                                                                   constant:0];

    NSLayoutConstraint *rightConstraint = [NSLayoutConstraint constraintWithItem:view
                                                                   attribute:NSLayoutAttributeRight
                                                                   relatedBy:NSLayoutRelationEqual
                                                                      toItem:parentView
                                                                   attribute:NSLayoutAttributeRight
                                                                  multiplier:1.0
                                                                    constant:0];

    [NSLayoutConstraint activateConstraints:[NSArray arrayWithObjects:topConstraint, leftConstraint, bottomConstraint, rightConstraint, nil]] ;
}

此代码将生成您的overlay.frame = self.view.frame。 修改约束常数,以获得所需的宽度和高度。 希望能帮助到你。谢谢。 :)

答案 1 :(得分:1)

当谈到从Xibs加载的自定义UIView时,以下对我有用;

+ (id)view{
    NSArray *nibs = [[NSBundle mainBundle] loadNibNamed:@"yourXibName" owner:self options:nil];
    return (yourClassName *)[nibs objectAtIndex:0];
}

Class *view = [Class view];

然后你可以设置框架

view.frame = self.view.frame;