IB可从外部框架设计?
IBDesignable from External Framework?
我想创建一些使用 @IBDesignable
和 @IBInspectable
标签的自定义视图。我已将这些添加到我的框架中,然后将我的框架链接到我的测试应用程序。但是 Designables 从未出现在 StoryBoard 中。
如何使用 @IBDesignable
和 @IBInspectable
从外部框架创建自定义视图?
您可以在来自非嵌入式框架的应用程序中使用 @IBDesignable
和 @IBInspectable
吗?
谢谢。
好吧,显然如果你想在 framework
中包含 @IBDesignabl
e 和 @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 触摸框架一起工作:
如果您是框架供应商:
- 如果需要,必须有可设计的组件实现
-prepareForInterfaceBuilder
- 将文件夹引用(蓝色文件夹)添加到您的框架目标,其中包含配套
.m
文件。一种可能的命名约定是将文件夹和其中的文件命名为 Designables
MyFrameworkNameDesignables.m
,但你可以选择你最喜欢的。
- 在
.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:
我想创建一些使用 @IBDesignable
和 @IBInspectable
标签的自定义视图。我已将这些添加到我的框架中,然后将我的框架链接到我的测试应用程序。但是 Designables 从未出现在 StoryBoard 中。
如何使用 @IBDesignable
和 @IBInspectable
从外部框架创建自定义视图?
您可以在来自非嵌入式框架的应用程序中使用 @IBDesignable
和 @IBInspectable
吗?
谢谢。
好吧,显然如果你想在 framework
中包含 @IBDesignabl
e 和 @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 工作。
您可能会遇到这个问题:
请同时设置自定义 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 触摸框架一起工作:
如果您是框架供应商:
- 如果需要,必须有可设计的组件实现
-prepareForInterfaceBuilder
- 将文件夹引用(蓝色文件夹)添加到您的框架目标,其中包含配套
.m
文件。一种可能的命名约定是将文件夹和其中的文件命名为Designables
MyFrameworkNameDesignables.m
,但你可以选择你最喜欢的。 - 在
.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: