2014-11-06 130 views
25

从第一个XCode 6/iOS 8 beta版本开始,我一直在开发和关闭应用程序几个月。我最喜欢的功能之一是实时渲染,使用Swift中的@IBDesignable标签。IBDesignable查看渲染超时

我还没有能够得到一个单一的东西来生活渲染。我想这一定是因为它是一个测试版,所以我决定等待完整版发布再试一次。它仍然失败。然后我发现在我的代码中可能存在来自测试版本的文物,所以我放弃了它并开始新鲜。它仍然不起作用。当然,这些错误稍微有些描述性。

这里是我的代码:

import UIKit 

@IBDesignable class MyButton : UIButton { 

    let UNPRESSED_COLOR = UIColor(red: 221.0/256.0, green: 249.0/256.0, blue: 14.0/256.0, alpha: 1.0) 
    let PRESSED_COLOR = UIColor(red: 166.0/256.0, green: 187.0/156.0, blue: 11.0/256.0, alpha: 1.0) 
    var buttonColorValue: UIColor 

    let TEXT_COLOR = UIColor(red: 72.0/256.0, green: 160.0/256.0, blue: 5.0/256.0, alpha: 1.0) 

    required init(coder: NSCoder) { 
     self.buttonColorValue = UNPRESSED_COLOR 
     super.init(coder: coder) 
     // Initialization code 
     self.setTitleColor(TEXT_COLOR, forState: UIControlState.Normal) 
     self.setTitleColor(TEXT_COLOR, forState: UIControlState.Highlighted) 
     self.setTitleColor(TEXT_COLOR, forState: UIControlState.Selected) 
    } 

    override func touchesBegan(touches: NSSet, withEvent event: UIEvent) { 
     super.touchesBegan(touches, withEvent: event) 
     buttonColorValue = PRESSED_COLOR 
     self.setNeedsDisplay() 
    } 

    override func touchesEnded(touches: NSSet, withEvent event: UIEvent) { 
     super.touchesEnded(touches, withEvent: event) 
     buttonColorValue = UNPRESSED_COLOR 
     self.setNeedsDisplay() 
    } 

    override func touchesCancelled(touches: NSSet!, withEvent event: UIEvent!) { 
     super.touchesCancelled(touches, withEvent: event) 
     buttonColorValue = UNPRESSED_COLOR 
     self.setNeedsDisplay() 
    } 

    override func drawRect(rect: CGRect) { 
     buttonColorValue.setFill() 
     let ctx = UIGraphicsGetCurrentContext() 
     CGContextFillRect(ctx, rect) 
     //UIBezierPath(roundedRect: rect, cornerRadius: 5.0).fill() 
    } 
} 

这里是我得到的错误,当我尝试建立与我的故事板这些按钮中的一个:

IB Designables: Failed to update auto layout status: Interface Builder Cocoa Touch Tool crashed 

IB Designables: Failed to render instance of MyButton: Rendering the view took longer than 200 ms. Your drawing code may suffer from slow performance. 

正如你可以在我的代码中看到,我原本希望这个按钮被四舍五入。我想这可能是导致这个问题的原因,但它让我感到吃惊,苹果会设计出一个效率低下的圆角矩形绘图算法。我切换到简单地设置颜色并按原样绘制矩形。仍然有问题。

我想(我希望,反正)有是我做错了一个很小的事情,因为我GOOGLE了,也没有其他人似乎也有这个问题。似乎它可能是某种无限循环?

这不是我需要继续下去的事情,但让生活渲染工作将使开发更快,更容易,因为我将能够看到我的界面并测试它们而无需运行它们。

在此先感谢任何人如何解决此问题的远程线索。

回答

49

显然,我需要重写与init(code: NSCoder)一起init(frame: CGRect)

得到它的工作!如果有人可以关心解释为什么这不起作用,那会很好。否则,我在这里很好。

+3

据我读过的其他职位,实时呈现不调用初始化 – 2014-12-28 16:48:03

+1

重写的init(帧:的CGRect)时,init(代码:NSCoder)和init()也帮助了我。 – DoN1cK 2015-03-04 09:32:41

+0

哈,难怪!谢谢你,这也解决了我的问题。不知道苹果为什么不让'init(frame:CGRect)'成为必需的覆盖。 – Ash 2015-04-15 07:16:12

0

对于我来说,这个错误竟然是由于我@IBInspectable属性之一阻塞调用SQLite数据库(使用CoreData)。

我的代码最初查询数据库,然后用dispatchAsync设置标签的基础上,查询的结果值。我对其进行了更改,以便查询也在dispatchAsync区块中启动。错误立即消失。

其他人是否具有该错误的麻烦,我建议检查出,将在设计阶段期间被执行的任何代码(构造或计算属性标有@IBInspetable)。如果存在任何阻止代码(网络操作,数据库访问等),则可能导致超时错误。希望这可以帮助。

6

虽然这可能不是真的是一个有用的答案,我发现,寻找解决这个半小时后,一个简单的关闭并重新打开的Xcode的伎俩 - 如果你还没有尝试过这种尚未给予它一去!

1

有同样的问题,但一瞥这篇文章。它解决了我的问题。

http://nshipster.com/ibinspectable-ibdesignable/

总之

要获得在Xcode这些选项

enter image description here

作出这样一个属性:

@IBInspectable var cornerRadius: CGFloat = 0 { 
    didSet { 
     layer.cornerRadius = cornerRadius 
     layer.masksToBounds = cornerRadius > 0 
    } 
} 
2

确保您覆盖prepareForInterfaceBuilder来解决此问题。在所有:(NSCoder代码) - 只是初始化(帧:的CGRect)

@IBDesignable 
class SomeView: UITableView { 
@IBInspectable var something: Int? { didSet { setup() } } 

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

override init(frame: CGRect, style: UITableViewStyle) { 
    super.init(frame: frame, style: style) 
    setup() 
} 

override func prepareForInterfaceBuilder() { 
    super.prepareForInterfaceBuilder() 
    setup() 
} 

func setup() { 
    // do sth 
} 
}