无法更改自定义视图的框架大小
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 显示之前的大小)。实际上,您需要做一些非常重要的事情:
- 不要将多个视图直接附加到滚动视图。你想要一个
附加到滚动视图的视图,以及其他所有内容作为的子视图
那。我通常称之为内容视图。
- 确保您的内容视图正确附加到您的滚动视图之前
添加其他内容(无 errors/warnings)。
- 插入带约束的资产视图。 0 向右和向左,0 向
最后的看法。不管你是使用 constraintWithItem 还是
constraintsWithVisualFormat.
- 将内容视图的底部与最后插入的子视图联系起来,使其具有
定义的高度,删除或降低任何其他高度限制的优先级。
在
设置断点
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)]];
}
我有一个自定义的 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 显示之前的大小)。实际上,您需要做一些非常重要的事情:
- 不要将多个视图直接附加到滚动视图。你想要一个 附加到滚动视图的视图,以及其他所有内容作为的子视图 那。我通常称之为内容视图。
- 确保您的内容视图正确附加到您的滚动视图之前 添加其他内容(无 errors/warnings)。
- 插入带约束的资产视图。 0 向右和向左,0 向 最后的看法。不管你是使用 constraintWithItem 还是 constraintsWithVisualFormat.
- 将内容视图的底部与最后插入的子视图联系起来,使其具有 定义的高度,删除或降低任何其他高度限制的优先级。
在
设置断点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)]];
}