IBDesignable视图渲染超时
从第一个XCode 6 / iOS 8 beta版本开始,我一直在开发和closures一个应用程序几个月。 我最喜欢的function之一是实时渲染,使用Swift中的@IBDesignable
标签。
我没有能够得到一个单一的东西来生活渲染。 我想这一定是因为它是一个testing版本,所以我决定等待完整的版本出来再试一次。 它仍然失败。 然后我想,在我的代码中可能会有testing版的文物,所以我放弃了它,并开始新鲜。 它仍然不起作用。 当然,错误现在稍微描述一下。
这是我的代码:
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() } }
以下是我在故事板中使用其中一个button创build的错误:
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.
正如你在我的代码中看到的,我最初想要这个button被四舍五入。 我认为这可能是这个问题的原因,但是让我吃惊的是,苹果会devise一个效率低下的圆angular矩形绘制algorithm。 我切换到简单的设置颜色,并按原样绘制矩形。 仍然有问题。
我想(无论如何),我有一件小事情,我做错了,因为我GOOGLE了,没有其他人似乎有这个问题。 似乎可能是某种无限循环?
这对我来说并不是必须要继续下去的,但是实时渲染工作会使开发速度更快,更容易,因为我将能够看到我的界面并testing它们,而无需运行它们。
在此先感谢任何人如何解决这个问题的远程线索。
显然我需要重写init(frame: CGRect)
和init(code: NSCoder)
。
得到它的工作! 如果有人可以解释为什么这不起作用,那会很好。 否则,我很好。
虽然这可能不是一个真正有用的答案,但是我发现在为这个半小时寻找一个解决scheme之后,一个简单的closures和重新打开的Xcode就完成了这个诀窍 – 如果你还没有尝试过这个方法,那就试一试吧!
确保你重写prepareForInterfaceBuilder来解决这个问题。
@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 } }
有同样的问题,但一看这个伟大的文章。 它解决了我的问题。
http://nshipster.com/ibinspectable-ibdesignable/
简而言之
在xcode中获取这些选项
做一个这样的属性:
@IBInspectable var cornerRadius: CGFloat = 0 { didSet { layer.cornerRadius = cornerRadius layer.masksToBounds = cornerRadius > 0 } }
对我来说,这个错误原来是由于我的一个@IBInspectable属性阻塞了对sqlite数据库(使用CoreData)的调用。
我的代码最初查询数据库,然后使用dispatchAsync
根据查询结果设置标签的值。 我改变了它,以便查询也在dispatchAsync
块中启动。 错误立即消失。
如果其他人遇到这个错误,我build议检查在devise阶段执行的任何代码(构造函数或用@IBInspetable标记的计算属性)。 如果有阻塞码(networking操作,数据库访问等),可能会导致超时错误。 希望这可以帮助。