在 iOS7 中设置 NSLayoutConstraint 常量

Set NSLayoutConstraint Constant in iOS7

好的,我有一个超级奇怪的问题。我有一个 UIScrollView,我用它来更新第二个 UIView 的位置。因此,当您滚动 UIScrollView 时,UIView 也会按比例移动,但速度较慢。代码很简单。

Scroller.Scrolled += delegate {
  if (Scroller.ContentOffset.Y <= 0) {
    filtersTop.Constant = 0;
  } else {
     filtersTop.Constant = -(Scroller.ContentOffset.Y / 2);
  }
}

filtersTop 是一个 NSLayoutConstraint。 Scroller 就是 UIScrollView.

问题是每当我将 filtersTop.Constant 设置为从 Scroller.Content.Y 派生的任何值时,它仅在 iOS7 中将 Scroll.ContentOffset 重置为 0。此代码在 iOS8+ 中运行良好。我已经尝试了十几种变体。如果我将 filtersTop.Constant 设置为一个静态数字(即:123.5),就可以了。

我试过将值保存到一个变量并强制类型认为它可能被不正确地转换。如果我找出价值,它就会起作用。但是,当我将其设置为 filtersTop.Constant 时,它会再次重置 Scroller.ConstentOffset.Y。滚动条和过滤器不相关。它们不以任何方式嵌套或相互关联。所以,我不知道为什么在过滤器的约束上设置常量会以任何方式影响 Scroller。

有人知道这里发生了什么吗?

好吧,我又看了一遍,似乎在调用 ViewWillLayoutSubviews 和调用 ViewDidLayoutSubviews

之间重置了 contentSize
ContentSize set to: {Width=320, Height=3000}
Called ViewWillLayoutSubviews
ContentSize set to: {Width=320, Height=3000}
ContentSize set to: {Width=0, Height=0}
Called ViewDidLayoutSubviews

然后我将 scrollview 子类化并强制 contentSize 保持不变,如下所示:

public class CustomScroller : UIScrollView
{
    public CustomScroller ()
    {
        ContentSize = new CGSize(320,3000);
    }

    public override CGSize ContentSize {
        get {
            return base.ContentSize;//new CGSize(320,3000);
        }
        set {
            base.ContentSize = new CGSize(320,3000);

            Console.WriteLine ("ContentSize set to: "+ContentSize);
        }
    }

    public override void LayoutSubviews ()
    {
        Console.WriteLine ("LayoutSubviews: "+Frame.Y);
        base.LayoutSubviews ();
    }
}

然后您必须在加载视图时而不是在 ViewDidLayoutSubviews 中设置 contentSize。

我已经用上面详述的解决方案更新了代码 here,结果如下。

注意我更改了滚动代码,但它也适用于原始代码。

这适用于 iOS7 和 iOS8。希望这对您有所帮助!