我正在尝试创建一个要求用户的电子邮件的叠加层,我使用带有自己的自定义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];
使用特定值创建视图令人难以置信的加剧,然后系统将它们更改为背后,所以任何帮助都会非常受欢迎,因为我不想以编程方式创建所有这些视图。
答案 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;