在横向拖放图像不起作用

时间:2016-04-23 17:31:06

标签: ios swift

我有以下代码将图像拖放到另一张图像上。

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

在纵向模式下,此功能很好,但如果我更改为横向模式并尝试拖放图像,则系统无法将图像识别为位于目标图像上方。你能解释一下为什么并指出一个可能的解决方案吗?

2 个答案:

答案 0 :(得分:1)

如果没有看到更多的视图层次结构,我无法准确说出正在发生的事情,但您说selftarget有不同的超视图。这意味着它们的框架位于不同的坐标系中。每个视图定义自己的坐标系。这些坐标系统有时可能恰好排成一行,而旋转用户界面可能会改变两个视图。坐标系排队。

视图的frame仅在视图superview的坐标系中有意义。您正在计算position = touch.locationInView(self.superview),因此position位于self.superview的坐标系中。然后你要问CGRectContainsPoint(target.frame, position)target.frame是否在不同的坐标系中,所以答案一般没有意义。

查看touch target是否在let position = touch.locationInView(target) if target.pointInside(position, withEvent: event) { // The touch is in the target. } 中的最简单方法是:

public class QuickSort {

public static <T extends Comparable<T>> void sort(T[] table) {
    quickSort(table, 0, table.length - 1);
}

private static <T extends Comparable<T>> void quickSort(T[] table, int first, int last) {
    if (first < last) {
        int pivIndex = partition(table, first, last);
        quickSort(table, first, pivIndex - 1);
        quickSort(table, pivIndex + 1, last);
    }
}

private static <T extends Comparable<T>> int partition(T[] table, int first, int last) {
    T pivot = table[first];
    int up = first;
    int down = last;
    do {
        while ((up < last) && (pivot.compareTo(table[up]) >= 0)) {
            up++;
        }
        while (pivot.compareTo(table[down]) < 0) {
            down--;
        }
        if (up < down) {
            swap(table, up, down);
        } 
    }

    while (up < down);
    swap(table, first, down);
    return down;
}

答案 1 :(得分:0)

我找到了一个解决方案,但我想了解它是如何工作的,所以如果有人能解释我为什么会这样,我会很感激。 我找到的解决方案是: 改变了这个:

let position = touch.locationInView(self.superview)

对此:

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