#import "CustomView.h" @implementation CustomView #pragma mark - Object lifecycle - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { [self setup]; } return self; } - (id)initWithCoder:(NSCoder *)aDecoder { self = [super initWithCoder:aDecoder]; if (self) { [self setup]; } return self; } #pragma mark - Private & helper methods - (void)setup { if (self.subviews.count == 0) { [[NSBundle mainBundle] loadNibNamed:@"CustomView" owner:self options:nil]; self.bounds = self.view.bounds; [self addSubview:self.view]; } } @end
在我想要添加这个自定义UIView的UIViewController中,我已经创建了虚拟UIView(我在Interface Builder中设置了大小),我想添加我的CustomView,我希望我的CustomView适合我的容器视图的边界.
我正试图这样做:
_vCustomView = [[CustomView alloc] init]; _vCustomView.translatesAutoresizingMaskIntoConstraints = NO; [_vContainer addSubview:_vCustomView]; [_vContainer addConstraint:[NSLayoutConstraint constraintWithItem:_vCustomView attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:_vContainer attribute:NSLayoutAttributeLeft multiplier:1.0 constant:0.0]]; [_vContainer addConstraint:[NSLayoutConstraint constraintWithItem:_vCustomView attribute:NSLayoutAttributeRight relatedBy:NSLayoutRelationEqual toItem:_vContainer attribute:NSLayoutAttributeRight multiplier:1.0 constant:0.0]]; [_vContainer addConstraint:[NSLayoutConstraint constraintWithItem:_vCustomView attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:_vContainer attribute:NSLayoutAttributeTop multiplier:1.0 constant:0.0]]; [_vContainer addConstraint:[NSLayoutConstraint constraintWithItem:_vCustomView attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:_vContainer attribute:NSLayoutAttributeBottom multiplier:1.0 constant:0.0]];
但没有运气.假设我的容器视图是300 x 100,当我添加自定义UIView时,我的自定义视图仍然是150 x 50.
我试图在没有容器视图的情况下工作 – 将我的自定义UIView对象直接添加到我的UIViewController的self.view中,并将其宽度和高度设置为:
> autoLayout约束
>在初始化我的自定义UIView时使用initWithFrame
但再次 – 没有运气.自定义视图始终为150 x 50.
有人可以向我解释如何以编程方式添加我在XIB中制作的自定义UIView,并使用autoLayout约束调整大小?
提前谢谢了.
编辑#1:尝试在我的CustomView上运行Andrea的代码时遇到错误
Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand,refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) ( "<NSLayoutConstraint:0x17489b760 V:[UIView:0x17418d820(91)]>","<NSLayoutConstraint:0x170c9bf80 V:|-(0)-[CustomView:0x1741da7c0] (Names: '|':CustomView:0x1741da8b0 )>","<NSLayoutConstraint:0x170c9bfd0 V:[CustomView:0x1741da7c0]-(0)-| (Names: '|':CustomView:0x1741da8b0 )>","<NSLayoutConstraint:0x170c9be90 V:|-(0)-[CustomView:0x1741da8b0] (Names: '|':UIView:0x17418d820 )>","<NSLayoutConstraint:0x170c9bee0 CustomView:0x1741da8b0.bottom == UIView:0x17418d820.bottom>","<NSAutoresizingMaskLayoutConstraint:0x170c9dba0 h=--& v=--& CustomView:0x1741da7c0.midY == + 25.0>" ) Will attempt to recover by breaking constraint <NSLayoutConstraint:0x170c9bfd0 V:[CustomView:0x1741da7c0]-(0)-| (Names: '|':CustomView:0x1741da8b0 )>
编辑#2:它的作品!
之后@Andrea补充说:
view.translatesAutoresizingMaskIntoConstraints = NO;
在他的:
- (void) stretchToSuperView:(UIView*) view;
方法,一切都像我所料.
感谢@Andrea.
解决方法
在你添加子视图init方法后,请调用该方法,传递xib的视图:
- (void) stretchToSuperView:(UIView*) view { view.translatesAutoresizingMaskIntoConstraints = NO; NSDictionary *bindings = NSDictionaryOfVariableBindings(view); NSString *formatTemplate = @"%@:|[view]|"; for (NSString * axis in @[@"H",@"V"]) { NSString * format = [NSString stringWithFormat:formatTemplate,axis]; NSArray * constraints = [NSLayoutConstraint constraintsWithVisualFormat:format options:0 metrics:nil views:bindings]; [view.superview addConstraints:constraints]; } }
[编辑]
您的设置代码应如下所示:
- (void)setup { if (self.subviews.count == 0) { [[NSBundle mainBundle] loadNibNamed:@"CustomView" owner:self options:nil]; self.bounds = self.view.bounds; [self addSubview:self.view]; [self stretchToSuperView:self.view]; } }
注意里面的拉伸视图我添加了view.translatesAutoresizingMaskIntoConstraints = NO;
[编辑2]
我会尝试根据要求详细说明我的答案.使用autolayout,当您添加视图而不设置约束时,autolayout会自动将自动调整掩码转换为约束,其默认属性为UIViewAutoresizingNone,这意味着不自动调整.
您的XIB视图已被添加到其父级,没有约束,并且没有自动调整的可能性,因此保持其原始大小.由于您希望您的观点根据您的观点调整大小,您有两种选择:
>将xib视图的自动调整掩码更改为灵活的宽度和高度,但需要匹配父大小,否则将不会有完整的封面
>添加一些约束,使两个视图的约束相应地更改为父更改.而您在xib视图和其父视图之间实现了这一点,即尾部/前导和顶部/底部之间的间距为0.就像您在其边框上粘贴一些胶水.要做到这一点,您需要将自动转换调整大小面罩设置为约束到否,或者您可以在日志中发布一些冲突.
您以后要做的是将视图(承载xib视图)的约束添加到其超级视图中,但是xib及其父级之间没有约束,因此autolayout不知道如何调整xib视图的大小.视图层次结构中的每个视图都应该有自己的约束.希望这有助于更好地了解.