所以,作为一个快速的新手,我正在四处寻找并随时学习。通常一点google foo或教程会帮助我,但现在我很难过。所以,如果有人能向我解释这一点,我会非常高兴。 所以我试图在屏幕上画一个圆圈,好吧,实际上是其中一些。我在网上找到了这个代码;
(http://www.ioscreator.com/tutorials/drawing-circles-uitouch-ios8-swift)
import UIKit
class CircleView: UIView {
override init(frame: CGRect) {
super.init(frame: frame)
self.backgroundColor = UIColor.clearColor()
}
required init(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func drawRect(rect: CGRect) {
var context = UIGraphicsGetCurrentContext();
//... various stuff to draw a circle ..//
}
}
这是一个像这样初始化时绘制圆圈的类
currentCircle = CircleView(frame: CGRectMake(0,0,100,100 ) )
我有几个问题。
为什么它实际画圆圈? drawRect函数永远不会被直接调用。我想这是因为我们在UIView中覆盖了一个函数,我还不理解这些概念。
如何将变量传递给该函数的初始化?说,我想绘制不同厚度的圆圈,我想传递一个额外的变量:
currentCircle = CircleView(frame: CGRectMake(0,0,100,100 ), thickness:10 )
如何修改init以接受此操作?像这样添加它:
override init(frame: CGRec, thickness: Int) {
super.init(frame: frame)
}
触发错误(初始化程序确实从其超类覆盖指定的初始化程序)
为什么所有的覆盖?我试过让它成为一个类并使用代码绘制。然而,
CGContextAddArc
触发编译器错误,说上下文无效,所以我想
UIGraphicsGetCurrentContext()
没有返回任何有用的东西。
或者如果有人知道一个有用的资源,我可以学习更多关于覆盖和初始化类的知识,那将是受欢迎的。
答案 0 :(得分:0)
为什么它实际上画了一个圆圈?
你没有直接拨打drawRect:
,这是对的。当需要重新绘制视图时,系统会调用它。例如,当视图的边界发生变化,或者您调用setNeedsDisplay()
我如何修改init ...
你的init应该是这样的:
convenience init(frame: CGRec, thickness: Int) {
self.thickness = thickness
self.init(frame: frame)
}
您只能覆盖班级超类中的方法,init(frame: CGRec, thickness: Int)
不是其中之一。
在开始教程之前,您应该花些时间阅读Apple's Swift documentation。所有你需要了解的语言都在那里。
有关绘图的详细信息,请参阅定义自定义视图here.
答案 1 :(得分:0)
一种优雅的方法是将您的视图转换为具有完整Interface Builder支持的类。这样,您就可以在Interface Builder中直接添加和配置视图实例。
使用自定义视图:
您需要对代码进行一些修改,尤其是注释@IBDesignable
和@IBInspectable
:
import UIKit
@IBDesignable class CircleView: UIView {
@IBInspectable var thickness: CGFloat = 1
override init(frame: CGRect) {
super.init(frame: frame)
}
required init(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func drawRect(rect: CGRect) {
var context = UIGraphicsGetCurrentContext()
CGContextSetLineWidth(context, thickness)
var r = self.bounds
var ellipseRect = CGRectMake(r.origin.x + self.thickness / 2, r.origin.y + self.thickness / 2,
r.size.width - thickness, r.size.height - thickness)
CGContextStrokeEllipseInRect(context, ellipseRect)
}
}
是的,你是对的。你永远不会打电话给'drawRect:'你自己。您可以在屏幕上添加视图实例,iOS会调用' drawRect:'什么时候需要画出你的观点。
它是图形用户界面系统的整体模式:您主要对诸如用户点击或重新绘制事件等事件做出反应。