@IBDesignable - 视图无法按预期呈现

GoG*_*een 5 ios swift

我有一个自定义UIView子类,我试图使用它@IBDesignable.

我有一个@IBInspectable名为的属性image,我从界面构建器设置.

当我打开界面构建器时image,我选择的东西在视图中没有正确呈现,也就是说,它看起来像autolayout有些麻烦.当我检查时,Report navigator我在Interface Builder小组中收到警告.

Showing All Messages
(null): -pie being ignored. It is only used when linking a main executable
Run Code Online (Sandbox Code Playgroud)

这发生在该Link <IBDESIGNABLE_EXECUTABLE>部分下.

我不知道如何解决这个问题.尝试了SO的许多解决方案.清理构建文件夹,清除派生数据等.没有任何效果.

请提供您宝贵的意见或解决此问题的方法.谢谢!:)

编辑:

感谢@Rob,我可以解决这个问题.

是)我有的:

IBDesignable UIView具有属性的子类:

  • 一个@IBInspectable名为的财产image.
  • 一个ImageView
  • 一个ScrollView

我初始化并添加ScrollView和ImageViews作为子视图使用

required public init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    initialiseImageView()
}

override init(frame: CGRect) {
    super.init(frame: frame)
    initialiseImageView()
}
Run Code Online (Sandbox Code Playgroud)

问题:

initialiseImageView():
我添加scrollViewas子视图UIViewImageView作为子视图scrollView使用viewForZooming委托.我还添加了约束来保持视图到位.
问题是当我使用时:

self.translatesAutoresizingMaskIntoConstraints = false
Run Code Online (Sandbox Code Playgroud)

如果我使用它,我会在运行时收到autolayout警告.但是,虽然图像被正确呈现,但它imageView被放错了地方interface builder.

如果我评论相同,一切都如预期的那样interface builder.但由于UI,UI在运行时中断AutoresizingMaskIntoConstraints.


我在github中有代码.我正在尝试在TN2154中提到的后一种方法

我将所有设置AutoresizingMaskIntoConstraints为false并在代码本身中添加子视图的约束.UIView子类的约束直接添加到接口构建器中,截至目前不存在警告.代码在运行时也按预期工作.该IBDesignable部分是未按预期工作的部分.


奇怪的是,当我删除该行

self.translatesAutoresizingMaskIntoConstraints = false
Run Code Online (Sandbox Code Playgroud)

一切都很完美.我以前在运行时获得的错误现在已经消失了.我不知道我做了别的其他事情.非常感谢帮助确定问题@Rob.

Rob*_*Rob 4

@IBDesignable顺便说一句,我只是快速使用了@IBInspectableaUIImage和 adraw(rect:)来渲染该图像,效果很好:

@IBDesignable class CustomView: UIView {

    @IBInspectable var image: UIImage?

    override func draw(_ rect: CGRect) {
        image?.draw(at: CGPoint.zero)
    }

}
Run Code Online (Sandbox Code Playgroud)

当我在一个单独的目标中执行此操作时(就像使用可设计对象一样),我也会看到相同的警告:

ld:警告:-pie 被忽略。它仅在链接主可执行文件时使用

我怀疑这个警告可能是转移注意力。描述选项man的页面如下:ld-pie

这使得一种特殊的主可执行文件与位置无关(PIE)。

如果您转到可设计对象目标的链接设置并更改“链接”设置中的“生成位置相关的可执行文件”,则可以切换此设置。然后该警告就会消失。就我个人而言,我从未注意到该警告,也从未更改过此设置,也从未注意到任何不利影响,但如果您想为了自己的满足感而确认这一点,请尝试更改此设置,看看是否可以让警告消失离开。

最重要的是,您的@IBDesignable问题可能出在其他地方,但很难根据提供的信息进行诊断。我们需要更多信息(或者,理想情况下,需要MCVE)。


如果不知道这些警告是什么,就很难对自动布局警告进行评论,但我猜想(a)您正在添加一个子视图;但 (b) 不为所述子视图设置约束;因此 (c) 当您设置 时translatesAutoresizingMaskIntoConstraints = false,您的约束不明确,因此会在运行时导致错误消息和意外布局。或者这可能是滚动视图特性的一个症状。但如果没有看到(a)实际的自动布局错误,就很难说;(b) 您@IBDesignable添加了哪些子视图;(c) 您为子视图添加了哪些约束。

最重要的是,确保以编程方式添加的子视图明确定义了所有约束。还要记住,滚动视图子视图的约束与许多约束的行为不同,定义滚动视图的 contentSize 而不是子视图的大小。(关于后一点,请参阅TN2154。)