在 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。希望这对您有所帮助!
好的,我有一个超级奇怪的问题。我有一个 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 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。希望这对您有所帮助!