从第一个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了,也没有其他人似乎也有这个问题。似乎它可能是某种无限循环?
这不是我需要继续下去的事情,但让生活渲染工作将使开发更快,更容易,因为我将能够看到我的界面并测试它们而无需运行它们。
在此先感谢任何人如何解决此问题的远程线索。
据我读过的其他职位,实时呈现不调用初始化 – 2014-12-28 16:48:03
重写的init(帧:的CGRect)时,init(代码:NSCoder)和init()也帮助了我。 – DoN1cK 2015-03-04 09:32:41
哈,难怪!谢谢你,这也解决了我的问题。不知道苹果为什么不让'init(frame:CGRect)'成为必需的覆盖。 – Ash 2015-04-15 07:16:12