从第一个 XCode 6/iOS 8 beta 版本开始,我一直在断断续续地开发一个应用程序几个月。我最喜欢添加的功能之一是实时渲染,这可以通过@IBDesignable
Swift 中的标签实现。
我还没有得到任何东西来实时渲染。我想这一定是因为它是一个测试版,所以我决定等待完整版本出来再试一次。它仍然失败。我当时认为我的代码中可能存在来自 beta 版本的工件,所以我放弃了它并重新开始。它仍然不起作用。当然,这些错误现在更具描述性。
这是我的代码:
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.
正如您在我的代码中看到的那样,我最初希望这个按钮是圆形的。我想这可能是这个问题的原因,尽管令我惊讶的是,Apple 会设计一个低效的圆角矩形绘图算法。我切换到简单地设置颜色并按原样绘制矩形。还是有问题。
我认为(无论如何我希望)我做错了一件小事,因为我已经用谷歌搜索了,似乎没有其他人有这个问题。似乎它可能是某种无限循环?
这不是我必须继续做的事情,但是让实时渲染工作将使开发对我来说更快、更容易,因为我将能够看到我的接口并对其进行测试,而无需运行它们。
提前感谢任何对如何解决这个问题有远程线索的人。