ScrollView的iOS AutoLayout问题

时间:2012-09-20 08:57:21

标签: iphone ios uiscrollview modalviewcontroller autolayout

您好我的UIScrollViewModalViewController存在自动布局问题。 以下是我的编码步骤作为示例代码:

1)我的UIViewController UIScrollViewsubView

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)我向scrollView

添加了2个子视图
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)我在`ViewController

上打开ModalViewController
- (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 - (void)closeModal{ [self dismissViewControllerAnimated:YES completion:^{ }]; 上的布局不起作用时,它会滚动到我未设置的不同内容偏移量。当我将内容偏移重置为y 180时,滚动视图的内容大小是错误的。

{{1}}

}

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

3 个答案:

答案 0 :(得分:6)

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

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

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

答案 1 :(得分:3)

也许你可以重置viewWillAppear中的内容偏移? 您是否已实施-(void)layoutsubviews

答案 2 :(得分:3)

来自UIViewControllerpresentViewController:方法的文档:

  

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

因此,您希望调整视图控制器的大小。好吧,无论如何,由Apple。

解决此问题的一种方法是记录调整大小的视图的坐标并推断确切的更改内容。也许您可以通过某种方式调整约束来防止这种情况发生。

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