在iOS上,将缩放变焦图像移动到iPad上最左上角?

Tec*_*ain 10 iphone objective-c ipad ios uipinchgesturerecognizer

我在iOS中有一个图像.当我捏住移动到左上角的图像时,我在图像上添加了捏合手势.我还在图像上添加了平移手势.当图像被缩放然后我为了这个目的在每个方向上滚动图像我已经将平移手势添加到图像中.

我的代码是:

-(void)viewDidLoad
{
UIPinchGestureRecognizer *pinch=[[UIPinchGestureRecognizer alloc]initWithTarget:self action:@selector(handlePinch:)];
            [self.zoom_image addGestureRecognizer:pinch];
            panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(moveImage:)];
            [panGesture setMinimumNumberOfTouches:1];
            [panGesture setMaximumNumberOfTouches:1];
            [self.zoom_image addGestureRecognizer:panGesture];

            img_center_x = self.zoom_image.center.x;
            img_center_y = self.zoom_image.center.y;

}

-(void)handlePinch:(UIPinchGestureRecognizer*)sender
{
    NSLog(@"latscale = %f",mLastScale);
    mCurrentScale += [sender scale] - mLastScale;
    mLastScale = [sender scale];
    NSLog(@"before ceneter x %f",img_center_x);
    NSLog(@"before ceneter x %f",img_center_y);
    CGPoint img_center = CGPointMake(img_center_x, img_center_y);
    self.zoom_image.center = img_center;
    if (sender.state == UIGestureRecognizerStateEnded)
    {
      mLastScale = 1.0;
    }
    if(mCurrentScale<1.0)
    {
        mCurrentScale=1.0;
    }
    if(mCurrentScale>3.0)
    {
        mCurrentScale=3.0;
    }
    CGAffineTransform currentTransform = CGAffineTransformIdentity;
    CGAffineTransform newTransform = CGAffineTransformScale(currentTransform,mCurrentScale, mCurrentScale);
    self.zoom_image.transform = newTransform;

}
Run Code Online (Sandbox Code Playgroud)

潘手势

 UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(moveImage:)];
            [panGesture setMinimumNumberOfTouches:1];
            [panGesture setMaximumNumberOfTouches:1];
            [self.zoom_image addGestureRecognizer:panGesture];

move image:

- (void)moveImage:(UIPanGestureRecognizer *)recognizer
{
    CGPoint translation = [recognizer translationInView:self.zoom_image];
    CGPoint location = [recognizer locationInView:self.view];
    CGPoint initial=CGPointZero;
    NSLog(@"%f\n%f",translation.x,translation.y);
    NSLog(@"%f",self.zoom_image.frame.origin.y);
    CGPoint finalpoint = CGPointMake(self.zoom_image.center.x + translation.x, self.zoom_image.center.y+ translation.y);
    NSLog(@"%f",finalpoint.y);
    //limit the boundary
    if(recognizer.state==UIGestureRecognizerStateChanged)
    {
        if ((self.zoom_image.frame.origin.x>0 && translation.x > 0) || (self.zoom_image.frame.origin.x + self.zoom_image.frame.size.width<=self.view.frame.size.width && translation.x < 0))
            finalpoint.x = self.zoom_image.center.x;

        if ((self.zoom_image.frame.origin.y>100 && translation.y > 0) || (self.zoom_image.frame.origin.y + self.zoom_image.frame.size.height<=self.view.frame.size.height && translation.y < 0))
            finalpoint.y = self.zoom_image.center.y;
        //set final position
        NSLog(@"%f",finalpoint.y);
        self.zoom_image.center = finalpoint;
        [recognizer setTranslation:initial inView:self.zoom_image];
    }
}
Run Code Online (Sandbox Code Playgroud)

Moo*_*ose 0

这是一个可能的解决方案。

\n\n

\xe2\x80\xa2 我已将您的 Zoom_image 重命名为 contentView,因为此类可以操作任何视图,而不仅仅是图像。

\n\n

\xe2\x80\xa2 我已经删除了绑定测试,并让比例在 ( 0.01 - 10.0 )

\n\n

\xe2\x80\xa2 捏柄最多三个手指,也可用作平移。可以在不中断捏合的情况下更改触摸次数。

\n\n

还有很多地方需要改进,但主要原则就在这里:)

\n\n

接口(仍需添加 minScale、maxScale、minMargin 等属性 - 为什么不添加委托)

\n\n
@interface PinchViewController : UIViewController\n\n@property(nonatomic,strong) IBOutlet UIView* contentView;\n\n@end\n
Run Code Online (Sandbox Code Playgroud)\n\n

执行

