Устранение неисправностей Сенсорные координаты после изменения ориентации устройства - PullRequest
1 голос
/ 30 августа 2011

Хорошо, сценарий таков, что у меня есть собственный класс, который создает представление, содержащее изображение, и обрабатывает все его собственные сенсорные события.Иногда я хочу проверить, не приведет ли его перемещение к другому представлению родительского представления.Поэтому после соответствующего события касания я вызываю метод в родительском представлении, передавая его последнему касанию, и возвращаю BOOL.Это работает нормально, пока приложение остается в портретной ориентации.

Проблема связана с поворотом устройства, и все изображения автоматически поворачиваются для меня. Передаваемая CGPoint теперь находится в повернутой системе координат по сравнению с родительским представлением ивызываемый метод CGRectContainsPoint больше не работает должным образом.

В моем методе willAnimateRotationToInterfaceOrientation я настраиваю положение каждого настраиваемого представления для улучшения макета для новой ориентации, например

view.frame = CGRectMake((view.frame.origin.x*1.5),(view.frame.origin.y/1.5),view.frame.size.width,view.frame.size.height);

Я прочитал этовызов метода setBound привел бы к сбросу системы координат:

[view setBounds:view.frame];

, но в моем случае это не имеет значения.Я также пытался повозиться с «convertPoint: toView», но значения, которые он давал, тоже не имели особого смысла.Я пришел к выводу, что это не сработает в случае, если система координат была повернута?

Ответы [ 2 ]

1 голос
/ 30 августа 2011

Когда ваше представление поворачивается (используя механизм автоматического поворота), iOS просто применяет CGAffineTransform к вашему представлению, чтобы повернуть его содержимое.

Таким образом, вы сможете получить текущий CGAffineTransform, примененный к вашемуUIView, затем примените это CGAffineTransform к точке вашего UITouch, используя CGPointApplyAffineTransform (возможно, после инверсии AffineTransform, чтобы применить обратное преобразование к вашей точке. Не проверял этот код, только записывал это из памяти)

UITouch* touch = [touches anyObject];
CGPoint pt = [touch locationInView:self];
CGAffineTransform inverseTransform = CGAffineTransformInvert(self.transform);
CGPoint transformedPoint = CGPointApplyAffineTransform(pt,inverseTransform);
0 голосов
/ 01 апреля 2013

Вид корневого viewController всегда действует как портретный режим.Вы должны вставить новый вид внутри корневого.И это новое представление будет работать правильно, даст правильный размер и координаты, как говорит Apple.

например;

UIView *v = self;
while ([[v superview] superview] != NULL) {
    v = [v superview];
}

UITouch *touch = [touches anyObject];
CGPoint touchPoint = [touch locationInView:v];

TouchPoint будет правильным.

...