UIImageView 更新直到触摸事件后才绘制
UIImageView Update not drawing until after touch events
我的问题是:
为什么我的 UIImageView 仅在从本地触摸绘制时更新其图像,而不是从多点连接会话中提取要绘制的点?
目前我的应用程序工作如下:
用户在屏幕上绘图,如果用户使用 MultipeerConnectivity 连接到对等点,则对等点应该看到其他用户绘制的内容出现在他们自己的屏幕上。 drawLine函数使用CGContextStrokePath()画线:
drawLine(fromPoint: CGPoint,toPont: CGPoint){
UIGraphicsBeginImageContext(self.view.frame.size);
//... do the drawing of the line
let image = UIGraphicsGetImageFromCurrentImageContext();
canvas.image = image;
UIGraphicsEndImageContext()
}
drawLine 方法是从两个不同的来源调用的,要么是在覆盖方法 touchesMoved() 或 touchesEnded() 中,要么是在以下处理从 Multipeer 接收数据(两个 CGPoints 之间画一条线)的方法中-连接会话:
func handleMPCReceivedDataWithNotification(notification : NSNotification){
let receivedDataDictionary = notification.object as! Dictionary<String, AnyObject>
let data = receivedDataDictionary["data"] as? NSData
let dataDictionary = NSKeyedUnarchiver.unarchiveObjectWithData(data!) as! Dictionary<String, AnyObject>
if let pointData = dataDictionary["points"] as! Dictionary<String,AnyObject>!{
let fromPointObj = pointData["fromPoint"] as! NSValue!
let toPointObj = pointData["toPoint"] as! NSValue
let toPoint = toPointObj.CGPointValue()
let fromPoint = fromPointObj.CGPointValue()
drawLineFrom(fromPoint, toPoint: toPoint)
}
}
我的问题是,当我在一个设备上画线时,它在本地画得很好,而在另一台设备上调用了 drawLine 方法(正如我从中断和打印中看到的那样),但另一台设备不会实际更新 canvas 图像直到设备被自己的用户绘制(即发生触摸事件)。那么是不是我的 canvas UIImageView 在调用 TouchEvent 之前不会自行更新?我试图找到一种强制更新的方法(例如当我调用 canvas.image = image 我认为它会自动更新),但我一直无法解决这个问题。
无论如何,非常感谢任何建议或意见
威廉
乍一看,我认为问题是你的图形代码必须在主线程上执行。触摸事件引起的绘制肯定是在主线程上,但是函数handleMPC...
好像是在后台线程调用的。将 drawLineFrom
调用放入其中:
dispatch_async( dispatch_get_main_thread(), {
drawLineFrom( fromPoint, toPoint: toPoint ) })
我的问题是:
为什么我的 UIImageView 仅在从本地触摸绘制时更新其图像,而不是从多点连接会话中提取要绘制的点?
目前我的应用程序工作如下:
用户在屏幕上绘图,如果用户使用 MultipeerConnectivity 连接到对等点,则对等点应该看到其他用户绘制的内容出现在他们自己的屏幕上。 drawLine函数使用CGContextStrokePath()画线:
drawLine(fromPoint: CGPoint,toPont: CGPoint){
UIGraphicsBeginImageContext(self.view.frame.size);
//... do the drawing of the line
let image = UIGraphicsGetImageFromCurrentImageContext();
canvas.image = image;
UIGraphicsEndImageContext()
}
drawLine 方法是从两个不同的来源调用的,要么是在覆盖方法 touchesMoved() 或 touchesEnded() 中,要么是在以下处理从 Multipeer 接收数据(两个 CGPoints 之间画一条线)的方法中-连接会话:
func handleMPCReceivedDataWithNotification(notification : NSNotification){
let receivedDataDictionary = notification.object as! Dictionary<String, AnyObject>
let data = receivedDataDictionary["data"] as? NSData
let dataDictionary = NSKeyedUnarchiver.unarchiveObjectWithData(data!) as! Dictionary<String, AnyObject>
if let pointData = dataDictionary["points"] as! Dictionary<String,AnyObject>!{
let fromPointObj = pointData["fromPoint"] as! NSValue!
let toPointObj = pointData["toPoint"] as! NSValue
let toPoint = toPointObj.CGPointValue()
let fromPoint = fromPointObj.CGPointValue()
drawLineFrom(fromPoint, toPoint: toPoint)
}
}
我的问题是,当我在一个设备上画线时,它在本地画得很好,而在另一台设备上调用了 drawLine 方法(正如我从中断和打印中看到的那样),但另一台设备不会实际更新 canvas 图像直到设备被自己的用户绘制(即发生触摸事件)。那么是不是我的 canvas UIImageView 在调用 TouchEvent 之前不会自行更新?我试图找到一种强制更新的方法(例如当我调用 canvas.image = image 我认为它会自动更新),但我一直无法解决这个问题。
无论如何,非常感谢任何建议或意见
威廉
乍一看,我认为问题是你的图形代码必须在主线程上执行。触摸事件引起的绘制肯定是在主线程上,但是函数handleMPC...
好像是在后台线程调用的。将 drawLineFrom
调用放入其中:
dispatch_async( dispatch_get_main_thread(), {
drawLineFrom( fromPoint, toPoint: toPoint ) })