\n\n
@implementation PinchViewController\n{\n    CGPoint translation;\n    CGFloat scale;\n\n    CGAffineTransform scaleTransform;\n    CGAffineTransform translateTransform;\n\n    CGPoint     previousTranslation;\n    CGFloat     previousScale;\n    NSUInteger  previousNumTouches;\n}\n\n-(void)viewDidLoad\n{\n    scale = 1.0f;\n    scaleTransform = CGAffineTransformIdentity;\n    translateTransform = CGAffineTransformIdentity;\n    previousTranslation = CGPointZero;\n    previousNumTouches = 0;\n\n    UIPinchGestureRecognizer *pinch=[[UIPinchGestureRecognizer alloc]initWithTarget:self action:@selector(handlePinch:)];\n    [self.view addGestureRecognizer:pinch];\n\n    UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePan:)];\n    [panGesture setMinimumNumberOfTouches:1];\n    [panGesture setMaximumNumberOfTouches:1];\n    [self.view addGestureRecognizer:panGesture];\n\n}\n\n-(void)handlePinch:(UIPinchGestureRecognizer*)recognizer\n{\n    // 1 - find pinch center\n    CGPoint mid = [self computePinchCenter:recognizer];\n    mid.x-= recognizer.view.bounds.size.width / 2.0f;\n    mid.y-= recognizer.view.bounds.size.height / 2.0f;\n\n    // 2 - compute deltas\n    NSUInteger numTouches = recognizer.numberOfTouches;\n    if ( (recognizer.state==UIGestureRecognizerStateBegan)  || ( previousNumTouches != numTouches ) ) {\n        previousScale = recognizer.scale;\n        previousTranslation = mid;\n        previousNumTouches = numTouches;\n    }\n\n    CGFloat deltaScale = ( recognizer.scale - previousScale ) * scale;\n    previousScale = recognizer.scale;\n\n    CGPoint deltaTranslation = CGPointMake(mid.x-previousTranslation.x, mid.y-previousTranslation.y);\n    previousTranslation = mid;\n\n    deltaTranslation.x/=scale;\n    deltaTranslation.y/=scale;\n\n    // 3 - apply\n    scale+=deltaScale;\n\n    if (scale<0.01) scale = 0.01; else if (scale>10) scale = 10;\n\n    scaleTransform = CGAffineTransformMakeScale(scale, scale);\n    [self translateBy:deltaTranslation];\n\n    NSLog(@"Translation : %.2f,%.2f - Scale Center : %.2f,%.2f - Scale : %.2f",deltaTranslation.x,deltaTranslation.y,mid.x,mid.y,scale);\n}\n\n- (void)handlePan:(UIPanGestureRecognizer *)recognizer\n{\n    if (recognizer.state==UIGestureRecognizerStateBegan) previousTranslation = CGPointZero;\n    CGPoint recognizerTranslation = [recognizer translationInView:self.contentView];\n    CGPoint deltaTranslation = CGPointMake(recognizerTranslation.x - previousTranslation.x,recognizerTranslation.y - previousTranslation.y);\n    previousTranslation = recognizerTranslation;\n    [self translateBy:deltaTranslation];\n\n    NSLog(@"Translation : %.2f,%.2f - Scale : %.2f",deltaTranslation.x,deltaTranslation.y,scale);\n}\n\n\n-(void)translateBy:(CGPoint)delta\n{\n    translation.x+=delta.x;\n    translation.y+=delta.y;\n    translateTransform = CGAffineTransformMakeTranslation(translation.x,translation.y);\n    self.contentView.transform = CGAffineTransformConcat(translateTransform,scaleTransform);\n}\n\n-(CGPoint)computePinchCenter:(UIPinchGestureRecognizer*)recognizer\n{\n    // 1 - handle up to 3 touches\n    NSUInteger numTouches = recognizer.numberOfTouches;\n    if (numTouches>3) numTouches = 3;\n\n    // 2 - Find fingers middle point - with (0,0) being the center of the view\n    CGPoint pt1,pt2,pt3,mid;\n    switch (numTouches) {\n        case 3:\n            pt3 = [recognizer locationOfTouch:2 inView:recognizer.view];\n        case 2:\n            pt2 = [recognizer locationOfTouch:1 inView:recognizer.view];\n        case 1:\n            pt1 = [recognizer locationOfTouch:0 inView:recognizer.view];\n    }\n    switch (numTouches) {\n        case 3:\n            mid = CGPointMake( ( ( pt1.x + pt2.x ) / 2.0f + pt3.x ) / 2.0f, ( ( pt1.y + pt2.y ) / 2.0f + pt3.y ) / 2.0f );\n            break;\n        case 2:\n            mid = CGPointMake( ( pt1.x + pt2.x ) / 2.0f, ( pt1.y + pt2.y ) / 2.0f  );\n            break;\n        case 1:\n            mid = CGPointMake( pt1.x, pt1.y);\n            break;\n    }\n    return mid;\n}\n\n@end\n
Run Code Online (Sandbox Code Playgroud)\n\n

希望它会有所帮助:) 干杯

\n