2016-04-23 23 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

はい、そうです。 CGRectContainsPoint(target.frame、position){ if notif = NSNotification(名前: "onTargetDropped"、オブジェクト:なし) NSNotificationCenter.defaultCenter()は次の条件がtrueを返すので、問題はtouchesEndedにあります。 .postNotification(notif) } ' target.frameとpositionを出力しました。結果は です。位置:(-254.0,169.5) Target.frame:(122.0,44.0,423.0,277.0)。 –

+0

'self'と' target'は同じ 'superview'を持っていますか? –

答えて

0

あなたのビュー階層をもっと見ることなく何が起こっているのか正確には言えませんが、selftargetには別のスーパービューがあります。これは、それらのフレームが異なる座標系にあることを意味します。各ビューはそれ自身の座標系を定義します。これらの座標系は時々整列することがあり、ユーザインタフェースの回転は、2つのビューの座標系が整列しているかどうかを変えることができる。

ビューのframeは、ビューのsuperviewの座標系でのみ意味を持ちます。 position = touch.locationInView(self.superview)を計算しているので、positionself.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) 

はこれを変更しました。

関連する問題