Swift - 在子视图中使用 UIBezierPath
Swift - Using UIBezierPath in a Subview
我正在尝试制作一个简单的应用程序。为此,部分地,我尝试使用子视图在屏幕上绘制一个圆圈。
这是我的视图控制器class:
gameView 是故事板中链接的视图。
ballView 是我想添加的视图。
class GameViewController: UIViewController {
@IBOutlet var gameView: UIView!
var ballView = GameBallView()
override func viewDidLoad() {
super.viewDidLoad()
gameView.addSubview(ballView)
ballView.setNeedsDisplay()
gameView.setNeedsDisplay()
}
}
class GameBallView: UIView {
override func drawRect(rect: CGRect) {
let rectForBall = CGRect(x: 50, y: 250, width: 20, height: 20)
let path = UIBezierPath(ovalInRect: rectForBall)
path.fill()
path.stroke()
}
}
调用了 drawRect,但由于某种原因屏幕上没有显示任何内容。有谁知道我做错了什么?
您的 GameBallView ballView
未分配 frame
。因此它的大小为零,默认为 CGRectZero 的框架矩形。 UIView 的指定初始化程序是 init(frame:)
是有充分理由的!大小为零的矩形是不可见的:它只是一个点,一个无穷小。
因此,您应该为该视图提供一些适合您的绘图的合理框架;例如:
var ballView = GameBallView(frame:CGRectMake(50,250,20,20))
然后,在您的 drawRect
中,在 内部 绘制 ballView
的边界 — 请记住,您现在是相对于 ballView
本身,而不是游戏视图:
let rectForBall = CGRect(x: 0, y: 0, width: 20, height: 20)
甚至更好:
let rectForBall = rect // the parameter from `drawRect:`
我正在尝试制作一个简单的应用程序。为此,部分地,我尝试使用子视图在屏幕上绘制一个圆圈。
这是我的视图控制器class:
gameView 是故事板中链接的视图。 ballView 是我想添加的视图。
class GameViewController: UIViewController {
@IBOutlet var gameView: UIView!
var ballView = GameBallView()
override func viewDidLoad() {
super.viewDidLoad()
gameView.addSubview(ballView)
ballView.setNeedsDisplay()
gameView.setNeedsDisplay()
}
}
class GameBallView: UIView {
override func drawRect(rect: CGRect) {
let rectForBall = CGRect(x: 50, y: 250, width: 20, height: 20)
let path = UIBezierPath(ovalInRect: rectForBall)
path.fill()
path.stroke()
}
}
调用了 drawRect,但由于某种原因屏幕上没有显示任何内容。有谁知道我做错了什么?
您的 GameBallView ballView
未分配 frame
。因此它的大小为零,默认为 CGRectZero 的框架矩形。 UIView 的指定初始化程序是 init(frame:)
是有充分理由的!大小为零的矩形是不可见的:它只是一个点,一个无穷小。
因此,您应该为该视图提供一些适合您的绘图的合理框架;例如:
var ballView = GameBallView(frame:CGRectMake(50,250,20,20))
然后,在您的 drawRect
中,在 内部 绘制 ballView
的边界 — 请记住,您现在是相对于 ballView
本身,而不是游戏视图:
let rectForBall = CGRect(x: 0, y: 0, width: 20, height: 20)
甚至更好:
let rectForBall = rect // the parameter from `drawRect:`