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

时间:2016-10-21 06:06:03

标签: ios swift

我有一个自定义UIView子类,我尝试使用@IBDesignable呈现。

我有一个名为@IBInspectable的{​​{1}}属性,我是从界面构建器设置的。

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

Interface Builder

这发生在Showing All Messages (null): -pie being ignored. It is only used when linking a main executable 部分。

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

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

修改

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

我有什么:

具有属性的Link <IBDESIGNABLE_EXECUTABLE> IBDesignable子类:

  • 名为UIView的{​​{1}}媒体资源。
  • 一个ImageView
  • 一个ScrollView

我使用

初始化并将ScrollView和ImageViews添加为子视图
@IBInspectable

问题:

image
 我将required public init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) initialiseImageView() } override init(frame: CGRect) { super.init(frame: frame) initialiseImageView() } 作为initialiseImageView()scrollView的子视图添加为UIView的子视图,以使用ImageView代理。我还添加了约束来保持视图。
问题是我使用时:

scrollView

如果我使用它,我会在运行时收到autolayout警告。但是viewForZooming中的self.translatesAutoresizingMaskIntoConstraints = false 放错了位置,尽管图像渲染正确。

如果我对此进行评论,则imageView中的所有内容都符合预期。但由于interface builder,UI在运行时中断。

我有github中的代码。我正在尝试TN2154

中提到的后一种方法

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

奇怪的是,当我删除了这行

UIView

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

2 个答案:

答案 0 :(得分:3)

顺便说一句,我刚刚用@IBDesignable快速@IBInspectable做了一个UIImage和一个draw(rect:)来渲染该图片并且工作正常:

@IBDesignable class CustomView: UIView {

    @IBInspectable var image: UIImage?

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

}

当我在一个单独的目标中执行此操作时(因为应该使用可设计的目标),我也会看到相同的警告:

  

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

我怀疑警告可能是红鲱鱼。 man的{​​{1}}页面描述了ld选项,如下所示:

  

这是一种特殊的主要可执行文件,它与位置无关(PIE)。

如果您转到可设计的链接设置,则可以切换此设置。目标并更改&#34;生成位置相关的可执行文件&#34;在&#34;链接&#34;设置。那个警告就会消失。就个人而言,我从来没有注意到这个警告,也从未改变过这种设置,也没有注意到任何不良影响,但如果你想根据自己的满意度确认这一点,请尝试更改此设置并查看是否可以收到警告离开。

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

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

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

答案 1 :(得分:0)

对我来说,我删除了一些不再存在的ibdesignable变量。

它们被卡在用户定义的运行时属性中。

删除该文件,然后清理构建文件夹,然后重新构建为我解决了这个问题!