在iOS7中设置NSLayoutConstraint Constant

时间:2015-06-29 16:30:37

标签: ios uiscrollview xamarin nslayoutconstraint

好的,我有一个非常奇怪的问题。我有一个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。

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

1 个答案:

答案 0 :(得分:0)

好的我再看一下,似乎在调用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,结果如下。 result

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

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