带AutoLayout的UIScrollView无法按预期工作

时间:2013-07-02 08:54:27

标签: iphone uiscrollview xamarin.ios interface-builder autolayout

我有UIViewController,其结构如下:

查看   - >滚动型     - >视图       - >各种各样的东西

我认为最好将“各种各样的东西”放在scrollview中的视图中。一切都运作良好,直到我不得不支持iPhone 5并使用AutoLayout。现在,滚动视图已成为我存在的祸根。

如何让scrollview正确滚动?我已经尝试了各种各样的方式,它只是无法正常工作,或者如果它工作,它不断想要滚动到顶部或当导航回屏幕时内容偏移是错误的。

目前我有以下内容使scrollview半工作:

public override void ViewDidLayoutSubviews()
{
    base.ViewDidLayoutSubviews();
    View.LayoutIfNeeded();
    scrollView.ContentSize = scrollView.Subviews[0].Frame.Size;
}

使用AutoLayout执行此操作的正确方法是什么?它不是那么难!必须有一种方法可以用IB或代码来实现它......

4 个答案:

答案 0 :(得分:1)

该功能是不必要的。如果您正在使用IB,请确保UIScrollView的“Bottom Space to:View”约束等于Default。您可以通过在编辑约束时选中“标准”复选框来执行此操作。

如果您从起始位置滚动,导航到另一个页面并导航回来,UIScrollView仍会表现得很奇怪。您可以通过在ViewWillAppear中将UIScrollView的contentOffset重置为(0,0)来解决此问题:

public override void ViewWillAppear(bool animated)
    {
        base.ViewWillAppear(animated);
        scrollView.ContentOffset = new PointF(0, 0);
    }

答案 1 :(得分:0)

因此,您需要做的就是让UIScrollView和AutoLayout很好地协同工作:

  • 创建UIScrollView并将约束附加到其父视图
  • 添加您的子视图。要使AutoLayout能够知道contentView的大小,需要从上到下,从左到右进行约束。另一种(更简单但不太漂亮)解决此问题的方法是在滚动视图中添加UIView并固定其宽度和/或高度。将UIScrollView的真实内容添加到UIView

一旦掌握了它,系统就很棒了。祝你好运!

答案 2 :(得分:0)

我认为你在那里进行的功能是不必要的,关于Autolayout系统试图用你的观点完成什么,你可能会遗漏一些东西。

在搜索之后,我找到了几个线程。

this,接受的解决方案是使用viewDidLayoutSubviews更改布局后的contentSize 。看似hacky。

总的来说,here是对你在AutoLayout中使用ScrollViews做什么的一般描述,他链接到the iOS 6 release notes(搜索UIScrollView),其中Apple提供了几个如何正确制作ScrollViews的示例。我相信你能够用它处理它。

此外,虽然你的问题并不完全清楚,但如果你认为你的布局约束可能会破坏,你可以在调试器中看到这个输出 - 很好的大块语句准确说明不能满足哪些约束条件为什么,在经过一些破译后,可能会指出问题的根源。这根本不相关,因为听起来你根本就不使用系统,但它可能没有你的数据。

祝你好运!

答案 3 :(得分:0)

最好的方法是在viewDidAppear设置contentSize,这样就可以否定autolayout的影响。

-(void)viewDidAppear:(BOOL)animated
{
     [super viewDidAppear:animated];
     [yourScrollView setContentSize:(CGSizeMake(320, 400))];
}