У меня есть следующий код для перетаскивания изображения поверх другого изображения.
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 ответа
Я не могу точно сказать, что происходит, не видя большей части вашей иерархии представлений, но вы говорите, что 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.
}
Я нашел решение, но хочу понять, как это работает, поэтому, если бы кто-нибудь мог объяснить мне, почему это работает, я был бы признателен. Решение, которое я нашел: Изменил это:
let position = touch.locationInView(self.superview)
К этому:
let position = touch.locationInView(touch.view!.window)
.
Похожие вопросы
Новые вопросы
ios
iOS - мобильная операционная система, работающая на Apple iPhone, iPod touch и iPad. Используйте этот тег [ios] для вопросов, связанных с программированием на платформе iOS. Используйте связанные теги [target-c] и [swift] для проблем, характерных для этих языков программирования.