无法更改自定义视图的框架大小

Can not change custom view's frame size

我有一个自定义的 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。我使用约束让滚动视图的框架适合屏幕尺寸。代码在这里。

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)

如何设置这些自定义视图的宽度以适合多个设备的屏幕宽度?

已添加: 这是自定义视图中 UI 内容的所有约束。

混合使用 Autolayout 和 setFrame 通常不是一个好主意,这会在您尝试调试时带来很多麻烦。您是否查看过 "Capture View Hierarchy" 自动生成的约束条件?

您真正想要做的不是依赖于生成的约束(特别是因为您不能依赖 view/window 显示之前的大小)。实际上,您需要做一些非常重要的事情:

  1. 不要将多个视图直接附加到滚动视图。你想要一个 附加到滚动视图的视图,以及其他所有内容作为的子视图 那。我通常称之为内容视图。
  2. 确保您的内容视图正确附加到您的滚动视图之前 添加其他内容(无 errors/warnings)。
  3. 插入带约束的资产视图。 0 向右和向左,0 向 最后的看法。不管你是使用 constraintWithItem 还是 constraintsWithVisualFormat.
  4. 将内容视图的底部与最后插入的子视图联系起来,使其具有 定义的高度,删除或降低任何其他高度限制的优先级。

设置断点
self.scrollView.contentSize = contentRect.size;

你会发现尺寸不对。

当您在 xib 中添加约束时,它会在调用 addSubView 后覆盖 [super initWithFrame:]。这就是屏​​幕尺寸不受影响的原因。

你的约束看起来是对的,尝试将scrollView的contentSize设为屏幕尺寸。

添加下面的方法,添加子视图后调用

-(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)]];
}