У меня есть следующий код для перетаскивания изображения поверх другого изображения.

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

В портретном режиме это работает хорошо, но если я перейду в альбомный режим и попытаюсь перетащить изображение, система не распознает изображение как находящееся над целевым изображением. Вы можете мне объяснить почему и указать возможное решение?

1
Amadeu Andrade 23 Апр 2016 в 20:31

2 ответа

Лучший ответ

Я не могу точно сказать, что происходит, не видя большей части вашей иерархии представлений, но вы говорите, что 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.
}
1
rob mayoff 26 Апр 2016 в 02:29

Я нашел решение, но хочу понять, как это работает, поэтому, если бы кто-нибудь мог объяснить мне, почему это работает, я был бы признателен. Решение, которое я нашел: Изменил это:

let position = touch.locationInView(self.superview)

К этому:

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

.

0
Amadeu Andrade 24 Апр 2016 в 01:13