我希望更改现有的 iOS 应用程序,以便不使用多点触控手势来调整图像的大小和旋转(两指捏合/缩放和扭曲),我希望在图像的所有四个角上都有一个句柄和一个在顶部,以便用户可以抓住其中一个手柄来重新调整大小或旋转。
我一直在研究这个话题,但找不到任何指向我正确方向的东西。
请参阅此图像以获取我正在谈论的示例-
我希望更改现有的 iOS 应用程序,以便不使用多点触控手势来调整图像的大小和旋转(两指捏合/缩放和扭曲),我希望在图像的所有四个角上都有一个句柄和一个在顶部,以便用户可以抓住其中一个手柄来重新调整大小或旋转。
我一直在研究这个话题,但找不到任何指向我正确方向的东西。
请参阅此图像以获取我正在谈论的示例-
听起来相当直截了当。作为 ASCII 艺术的一种可能解决方案的视图层次结构:
Container (ScalingRotatingView)
|
+----imageView (UIImageView)
|
+----upperLeftScalingHandle (HandleView)
|
+----upperRightScalingHandle (HandleView)
|
+----lowerLeftScalingHandle (HandleView)
|
+----lowerRightScalingHandle (HandleView)
|
+----rotatingHandle (HandleView)
HandleView 的所有实例都会有一个平移手势识别器,它提供控制器中的两种方法之一:
- -updateForScaleGesture:
,您将使用手势识别-translationInView:
器计算和存储新比例,然后适当地更新所有视图的框架,并将平移重置为 0,以及 - -updateForRotationGesture:
,您将使用手势识别器的位置-translationInView:
器来计算和存储在更新帧和重置识别器的翻译之前的新角度。
对于这两种计算,您都需要在图像视图的坐标系中进行平移。对于缩放部分,您可以简单地将新边缘长度除以自然图像尺寸,对于旋转,您可以使用仅平移的 x 分量很重要的近似值:
sin(x) = x
(对于较小的 x 值)
哦,如果您的图像视图的锚点位于其中心,这肯定会有所帮助......</p>
我假设因为您从一个已经具有工作捏缩放和扭曲手势的应用程序开始,所以您的问题仅仅是如何为手柄显示那些半透明的圆圈。我倾向于创建UIView
绘制圆圈的子类,如下所示:
@implementation HandleView
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
self.backgroundColor = [UIColor clearColor];
self.userInteractionEnabled = YES;
}
return self;
}
- (void)drawRect:(CGRect)rect
{
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextAddEllipseInRect(context, rect);
CGContextSetFillColorWithColor(context, [[UIColor colorWithWhite:1.0 alpha:0.5] CGColor]); // white translucent
CGContextSetStrokeColorWithColor(context, [[UIColor colorWithWhite:0.25 alpha:0.5] CGColor]); // dark gray translucent
CGContextSetLineWidth(context, 1.0);
CGContextDrawPath(context, kCGPathEOFillStroke); // draw both fill and stroke
}
@end
CAShapeLayer
如果您不想像drawRect
我上面那样使用 Core Graphics 调用编写自己的调用,您也可以使用层实现相同的效果。但想法是一样的。
然后,您的视图控制器可以添加这五个视图并为它们添加手势识别器,如下所示:
HandleView *handleView = [[HandleView alloc] initWithFrame:CGRectMake(50, 50, 50, 50)];
[self.view addSubview:handleView];
UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePan:)];
[handleView addGestureRecognizer:pan];
只需对屏幕上所需的每个句柄重复此操作即可。然后编写你的手势识别器来做任何你想做的事情(例如移动边界矩形,移动适当的手柄等)。