我有自定义uiview。我使用xib来布局子视图并添加约束来自动布局它们。在IB中打击它。
现在我有一些代码覆盖了initWithFrame:方法。 这是代码。
- (id)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
MyCustomView *view = [[NSBundle mainBundle] loadNibNamed:@"MyCustomView" owner:self options:nil].firstObject;
[self addSubview:view];
}
return self;
}
而且,在其他一些来源中,我使用上面定义的initWithFrame:方法创建它并将其添加到UIScrollView。我使用约束来让scrollview的框架适合屏幕尺寸。代码在这里。
CGRect contentRect = CGRectZero;
for (int index = 0;index < self.valueData.count;index ++) {
MyCustomView *cellView = [[MyCustomView alloc] initWithFrame:CGRectMake(0, CUSTOM_VIEW_HEIGHT * index, SCREEN_WIDTH, CUSTOM_VIEW_HEIGHT)];
[self.scrollView addSubview:cellView];
contentRect = CGRectUnion(contentRect, cellView.frame);
}
self.scrollView.contentSize = contentRect.size;
我在iPhone 5s模拟器中看到了什么:
但是在iPhone 6模拟器中:
虽然我将帧的宽度设置为SCREEN_WIDTH,但它们没有占据整个屏幕的宽度,这是定义的:
#define SCREEN_WIDTH ([UIScreen mainScreen].bounds.size.width)
如何设置这些自定义视图的宽度以适应多个设备中的屏幕宽度?
答案 0 :(得分:2)
混合使用Autolayout和setFrame通常是一个坏主意,当您尝试调试时会导致很多痛苦。你有没看过自动生成的约束呢?#34; Capture View Hierarchy&#34;?
您真正想要做的不是依赖于生成的约束(特别是因为在显示之前您不能依赖视图/窗口大小)。实际上,您需要做一些非常重要的事情:
答案 1 :(得分:0)
在
处设置断点self.scrollView.contentSize = contentRect.size;
你会看到尺寸错误。
当您在xib中添加约束时,一旦调用了addSubView,它就会覆盖[super initWithFrame:]。这就是屏幕尺寸不起作用的原因。
您的约束看起来正确,请尝试将scrollView的contentSize设置为屏幕大小。
答案 2 :(得分:0)
添加以下方法并在添加子视图后调用它。
-(void)addBasicConstraintsOnSubView:(UIView *)subView onSuperView:(UIView *)superView
{
[subView setTranslatesAutoresizingMaskIntoConstraints:NO];
[superView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:[NSString stringWithFormat:@"V:|-%f-[subView]-0-|",subView.frame.origin.y] options: NSLayoutFormatAlignmentMask metrics:nil views:NSDictionaryOfVariableBindings(subView)]];
[superView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:[NSString stringWithFormat:@"|-%f-[subView]-%f-|",subView.frame.origin.x,subView.frame.origin.x] options: NSLayoutFormatAlignmentMask metrics:nil views:NSDictionaryOfVariableBindings(subView)]];
}