UIImageView Update在触摸事件之后才会绘制

时间:2016-03-15 01:22:59

标签: ios swift uiimageview cgimage multipeer-connectivity

我的问题是:

为什么我的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-connectivity会话的接收数据(两个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方法正在另一台设备上调用(正如我从断点和打印中看到的那样),但另一台设备实际上并不会更新画布图像,直到设备被其自己的用户绘制(即发生触摸事件)。那么我的画布UIImageView只是在调用TouchEvent之前才更新自己吗?我试图找到一种方法让它被迫更新(例如当我调用canvas.image = image我认为它会自动更新),但我无法解决这个问题。

无论如何,非常感谢任何建议或意见

威廉

1 个答案:

答案 0 :(得分:0)

乍一看,我认为问题是您的图形代码必须在主线程上执行。触摸事件引起的绘图肯定在主线程上,但看起来函数handleMPC...在后​​台线程上调用。将drawLineFrom调用置于此:

dispatch_async( dispatch_get_main_thread(), { drawLineFrom( fromPoint, toPoint: toPoint ) })