2

你好我有一个自动布局问题UIScrollViewModalViewController。这是我的编码步骤作为示例代码:

1)我有UIViewController一个UIScrollViewassubView

UIViewController *viewController = [[UIViewController alloc] init];
UIScrollView *scrollView = [[UIScrollView alloc] init];

scrollView.translatesAutoresizingMaskIntoConstraints = NO;
[viewController.view addSubview:scrollView];

UIView *superView = viewController.view;
NSDictionary *viewsDict = NSDictionaryOfVariableBindings(superView,scrollView);

[superView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[scrollView(==superView)]|"
                                                                  options:0
                                                                  metrics:nil
                                                                    views:viewsDict]];
[superView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[scrollView(==superView)]|"
                                                                  options:0
                                                                  metrics:nil
                                                                    views:viewsDict]];

这行得通

2)我添加2个子视图scrollView

UIView *view1 = [[UIView alloc] init];
view1.backgroundColor = [UIColor redColor];
view1.translatesAutoresizingMaskIntoConstraints = NO;
[scrollView addSubview:view1];


UIView *view2 = [[UIView alloc] init];
view2.backgroundColor = [UIColor greenColor];
view2.translatesAutoresizingMaskIntoConstraints = NO;
[scrollView addSubview:view2];

viewsDict = NSDictionaryOfVariableBindings(scrollView,view1,view2);


[scrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[view1(==scrollView)]|"
                                                                   options:0
                                                                   metrics:nil
                                                                     views:viewsDict]];
[scrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[view2(==scrollView)]|"
                                                                   options:0
                                                                   metrics:nil
                                                                     views:viewsDict]];

[scrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[view1(180)][view2(==scrollView)]|"
                                                                   options:0
                                                                   metrics:nil
                                                                     views:viewsDict]];


UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[btn setTitle:@"open" forState:UIControlStateNormal];
btn.frame = CGRectMake(10, 10, 100, 100);
[view2 addSubview:btn];
[btn addTarget:self action:@selector(openPopOver) forControlEvents:UIControlEventTouchUpInside];

这也很好

3)我滚动到内容偏移 y 180,我只能看到 view2

[scrollView setContentOffset:CGPointMake(0, 180) animated:YES];

4)我ModalViewController在`ViewController上打开一个

- (void)openModal{
UIViewController *viewController = [[UIViewController alloc] init];

UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[btn setTitle:@"close" forState:UIControlStateNormal];
btn.frame = CGRectMake(10, 10, 100, 100);
[viewController.view addSubview:btn];
[btn addTarget:self action:@selector(closePopOver) forControlEvents:UIControlEventTouchUpInside];


[self presentViewController:viewController animated:YES completion:nil];

}

5)当我关闭ModalViewController我的布局scrollView不起作用时,它会滚动到我没有设置的不同内容偏移量。当我将内容偏移量重置为 y 180 时,滚动视图的内容大小是错误的。

- (void)closeModal{
[self dismissViewControllerAnimated:YES completion:^{

}];

}

我希望有人可以帮助我解决这个问题。

4

3 回答 3

6

我认为这可能是 iOS 自动布局 wrt UIScrollViews 中的一个错误。仅在我的情况下我遇到了类似的问题,我会推送到详细视图,然后弹回作为 UIScrollView 的主视图。滚动视图中的内容将向上移动。将滚动视图滚动到顶部,然后再次推送和弹出,事情将被正确重置。

我什至尝试了使用 UIScrollView 而不是表视图作为主视图的开箱即用主细节应用程序,并且能够证明该缺陷。

表视图和集合视图似乎没有这个问题。

于 2013-03-21T22:38:27.490 回答
3

也许您可以在viewWillAppear? 你已经实施了-(void)layoutsubviews吗?

于 2012-09-20T09:06:52.760 回答
3

UIViewController'presentViewController:方法的文档中:

此方法将presentedViewController 属性设置为指定的视图控制器,调整该视图控制器的视图大小,然后将该视图添加到视图层次结构中。视图根据呈现的视图控制器的 modalTransitionStyle 属性中指定的过渡样式在屏幕上进行动画处理。

因此,您的视图控制器的大小调整是有意的。好吧,无论如何,苹果公司。

解决这个问题的一种方法是记录调整大小的视图的坐标并推断出究竟发生了什么变化。也许您可以调整约束以防止这种情况发生。

或者,您可以尝试在此方法的完成处理程序中调整所有内容的大小。

于 2012-09-20T10:12:34.837 回答