2016-04-23 45 views
1

我有以下代碼將圖像拖放到另一圖像上。在橫向拖放圖像不起作用

import Foundation 
import UIKit 

class DragImg: UIImageView { 

    var originalPosition: CGPoint! 
    var dropTarget: UIView? 

    override init(frame: CGRect) { 
     super.init(frame: frame) 
    } 

    required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
    } 

    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 
     originalPosition = self.center 
    } 

    override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) { 
     if let touch = touches.first { 
      let position = touch.locationInView(self.superview) 
      self.center = CGPointMake(position.x, position.y) 
     } 
    } 

    override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) { 

     if let touch = touches.first, let target = dropTarget { 
      let position = touch.locationInView(self.superview) 
      if CGRectContainsPoint(target.frame, position) { 
       let notif = NSNotification(name: "onTargetDropped", object: nil) 
       NSNotificationCenter.defaultCenter().postNotification(notif) 
      } 
     } 
     self.center = originalPosition 
    } 
} 

在肖像模式下,該效果很好,但如果我改變爲橫向模式,並嘗試拖放圖像,系統不識別圖像爲在目標圖像。你能解釋我爲什麼並指出可能的解決方案嗎?

+0

在橫向模式下沒有touchesMoved電話? –

+0

是的。但是問題出在touchesEnded上,因爲下面的條件不會返回true: 如果CGRectContainsPoint(target.frame,position){notllif = NSNotification(name:「onTargetDropped」,object:nil) NSNotificationCenter.defaultCenter() .post通知(notif) } 我已打印目標幀和位置,結果爲: 位置:(-254.0,169.5) 目標幀:(122.0,44.0,423.0,277.0)。 –

+0

'self'和'target'有相同的'superview'嗎? –

回答

0

我不能準確地說出發生了什麼,但沒有看到更多的視圖層次結構,但是您說selftarget有不同的超級視圖。這意味着它們的框架在不同的座標系中。每個視圖定義了它自己的座標系。這些座標系可能會偶爾排隊,旋轉用戶界面可能會改變兩個視圖的座標系是否對齊。

視圖的frame僅在視圖的superview的座標系中有意義。您正在計算position = touch.locationInView(self.superview),因此position位於self.superview的座標系中。那麼你問的是CGRectContainsPoint(target.frame, position),但target.frame是在不同的座標系中,所以答案一般沒有意義。

的最簡單的方法,如果touchtarget是這樣的:

let position = touch.locationInView(target) 
if target.pointInside(position, withEvent: event) { 
    // The touch is in the target. 
} 
+0

它的工作。感謝您的解釋。 –

0

我找到了解決方案,但我想了解它是如何工作的,所以如果有人能解釋我爲什麼這個工程,我將不勝感激。 ,我已經找到解決的辦法是: 改變了這個:

let position = touch.locationInView(self.superview) 

要這樣:

let position = touch.locationInView(touch.view!.window)