Zoom&在UIScrollView中的UIImageView中平移

时间:2012-11-28 07:25:25

标签: uiscrollview uiimageview uigesturerecognizer

我有一个UIScrollView,里面装满了UIImageView。 UIScrollView启用了分页功能,允许用户“翻转”这些图像。每个UIImageView都有UIPinchGestureRecognizer用于捏缩放,UIPanGestureRecognizer用于在放大时平移图像。
您可能已经注意到了,我想要实现的就像iBooks在其应用程序中所做的那样。

但是,我很难完成这项工作。

在我的“BookPageViewController”中,我已经设置了UIScrollView,然后根据来自sqlite的数据(页码,文件名等)从文件夹中填充图像。

_pageScrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];

NSUInteger pageCount = [pages count];

for (int i = 0; i < pageCount; i++) {

    CGFloat x = i * self.view.frame.size.width;

    // Page Settings
    UIImageView *pageView = [[UIImageView alloc] initWithFrame:CGRectMake(x, 0, self.view.frame.size.width, self.view.frame.size.height)];

    pageView.backgroundColor = [UIColor greenColor];
    pageView.image = [pages objectAtIndex:i];
    pageView.userInteractionEnabled = YES;
    pageView.tag = i;

    // Gesture Reocgnisers
    UIPinchGestureRecognizer *pinchGr = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinchImage:)];
    pinchGr.delegate = self;
    [pageView addGestureRecognizer:pinchGr];

    UIPanGestureRecognizer *panGr = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panImage:)];
    [pageView addGestureRecognizer:panGr];

    // Finally add this page to the ScrollView
    [_pageScrollView addSubview:pageView];
}  

_pageScrollView.contentSize = CGSizeMake(self.view.frame.size.width * pageCount, self.view.frame.size.height);
_pageScrollView.pagingEnabled = YES;
_pageScrollView.delegate = self;

[self.view addSubview:_pageScrollView];  

在Stackoverflow的另一个好问题的帮助下,我把它们放在了:

- (void) pinchImage:(UIPinchGestureRecognizer*)pgr {

  [self adjustAnchorPointForGestureRecognizer:pgr];

  if ([pgr state] == UIGestureRecognizerStateBegan || [pgr state] == UIGestureRecognizerStateChanged) {
    if ([pgr scale]) {
        NSLog(@"SCALE: %f", [pgr scale]);
        [pgr view].transform = CGAffineTransformScale([[pgr view] transform], [pgr scale], [pgr scale]);
        [pgr setScale:1];
    } else {
        NSLog(@"[PAMPHLET PAGE]: The image cannot be scaled.");
    }
  }
}  

我的问题是,当我用Pinch Gesture放大UIImageView之一时,图像会超过(转过)到下一个图像并隐藏它。我相信应该有“限制”放大/缩小和UIImageView(不是UIImage本身)的大小的方法,但我不知道从哪里开始。我还放了一个代码来限制比例:

([pgr scale] > 1.0f && [pgr scale] < 1.014719) || ([pgr scale] < 1.0f && [pgr scale] > 0.98f)

但它不起作用......

我知道这对ios专业人士来说并不难,但我对objective-c很新,这是我第一次开发真正的应用程序。如果这不是一个好习惯,我也想知道如何像ibooks一样实现这一点的想法(例如将UIImageView放在UIScrollView中,然后将UIScrollView放到另一个UIScrollView中)......

对不起另一个初学者问题,但我真的需要帮助 提前谢谢。

1 个答案:

答案 0 :(得分:0)

如果不亲自尝试,我的第一个猜测就是UIImageView上的变换也会改变它的帧。解决这个问题的一种方法是将UIImageView放在另一个UIView中,并将UIView放在UIScrollView中。您的手势识别器和转换仍将在UIImageView上。确保UIView的clipsToBounds属性设置为YES。