如何在没有 IBOutlet 或标识符的情况下从 Storyboard 更新约束?

Posted

技术标签:

【中文标题】如何在没有 IBOutlet 或标识符的情况下从 Storyboard 更新约束?【英文标题】:How do I update a constraint from the Storyboard without an IBOutlet or Identifier? 【发布时间】:2017-12-22 05:13:04 【问题描述】:

我在情节提要中创建了很多视图,但我希望它们能够动态更新其约束,而不必每次都使用 IBOutlet。

我首先为要更新的视图的父视图创建一个自定义类,然后像这样更改其子视图的底部约束:

    myView.constraints.filter $0.firstAnchor is NSLayoutAttribute.bottom .constant -= 200

'NSLayoutAttribute.bottom' 似乎不是检查 Anchor 类型的正确方法。

如何检查要更改的约束类型?

我是否正确更新了我想要更改的视图的超级视图中的约束,而不是视图本身?

【问题讨论】:

为什么需要更新约束?有什么特殊要求吗? 更新后的约束将动态地将视图移出键盘;我希望这是一个自定义类,这样我就不必为每个不需要自定义实现的视图重写相同的功能 不更新约束,而是设置视图框架并使用uiview.animation 进行动画。 Refer here 【参考方案1】:

ios7 中的NSLayoutConstraint 有一个名为identifier 的属性,您可以通过代码或IB 设置此属性。 之后,要获得您正在寻找的约束,只需在特定视图中搜索它即可。 考虑这个UIView 扩展:

func constraint(withIdentifier:String) -> NSLayoutConstraint? 
        return constraints.filter $0.identifier == withIdentifier .first
    

【讨论】:

对,但我想避免为我想要此功能的所有视图创建标识符。有没有办法按约束类型搜索? 是的,检查这个答案***.com/questions/26833641/… 还有这个项目来自 Erica Sadun 在 GitHub github.com/erica/Auto-Layout-Demystified/tree/master/2ndEdition/…【参考方案2】:

根据 dahlia_boy 的建议,我使用 UIView.animate 来实现此功能,但它似乎不是永久性的:

translatesAutoresizingMaskIntoConstraints = true
UIView.animate(withDuration: 1, animations: 
    self.frame.size.height -= 200
)

【讨论】:

以上是关于如何在没有 IBOutlet 或标识符的情况下从 Storyboard 更新约束?的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有用户身份验证的情况下从 Spotify 或任何其他 API 获取歌曲预览

如何在没有 numpy 或 pandas 的情况下从文本文件计算平均值

如何在有或没有 SIMD 内在函数的情况下从 Zig 构建和链接到 CGLM

如何在没有开发人员帐户的情况下从 .app 文件构建 .ipa 文件?

如何在没有互联网连接的情况下从位置获取地址

如何在不使用 ImageView 的情况下从 API 端点下载图像或位图?