在 iOS7 中设置 NSLayoutConstraint 常量
Posted
技术标签:
【中文标题】在 iOS7 中设置 NSLayoutConstraint 常量【英文标题】:Set NSLayoutConstraint Constant in iOS7 【发布时间】:2015-06-29 16:30:37 【问题描述】:好的,我有一个非常奇怪的问题。我有一个 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。
有人知道这里发生了什么吗?
【问题讨论】:
您是否能够添加更多您调用它的类或如何设置约束?我已经创建了一个测试项目,我认为您正在尝试在这里实现github.com/b099l3/SO_TESTING,它似乎在 iOS7.1 模拟器和 iOS7 设备上运行正常。你能检查一下,看看你是否有类似的设置? 另外,您正在运行什么版本的 Xamarion.iOS?我有 Xamarin.iOS 版本:8.10.2.37 我正在使用 Xamarin.iOS 8.10。我检查了您发布到 GitHub 的代码,这几乎正是我们想要完成的。所以,这是一个好消息,它可以做到。我能看到的唯一主要区别是我们的布局完全是通过代码构建的,而不是 Xib 的。我们使用 MvvmCross 作为数据模型,但我上传了视图,以便您查看。如果你想看看,那张贴在bigclubdigital.com/DirecTV/MoviesView.cs.zip。谢谢! 我能够重现您所说的问题,但仍在尝试寻找解决方案。真的很奇怪 哇哦。我很高兴我没有疯。我已经开始做这件事好几个小时了,我看不出为什么 ContentOffset 会被重置。我认为这一定是对如何通过代码处理约束的一些基本误解。感谢您的观看。 【参考方案1】:好吧,我又看了看,似乎是在调用 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
然后我将滚动视图子类化并强制 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 ();
然后,您必须在视图加载时设置 contentSize,而不是在 ViewDidLayoutSubviews
中设置。
我已经用上面详述的解决方案更新了代码here,结果如下。
注意我更改了滚动代码,但它也可以与原始代码一起使用。
这适用于 iOS7 和 iOS8。希望这会有所帮助!
【讨论】:
以上是关于在 iOS7 中设置 NSLayoutConstraint 常量的主要内容,如果未能解决你的问题,请参考以下文章