例如,我想要子类化UIButton并20.0f默认设置它的字体.我可以这样写:
@IBDesignable
class HCButton: UIButton {
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
self.customInit()
}
func customInit () {
titleLabel?.font = UIFont.systemFontOfSize(20)
}
}
Run Code Online (Sandbox Code Playgroud)
但这不会影响Interface Builder中的预览,15.0f默认情况下所有自定义按钮都会显示字体大小.有什么想法吗?
我知道如何在自定义视图中使用@IBDesignable.但是可以将IBDesignable用于单元格并在故事板中渲染它们吗?
例如:我在storyboard中有一个collectionViewController,并添加了一个uiCollectionCell和指定的类作为我的customCellClass.
ps:我知道在collecionViews和tableViews中使用Xibs我们必须在代码中调用方法registerNib:forReuseIdentifer(我正在这样做).只是想知道,是否有可能在故事板中看到它的渲染视图.
p.s2:我发现了这个并且它与UIViews 完美配合,但不知道如何使它与CollectionCells和TableCells一起使用.:(
我已经IBDesignables在接口视图中创建了可重用的类来渲染xib.
@interface ReusableView ()
@property (nonatomic, strong) UIView *contentView;
@end
@implementation ReusableView
- (instancetype)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
[self setupXib];
return self;
}
- (instancetype)initWithCoder:(NSCoder *)aDecoder {
self = [super initWithCoder:aDecoder];
[self setupXib];
return self;
}
- (void)setupXib {
self.contentView = [self loadFromNib];
self.contentView.frame = self.bounds;
self.contentView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
[self addSubview:self.contentView];
}
- (UIView *)loadFromNib {
NSBundle *bundle = [NSBundle bundleForClass: [self class]];
UINib *nib = [UINib nibWithNibName:NSStringFromClass([self class]) bundle:bundle];
UIView *view = (UIView *)[[nib …Run Code Online (Sandbox Code Playgroud) 我似乎无法获得"titleText"IBInspectable属性.我有一个带有UILabel的简单框架视图,我创建了一个IBInspectable变量"titleText".我注意到可检查的"层"变量按预期工作,但不是我的自定义"titleText",它应该使用此框架更新主视图.
问题是:
Interface Builder没有更新titleLabel?(即在设计时),即我希望这应该,就像它适用于"层"项目.
在运行时,titleLabel的值也没有获取我在IB中设置的值.请注意,当我运行时,我得到以下输出,即产生这个的代码是发现"self.titleLabel"实际上是零?
代码摘要
(b)gcCustomerView.swift
import UIKit
@IBDesignable
class gcCustomView: UIView {
@IBOutlet weak var titleLabel: UILabel!
@IBInspectable var titleText: String = "Default" {
didSet {
if self.titleLabel != nil {
self.titleLabel.text = titleText
} else {
NSLog("Could not set title text as label.text was nil : was trying to set to \(titleText)")
}
}
}
@IBInspectable var cornerRadius: CGFloat = 0 {
didSet {
layer.cornerRadius = cornerRadius
layer.masksToBounds = cornerRadius > 0
}
}
@IBInspectable var …Run Code Online (Sandbox Code Playgroud) 我想定制一个5星级的UIView,我也希望它能在故事板中呈现.所以我决定使用@IBDesignable和@IBInspectable.以下是我的代码.
import UIKit
@IBDesignable
class RatingView: UIView {
override init(frame: CGRect) {
super.init(frame: frame)
setUpView()
}
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
setUpView()
}
func setUpView() {
let imageView = UIImageView(frame:CGRectMake(0, 0, 50,50))
imageView.image = UIImage(named: "star")
addSubview(imageView)
}
}
Run Code Online (Sandbox Code Playgroud)
然后在我的故事板中,我将UIView拉入我的画布,并将Custom类设置为我的自定义视图作为RatingView.编译器开始编译storyboard文件,我只是等待自定义视图在canvas中呈现.这是截图.

状态是"最新的",但视图尚未渲染.视图只是保持白色,我想看到的是我添加到父视图的图像.当我使用UILabel而不是UIImageView时,标签是在画布中渲染而不是UIImageView,我如何在画布中渲染可爱的星形图像.(Images.xcassets有star.png文件)

使用UILabel而不是UIImageView
func setUpView() {
let label = UILabel(frame: CGRectMake(0, 0, 50, 50))
label.text = "text"
addSubview(label)
}
Run Code Online (Sandbox Code Playgroud)
结果:

我真的需要一只手.我创建了一个UIBabel的@IBDesignable子类,它可以在XCode Interface Builder中正常工作.但是,即使我将"clipsToBounds"设置为false,Interface Builder仍会剪切它,同时更改@IBInspectable属性.
如果我在模拟器或设备上运行应用程序,UILabel不会被剪裁并给出我想要的结果(同时仍然应用Interface Builder所具有的值).
变更前(子视图可见)

在界面建筑师的变化之后(子视图不在视野范围内)

模拟器更改后(子视图如预期)

任何帮助都将受到大力赞赏.自定义类的代码如下.
@IBDesignable class UIFeaturedLabel: UILabel {
@IBInspectable var borderWidth: Float = 4
@IBInspectable var borderOffsetX: Float = 15
@IBInspectable var borderOffsetY: Float = 5
@IBInspectable var borderColor: UIColor = UIColor.whiteColor()
private var headerView:UIView!
private var footerView:UIView!
override init() {
super.init()
createViews()
}
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
createViews()
}
override init(frame: CGRect) {
super.init(frame: frame)
createViews()
}
func createViews() {
clipsToBounds = false
layer.masksToBounds = false
headerView = UIView() …Run Code Online (Sandbox Code Playgroud) 我在MyClass.h文件中有此文件:
#import <UIKit/UIKit.h>
IB_DESIGNABLE
@interface MyClass : UIView
@end
Run Code Online (Sandbox Code Playgroud)
这是.m文件中的代码:
-(void)awakeFromNib{
[super awakeFromNib];
NSLog(@"This works %lud",(unsigned long)self.max);
}
-(instancetype)initWithCoder:(NSCoder *)aDecoder{
if ((self = [super initWithCoder:aDecoder])){
NSLog(@"This doesn't work %lud",(unsigned long)self.max);
}
return self;
}
Run Code Online (Sandbox Code Playgroud)
在awakeFromNib方法中,我在IB中设置了正确的值。在initWithCoder中:此值等于零。
检查该属性中在IB中设置的值的合适时间是什么?
这就是我在.m文件中定义属性的方式:
@interface MyClass()
@property (nonatomic) IBInspectable NSUInteger max;
@end
Run Code Online (Sandbox Code Playgroud) 我有一个广泛使用IBDesignable视图的.xib文件.随着视图的增长,我注意到CPU负载不变.现在,我的视图非常大,当我在界面构建器中打开它时,ActivityMonitor显示:
.即使我离开.xib文件并转到代码,它仍会继续.停止它的唯一解决方案是关闭,然后打开Xcode并且在真正需要之前不要打开.xib文件.我粗略的假设是Xcode继续在后台编译我的项目/视图以维持IBDesignable实际状态的视图.
我该怎么做才能防止浪费CPU?
如果它有任何意义 - 我的mac配置:MacBook Pro(Retina,15英寸,2015年中),2.5 GHz Intel Core i7,16 GB 1600 MHz DDR3
大多数问题以及与此相关的答案均基于Xcode和Swift的旧版本.此外,90%的问题与UIKit和绘制自定义控件有关.
我正在添加一个标准按钮,它位于一个自定义控件内部,用IBDesignable.
import Cocoa
@IBDesignable public class ButtonPresetView: NSView {
public override init(frame frameRect: NSRect) {
super.init(frame: frameRect)
initialControlSetup()
}
public required init?(coder decoder: NSCoder) {
super.init(coder: decoder)
initialControlSetup()
}
private func initialControlSetup() {
let button = NSButton(title: "Hello", target: nil, action: nil)
button.translatesAutoresizingMaskIntoConstraints = false
addSubview(button)
// Configure button
centerXAnchor.constraint(equalTo: button.centerXAnchor).isActive = true
centerYAnchor.constraint(equalTo: button.centerYAnchor).isActive = true
}
}
Run Code Online (Sandbox Code Playgroud)
我向应用程序添加了一个自定义视图,并将Identity Inspector中的class属性设置为我的自定义类(ButtonPresetView).
它应该显示以画布为中心的按钮,但画布为空白.不确定很多人会这样使用它,但它在Xcode 8.3中使用Swift 3非常有效.
还有其他人有这个问题吗?
我正在一个包含100多个源文件的项目中。我决定实现一个可重用的自定义视图,我可以在Interface Builder上预览其布局,如本问题和许多其他文章中所述。
但是,我无法让Interface Builder刷新(渲染)我的视图。
像往常一样,我将UIView对象库中的库存放入Interface Builder中的视图层次结构中,然后在Identity Inspector中将其类更改为我自己的类。字段“ Desginables”(在“从目标继承模块”下的右侧)显示为“最新”。
但是,自定义视图的内部布局无法预览。(它包含文本字段,标签和自定义背景色)。
从主菜单中选择“ 编辑器”>“刷新所有视图 ”会触发构建,并立即更改为“ Designables更新”,但是构建完成后,我的自定义视图仍为空白。
我尝试创建一个新的最小项目(通过Sinlge View Application项目模板),然后将我的.xib和自定义类源文件完整地移植了下来。放心,将其放置在xib或情节提要板中时,可以按预期进行预览。
我知道这可能是一个远景,但这是大型项目Xcode的已知问题吗?
还是我应该在现有项目中寻找其他可能干扰可设计元素呈现的其他设置?
ibdesignable ×10
xcode ×6
ios ×4
cocoa-touch ×2
objective-c ×2
swift ×2
appkit ×1
ios10 ×1
rendering ×1
swift4 ×1
uikit ×1
uiview ×1
xcode8 ×1
xcode9.2 ×1
xib ×1