IB可从外部框架设计?

IBDesignable from External Framework?

我想创建一些使用 @IBDesignable@IBInspectable 标签的自定义视图。我已将这些添加到我的框架中,然后将我的框架链接到我的测试应用程序。但是 Designables 从未出现在 StoryBoard 中。

如何使用 @IBDesignable@IBInspectable 从外部框架创建自定义视图?

您可以在来自非嵌入式框架的应用程序中使用 @IBDesignable@IBInspectable 吗?

谢谢。

好吧,显然如果你想在 framework 中包含 @IBDesignable 和 @IBInspectable,那么 framework 必须是:

  • 包含在消费应用程序中,因此 Framework 不会在它自己的项目中。 (即通过从消费应用程序中执行类似 'file -> new.. -> target -> framework' 的操作来添加框架作为目标)。
  • external framework 作为 CocoaPod 包含在您的消费应用程序中。这实际上将 framework 添加为目标,而不仅仅是将 framework 链接到应用程序。
    • 有一种方法可以在项目中包含本地 CocoaPods,所以不用担心,您不必将 framework 部署到 public 就可以做到这一点.

我有一个解决方法。使用此解决方法,您无需将框架添加为目标。所以它适用于 Carthage.

@IBDesignable
class MyCustomView: CustomView {

    @IBInspectable override var bgColor: NSColor {
        get {
            return super.bgColor
        }
        set {
            super.bgColor = newValue
        }
    }
}

在目标项目(不在框架项目)中创建自定义class(CustomView)的子class(MyCustomView),并标记sub class 作为@IBDesignable。在您的应用中使用 sub class。这种方式使@IBDesignable 工作。

在子 class 中,覆盖那些 @IBInspectable 属性(bgColor),这样可以使 @IBInspectable 工作。

您可能会遇到这个问题: Following this guide to solve it: http://www.dribin.org/dave/blog/archives/2009/11/15/rpath/

请同时设置自定义 class 及其可检查属性 public 否则此方法无法编译。

如果无法正常运行请留言。

我找到了一种将可设计对象和可检查对象与 Cocoa 触摸框架一起使用的方法。下面的说明适用于 Objective-C 项目和 Xcode 8(我没有在旧版本上测试),如果涉及 Swift 代码,应该是相同的。

由于框架中的 Interface Builder 未发现 designable,因此在框架 header 中将 class 标记为 IB_DESIGNABLE 是没有用的。 Interface Builder 只会在编译项目源文件时发现可设计的 classes。因此,我们的想法是将此信息作为框架配套源文件提供,然后客户可以将其与他们的项目一起编译。

我发现您不必通过 subclass 将框架 class 标记为项目中的可设计框架。也就是说,您可以简单地注释每个 class,这些 class 必须通过伴随 .m 源文件中声明的类别来指定,例如:

IB_DESIGNABLE
@interface MyCustomView (Designable)

@end

事实上,代码甚至不需要编译,您可以将它包装在一个封闭的 #if 0 ... #endif 中,它仍然可以工作。所需要的只是 class 以某种方式与 IB_DESIGNABLE 属性相关联。

考虑到这些信息,以下是如何使可设计对象与 Cocoa 触摸框架一起工作:


如果您是框架供应商:

  1. 如果需要,必须有可设计的组件实现 -prepareForInterfaceBuilder
  2. 将文件夹引用(蓝色文件夹)添加到您的框架目标,其中包含配套 .m 文件。一种可能的命名约定是将文件夹和其中的文件命名为 Designables MyFrameworkNameDesignables.m,但你可以选择你最喜欢的。
  3. .m文件中,为每个必须可设计的视图创建一个类似上面的类别。该文件本身必须可由客户端项目编译,这意味着您需要进行必要的导入(例如,您的框架全局 public header #import <MyFramework/MyFramework.h>)或使用 #if 0 ... #endif 技巧以上

通过将文件包含在蓝色文件夹中,我们确保该文件夹按原样复制到最终 .framework 产品中,而无需编译配套源文件。此外,由于该文件夹是框架包的一部分,因此框架的所有客户端都可以使用它,无论是直接集成还是使用 Carthage。

如果您有一个使用框架作为目标依赖项的演示项目,并且如果您的框架依赖于其他框架,那么在演示中尝试呈现可设计视图时,您将 运行 陷入 dlopen 问题项目。这是因为 IB_DESIGNABLE 属性是在框架目标中发现的(因为 Designables 文件夹已添加到其中),Xcode pre-builds 在 Build/Intermediates/IBDesignables 派生与您的项目对应的数据文件夹。如果您查看此文件夹的内容,则会发现缺少框架依赖项,从而导致 dlopen 问题。

要修复演示中的渲染,只需将 复制文件 阶段添加到框架目标,将每个必需的框架依赖项添加到文件列表,然后设置 产品目录 作为目的地。现在,当 Xcode 构建您的渲染演示时,它也会包含依赖项。


如果您是具有可设计支持的框架的用户:

  • 将框架(及其所有框架依赖项,如果有的话)作为嵌入式二进制文件添加到您的目标
  • 从框架包中检索配套源文件并将其复制到您的项目中,将其添加到您的目标中。不幸的是,添加位于框架内的文件或使用符号 link 不起作用,因为 Xcode 似乎根本不在框架内
  • 将可设计视图 class(在我们上面的示例中为 MyCustomView)的实例添加到故事板。 Interface Builder 应该构建项目并呈现视图

这个解决方案并不完美,因为您仍然需要手动复制提供的源文件,这可能会在框架版本之间发生变化。但是它工作得很好,并且提供了框架包本身所需的一切。

UICircularProgressRing 通过在框架 Headers 文件夹中添加包含 @IBDesignable class 的 Swift 文件来解决此问题。为此,select 框架的 Xcode 项目,select 框架的目标,然后转到 Build Phases 选项卡并展开 Headers 阶段,并将 Swift 文件放入 Public: