首页 文章

重置UIPageViewController上的缩放

提问于
浏览
0

我正在构建一个由带有语言的 UITableViewController 构成的简单应用程序,当单击特定单元格时,会调出 UIPageViewController 来表示所选语言的图像 . 用户可以滚动图像,一切都按照需要工作 . 下一步是在 UIPageViewController 中构建缩放功能,以便用户可以使用捏合手势放大图像 .

我用以下代码实现了这个目的:

- (void)viewDidLoad
{
[super viewDidLoad];
self.leafletImages = [NSMutableArray arrayWithObjects:[[ImageModel alloc] initWithImageName:@"3facts-chinese-page1.jpg"], [[ImageModel alloc] initWithImageName:@"3facts-chinese-page2.jpg"], [[ImageModel alloc] initWithImageName:@"3facts-chinese-page3.jpg"], [[ImageModel alloc] initWithImageName:@"3facts-chinese-page4.jpg"], [[ImageModel alloc] initWithImageName:@"3facts-chinese-page5.jpg"], [[ImageModel alloc] initWithImageName:@"3facts-chinese-page6.jpg"], nil];

    // Lots of code for the building up of the UIPageViewController

LeafletImageSizeViewController *imageViewController = [[LeafletImageSizeViewController alloc] init];
imageViewController.model = [_modelArray objectAtIndex:0];
NSArray *viewControllers = [NSArray arrayWithObject:imageViewController];

[self.pageViewController setViewControllers:viewControllers
                                  direction:UIPageViewControllerNavigationDirectionForward
                                   animated:NO
                                 completion:nil];


    // Gesture
    UIPinchGestureRecognizer *pinchRecognizer = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinchDetected:)]; 
    [self.view addGestureRecognizer:pinchRecognizer];
    pinchRecognizer.delegate=self;

}

创建图像和大小的类是:

- (void)useThreeFactsSize
CGRect insetFrame;
        insetFrame = CGRectMake(310, 70, self.view.frame.size.width-615, self.view.frame.size.height-85);
_imageView = [[UIImageView alloc] initWithFrame:insetFrame];
[_imageView setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight];
[_imageView setImage:[UIImage imageNamed:_model.imageName]];
[[self view] addSubview:_imageView];
[self.view setBackgroundColor:[UIColor clearColor]];

}

pinchDetection方法是:

-(void)pinchDetected:(UIPinchGestureRecognizer *)pinchRecognizer
{
    CGFloat scale = pinchRecognizer.scale;
    self.pageViewController.view.transform = CGAffineTransformScale(self.pageViewController.view.transform, scale, scale);
    pinchRecognizer.scale = 1.0;
}

现在,我可以放大 UIPageViewController 的图像,没有任何问题,它的效果非常好 .

但我想做的是两件事:

  • 不允许将图像缩小到原始比例之外

  • 创建双击手势可将图像恢复为原始比例

使用功能1,用户可以放大图像,但也可以完全缩小缩小图像的图像和 UIPageViewController pageIndicators . 有's no reason the user should be able to zoom out of the image, so I' d喜欢允许用户放大到任何比例,但不能缩小超出 UIPageViewController 屏幕上图像的原始大小 .

使用功能2,我想实现一个手势来双击屏幕,并使缩放的图像返回到它的原始比例(如Photos.app) .

Update

参考答案,我已经更新了问题,以反映我将如何处理图像 . 使用第2点和双击手势,以下代码几乎可以正常工作:

- (void)scrollViewTwoFingerTapped:(UITapGestureRecognizer *)recognizer
{
    NSLog(@"Double Tap");
    self.pageViewController.view.transform = CGAffineTransformIdentity;

}

它目前正在做的是如果我用捏和平移放大,然后双击,它将图像居中到我点击的位置,所以有时会显示边框等,而不是使图像居中应该在哪里 .

对于第1点:

if (pinchRecognizer.scale > 1) {


    CGFloat scale = pinchRecognizer.scale;
    self.pageViewController.view.transform = CGAffineTransformScale(self.pageViewController.view.transform, scale, scale);
    pinchRecognizer.scale = 1.0;


}

如果我有self.imageview,它不起作用,因为它是零,即使我调用设置大小的类,它也是零 .

我怀疑我的代码有很多问题!

作为参考,我已经开始使用:

- (void)panGestureDetected:(UIPanGestureRecognizer *)recognizer
{
    UIGestureRecognizerState state = [recognizer state];

    if (state == UIGestureRecognizerStateBegan || state == UIGestureRecognizerStateChanged)
    {
        CGPoint translation = [recognizer translationInView:recognizer.view];
        [recognizer.view setTransform:CGAffineTransformTranslate(recognizer.view.transform, translation.x, translation.y)];
        [recognizer setTranslation:CGPointZero inView:recognizer.view];
    }
    else if(state==UIGestureRecognizerStateEnded){
        UIView *imageView = recognizer.view;
        UIView *container = imageView.superview;

        CGFloat targetX = CGRectGetMinX(imageView.frame);
        CGFloat targetY = CGRectGetMinY(imageView.frame);


        if(targetX>0){
//                        targetX = 0;
        }else if(CGRectGetMaxX(imageView.frame)<CGRectGetWidth(container.bounds)){
            targetX = CGRectGetWidth(container.bounds)-CGRectGetWidth(imageView.frame);
        }

        if(targetY>0){
//                        targetY = 0;
        }else if(CGRectGetMaxY(imageView.frame)<CGRectGetHeight(container.bounds)){
//                        targetY = CGRectGetHeight(container.bounds)-CGRectGetHeight(imageView.frame);
        }


//        imageView.frame = CGRectMake(targetX, targetY, CGRectGetWidth(imageView.frame), CGRectGetHeight(imageView.frame));

        [UIView animateWithDuration:0.3 animations:^{
            imageView.frame = CGRectMake(targetX, targetY, CGRectGetWidth(imageView.frame), CGRectGetHeight(imageView.frame));
        }];
    }
}

目前这种方法运作良好,但肯定与其他一切都存在冲突 .

我非常感谢任何关于正确方向的指导 .

1 回答

  • 0

    1.)为了不允许图像缩小到超出原始比例,您首先需要检查您要将其设置为的比例是否大于1 . 如果它小于1,您不希望重新缩放图像,因为这意味着它会变小 . 所以...

    @IBAction func doPinch(sender: UIPinchGestureRecognizer) {
        if sender.scale > 1 {
            let transform = CGAffineTransformMakeScale(sender.scale, sender.scale)
    
            imageView.transform = transform
        }
    }
    

    2.)您似乎正在更改视图's frame to try and change it' s比例,但您从未调整视图's frame yourself in the first place. You'重新调整视图的 transform . 这意味着为了将它返回给它's original size you must remove whatever transform you put on it. To do this you put it back to it'的身份 . 所以...

    @IBAction func doDoubleTap(sender: UITapGestureRecognizer) {
        imageView.transform = CGAffineTransformIdentity
    }
    

    我的代码示例在Swift中,但您应该可以自己将其调整为Objective-C . 此外,您似乎正在调整整个页面视图本身的变换/比例 . 我建议你只改变图像视图的比例 . 这更有意义,因为这实际上是你想要放大的东西 .

相关问题