我有以下代码将图像拖放到另一张图像上。
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 :(得分:1)
如果没有看到更多的视图层次结构,我无法准确说出正在发生的事情,但您说self
和target
有不同的超视图。这意味着它们的框架位于不同的坐标系中。每个视图定义自己的坐标系。这些坐标系统有时可能恰好排成一行,而旋转用户界面可能会改变两个视图。坐标系排队。
视图的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)