【问题标题】:Resetting the Zoom on a UIPageViewController重置 UIPageViewController 上的缩放
【发布时间】:2015-11-16 10:07:16
【问题描述】:

我正在构建一个简单的应用程序,它由带有语言的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. 不允许将图像缩小到超出原始比例

  2. 创建双击手势以将图像恢复到原来的比例

使用功能1,用户可以放大图像,也可以完全缩小图像,缩小图像和UIPageViewControllerpageIndicators。用户没有理由可以缩小图像,所以我想允许用户放大到任何比例,但不要缩小到超过@987654330 屏幕上图像的原始大小@。

使用功能 2,我想实现一个手势来双击屏幕并让缩放后的图像恢复到原来的比例(如 Photos.app)。

更新

参考答案,我更新了问题以反映我将如何处理图像。使用第 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,它不起作用,因为它是 nil,即使我调用设置大小的类,它也是 nil。

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

作为参考,我正在使用平移:

- (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));
        }];
    }
}

目前效果很好,但肯定会与其他所有内容发生冲突。

我真的很感激任何关于这方面正确方向的指导。

【问题讨论】:

    标签: ios objective-c iphone uiimage uipageviewcontroller


    【解决方案1】:

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

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

    2.) 您似乎正在更改视图的框架以尝试更改其比例,但您从来没有自己调整过视图的框架。您正在调整视图的transform。这意味着为了将其恢复为原始大小,您必须删除您对其进行的任何变换。要做到这一点,你把它放回它的身份。所以...

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

    我的代码示例是用 Swift 编写的,但您应该可以自己将其调整为 Objective-C。此外,您似乎正在调整整个页面视图本身的变换/比例。我建议您仅更改图像视图的比例。这更有意义,因为这实际上就是您要放大的内容。

    【讨论】:

    • 亲爱的@Sam - 非常感谢您为此所做的工作,我非常感谢!所以有几点需要注意——第二点几乎完美无缺,但它可​​能是对第一点的反映。自从写了这个问题以来,我稍微改变了我的模型,因为 UIImageView 实际上是从另一个我设置大小的类调用的,等等。所以我用 UIImages 的 NSArray 加载 UIPageViewController 并且另一个类正在获取大小,所以如果我在这种情况下使用 self.imageView 作为第一点,那就是零。我已经用所有内容更新了问题
    • 继续,但我怀疑我做事的方式真的一团糟!
    • 嗨@Sam - 所以我认为我现在遇到的唯一问题是阻止缩小(如果我按照结构检查比例 - 它不允许我缩小图像, 但是如果我放大, 它也不允许我缩小. 其次, 双击手势使 UIPageViewController 居中于我点击它的位置, 所以如果我四处平移, 它将使点击居中并遮住图像的其余部分。
    猜你喜欢
    • 2013-11-18
    • 1970-01-01
    • 2022-01-20
    • 2013-11-09
    • 1970-01-01
    • 2015-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多