在 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 常量的主要内容,如果未能解决你的问题,请参考以下文章

在 ios7 xcode 中设置相机焦点。 opencv

ios7 - 故事板 - 无法在我的视图控制器中设置导航栏

在 iOS 7 中设置导航栏图像

如何在 iOS 7 中设置导航栏的色调颜色

在 iOS 7 中设置方向

导航栏 Alpha 值未在 iOS 7 中设置