Я пытаюсь повернуть, панорамировать и масштабировать UIView с помощью UIGestureRecognizers. Признаки добавляются в супервизор, в то время как поворот, масштабирование и т. Д. Применяется к subview (_baseImage), это позволяет мне в будущем окутывать другие вещи поверх подсмотра, все еще получая события жестов.Панорамирование, масштабирование, поворот UIView вокруг anchorPoint с использованием UIGestureRecognizer (iOS)
Идея состоит в том, что UIView должен масштабироваться/вращаться вокруг точки «якоря» на подсмотре под двумя точками касания, поскольку это кажется наиболее естественным. У меня возникают проблемы с позицией subview после установки anchorPoint, а также, что масштабирование и вращение не используют набор anchorPoint. Мое понимание понимания перекрывающихся координирующих систем/преобразований CGAffin может вызвать у меня проблемы. Код вытягивается из разных примеров.
Вот мой код, как он стоит на данный момент:
-(void)setAnchorPoint:(CGPoint)anchorPoint forView:(UIView *)view
{
CGPoint oldOrigin = view.frame.origin;
view.layer.anchorPoint = anchorPoint;
CGPoint newOrigin = view.frame.origin;
CGPoint transition;
transition.x = newOrigin.x - oldOrigin.x;
transition.y = newOrigin.y - oldOrigin.y;
view.center = CGPointMake (view.center.x - transition.x, view.center.y - transition.y);
}
- (void) updateTransformWithOffset: (CGPoint) translation
{
// Create a blended transform representing translation,
// rotation, and scaling
_baseImage.transform = CGAffineTransformMakeTranslation(translation.x + tx, translation.y + ty);
_baseImage.transform = CGAffineTransformRotate(_baseImage.transform, theta);
_baseImage.transform = CGAffineTransformScale(_baseImage.transform, scale, scale);
}
- (void)adjustAnchorPointForGestureRecognizer:(UIGestureRecognizer *)uigr {
if (uigr.state == UIGestureRecognizerStateBegan) {
UIView *piece = self.view;
CGPoint locationInView = [uigr locationInView:_baseImage];
myFrame = _baseImage.frame;
CGPoint newAnchor = CGPointMake((locationInView.x/piece.bounds.size.width), (locationInView.y/piece.bounds.size.height));
[self setAnchorPoint:newAnchor forView:_baseImage];
}
}
- (void) handlePinch: (UIPinchGestureRecognizer *) uigr
{
[self adjustAnchorPointForGestureRecognizer:uigr];
if (uigr.state == UIGestureRecognizerStateBegan) {
initScale = scale;
}
scale = initScale*uigr.scale;
[self updateTransformWithOffset:CGPointZero];
}
Да, вы увидите в моем коде, что я использую anchorPoint ... проблема в том, что я не могу заставить его работать должным образом. – user3306929
Я вижу это сейчас. Я просто видел большое количество кода, связанного с преобразованиями. –
Ваши вопросы не очень точные, а ваш код довольно сложный. Я предлагаю вам попробовать и разбить его на куски, которые хорошо работают, и куски, которые имеют проблемы. Затем удалите все остальное, пока не получите минимальный код, который воспроизводит вашу проблему. –