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 ) })