如何使用函数调用正确更新 CGContext?
Posted
技术标签:
【中文标题】如何使用函数调用正确更新 CGContext?【英文标题】:How to correctly update a CGContext with a function call? 【发布时间】:2020-08-13 16:09:58 【问题描述】:我正在制作一个小型射击游戏,其中一艘小船探索一个 8x8 级别的房间,房间里到处都是敌人等。我目前正在尝试实现一张地图,向玩家展示他们已经去过的地方。我最初的实现很简单——我制作了一个自定义 UIView,将它附加到我的 Storyboard 上,并且想简单地在地图上绘制任何访问过的新房间。我选择使用 CGContext 来执行此操作,并且我的第一次尝试如下所示。
使用此代码,第一个 updateMap 调用完美运行 - 矩形以正确的颜色和位置绘制在玩家地图上。但是,尽管 CGRect 正确更新,任何后续调用似乎都没有绘制任何内容。如果我取消注释 PopContext(或删除 PushContext),它将触发“找不到上下文”抛出。虽然下面显示状态的代码不会打印“找不到上下文”,但它也不会更新地图。
诚然,我对 CGContext 的理解相当乏味,所以我认为我只是在这里犯了一个概念上的错误。话虽如此,我到底在搞砸什么?
class MapView: UIView
var x: Int!
var y: Int!
var drect: CGRect!
override func draw( _ frame: CGRect)
super.draw(frame)
if let context: CGContext = UIGraphicsGetCurrentContext()
//UIGraphicsPopContext()
context.setFillColor(red: 1.0, green: 1.0, blue: 1.0, alpha: 0.0); //this is the transparent color
context.setStrokeColor(red: 0.0, green: 0.0, blue: 100.0, alpha: 1.0);
context.fill(drect);
context.stroke(drect); //this will draw the border
context.addRect(drect)
UIGraphicsPushContext(context)
else
print("Context not found")
return
public func updateMap(scene: GameScene)
x = scene.current_xcoords
y = scene.current_ycoords
let w = self.frame.width
let h = self.frame.height
drect = CGRect(x: (w/50) + CGFloat(x)*w/8, y: (h/100) + CGFloat(y)*h/8, width: (h / 11), height: (h / 11))
draw(self.frame)
【问题讨论】:
【参考方案1】:你不应该直接调用draw()
方法......你可以调用setNeedsDisplay()
或layoutIfNeeded()
根据Apple docs
第一次显示视图或发生事件时调用此方法 发生使视图的可见部分无效。你不应该 自己直接调用这个方法。要使您的部分视图无效, 并因此导致该部分被重绘,调用 setNeedsDisplay() 或 setNeedsDisplay(_:) 方法。
所以你的代码变成了
public func updateMap(scene: GameScene)
x = scene.current_xcoords
y = scene.current_ycoords
let w = self.frame.width
let h = self.frame.height
drect = CGRect(x: (w/50) + CGFloat(x)*w/8, y: (h/100) + CGFloat(y)*h/8, width: (h / 11), height: (h / 11))
setNeedsDisplay()
【讨论】:
就是这样!谢谢,真不敢相信我在阅读文档时错过了这个细节。以上是关于如何使用函数调用正确更新 CGContext?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用`prepare(_ context: CGContext, with rendererContext: UIGraphicsRendererContext)`?