【发布时间】:2014-03-12 17:31:27
【问题描述】:
我正在尝试使用 UIGestureRecognizers 旋转、平移和缩放 UIView。识别器被添加到超级视图中,而旋转、缩放等被应用于子视图(_baseImage),这是为了让我将来能够在子视图之上覆盖其他东西,同时仍然接收手势事件。
这个想法是 UIView 应该围绕两个触摸点下方的子视图上的“锚点”点进行缩放/旋转,因为这似乎是最自然的。我遇到的问题是设置anchorPoint后子视图的位置,而且缩放和旋转似乎没有使用设置的anchorPoint。我对重叠坐标系/CGAffine 变换缺乏了解可能会给我带来麻烦。代码来自各种示例。
这是我目前的代码:
-(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……问题是我似乎无法让它按预期工作。
-
我现在明白了。我刚刚看到了大量处理转换的代码。
-
你的问题不是很精确,而且你的代码很复杂。我建议您尝试将其分解为运行良好的部分和有问题的部分。然后删除所有其他内容,直到您拥有最少量的代码来重现您的问题。
-
我已经尝试简化并删除了除比例元素之外的所有内容。
标签: ios objective-c uiview uigesturerecognizer cgaffinetransform