【问题标题】:Symmetric zooming of image within scrollview in iOSiOS中滚动视图内图像的对称缩放
【发布时间】:2014-11-27 10:02:39
【问题描述】:

我是 iPhone 到 iOS 开发的新手。我想要一个演示放大和缩小(图像的对称缩放)iOS 中滚动视图中的图像。这是我的代码:在这段代码中,我在滚动视图(ZoomScrollView)和另一个滚动视图中拍摄了一个图像视图滚动视图(scrollView_Gallery)。提前致谢..

//ZoomGalleryViewController.m//

    scrollView_Gallery.backgroundColor                 = [UIColor yellowColor];
    scrollView_Gallery.delegate                        = self;
    scrollView_Gallery.pagingEnabled                   = YES;
    scrollView_Gallery.userInteractionEnabled          = YES;
    scrollView_Gallery.showsHorizontalScrollIndicator  = NO;
    scrollView_Gallery.showsVerticalScrollIndicator    = NO;
    [self.view addSubview:scrollView_Gallery];

    if(UI_USER_INTERFACE_IDIOM()==UIUserInterfaceIdiomPhone)
    {
        [scrollView_Gallery setContentSize:CGSizeMake(self.view.frame.size.width*[arrayUrl count],self.view.frame.size.height)];
    }
    else if(UI_USER_INTERFACE_IDIOM()==UIUserInterfaceIdiomPad)
    {
        [scrollView_Gallery setContentSize:CGSizeMake([[UIScreen mainScreen] bounds].size.width*[arrayUrl count],[[UIScreen mainScreen] bounds].size.height)];

    }

    for (int i = 0; i < [arrayUrl count]; i++)
    {
        zoomScrollView                       = [[ZoomScrollView alloc]init];
        zoomScrollView.backgroundColor       = [UIColor redColor];
        [zoomScrollView setContentSize:CGSizeMake(zoomScrollView.contentSize.width,zoomScrollView.frame.size.height)];

        CGRect frame                         = scrollView_Gallery.frame;
        frame.origin.x                       = (frame.size.width)* i;
        frame.origin.y                       = 0;
        zoomScrollView.frame                 = frame;
        zoomScrollView.imageView.contentMode = UIViewContentModeScaleAspectFit;

        NSMutableURLRequest *request         = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:[[arrayUrl objectAtIndex:i]objectForKey:@"photopath"]]];
        __weak UIImageView *weakImageView    = zoomScrollView.imageView;

        zoomScrollView.imageView.tag         = i;
        zoomScrollView.ZOOM_VIEW_TAG         = zoomScrollView.imageView.tag;
        [zoomScrollView.imageView setImageWithURLRequest:request
                                        placeholderImage:nil
                                                 success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image)
        {
            NSLog(@"image=%f,imageheight=%f",image.size.width,image.size.height);
            UIImageView *strongImageView = weakImageView; // make local strong reference to protect against race conditions

            strongImageView.frame  = CGRectMake(0,0,image.size.width*image.scale, image.size.height*image.scale);
            strongImageView.center = scrollView_Gallery.center;

            NSLog(@"image11    = %f, imageheight11 = %f",image.size.width*image.scale, image.size.height*image.scale);
            NSLog(@"imageScale = %f",image.scale);

            if (!strongImageView) return;
            [UIView transitionWithView:strongImageView
                              duration:0.3
                               options:UIViewAnimationOptionTransitionCrossDissolve animations:^{
                                strongImageView.image = image;
         }
            completion:NULL];
           //[scrollView_Gallery setContentOffset:CGPointMake(strongImageView.frame.size.width * (indexNumber+1), 0)];
        }failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error){
                NSLog(@"Request failed with error: %@", error);
        }];
        [scrollView_Gallery addSubview:zoomScrollView];

        [zoomScrollView setContentSize:CGSizeMake(zoomScrollView.contentSize.width,zoomScrollView.frame.size.height)];
        if(UI_USER_INTERFACE_IDIOM()==UIUserInterfaceIdiomPhone)
        {
             [scrollView_Gallery setContentOffset:CGPointMake(self.view.frame.size.width * (indexNumber), 0)];
        }
        else if(UI_USER_INTERFACE_IDIOM()==UIUserInterfaceIdiomPad)
        {
              [scrollView_Gallery setContentOffset:CGPointMake([[UIScreen mainScreen] bounds].size.width * (indexNumber), 0)];

        }


//  ZoomScrollView.h//

#import <UIKit/UIKit.h>


@interface MRZoomScrollView : UIScrollView <UIScrollViewDelegate>
{
    UIImageView *imageView;
}

@property (nonatomic, retain) UIImageView *imageView;


@end

// MRZoomScrollView.m//

#import "MRZoomScrollView.h"

#define MRScreenWidth      CGRectGetWidth([UIScreen mainScreen].applicationFrame)
#define MRScreenHeight     CGRectGetHeight([UIScreen mainScreen].applicationFrame)

@interface MRZoomScrollView (Utility)

- (CGRect)zoomRectForScale:(float)scale withCenter:(CGPoint)center;

@end

@implementation MRZoomScrollView

@synthesize imageView;

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {

        self.delegate = self;
        self.frame = CGRectMake(0, 0, MRScreenWidth, MRScreenHeight);

        [self initImageView];
    }
    return self;
}

- (void)initImageView
{
    imageView = [[UIImageView alloc]init];
    // The imageView can be zoomed largest size

    imageView.frame = CGRectMake(0, 0, MRScreenWidth * 2.5, MRScreenHeight * 2.5);
    imageView.userInteractionEnabled = YES;
    [self addSubview:imageView];
    [imageView release];

    // Add gesture,double tap zoom imageView.
    UITapGestureRecognizer *doubleTapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleDoubleTap:)];
    [doubleTapGesture setNumberOfTapsRequired:2];
    [imageView addGestureRecognizer:doubleTapGesture];
    [doubleTapGesture release];

    float minimumScale = self.frame.size.width / imageView.frame.size.width;
    [self setMinimumZoomScale:minimumScale];
    [self setZoomScale:minimumScale];
}


#pragma mark - Zoom methods

- (void)handleDoubleTap:(UIGestureRecognizer *)gesture
{
    float newScale = self.zoomScale * 1.5;
    CGRect zoomRect = [self zoomRectForScale:newScale withCenter:[gesture locationInView:gesture.view]];
    [self zoomToRect:zoomRect animated:YES];
}

- (CGRect)zoomRectForScale:(float)scale withCenter:(CGPoint)center
{
    CGRect zoomRect;
    zoomRect.size.height = self.frame.size.height / scale;
    zoomRect.size.width  = self.frame.size.width  / scale;
    zoomRect.origin.x = center.x - (zoomRect.size.width  / 2.0);
    zoomRect.origin.y = center.y - (zoomRect.size.height / 2.0);
    return zoomRect;
}


#pragma mark - UIScrollViewDelegate

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
{
    return imageView;
}

- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale
{
    [scrollView setZoomScale:scale animated:NO];
}

【问题讨论】:

    标签: ios objective-c iphone pinchzoom scroll-paging


    【解决方案1】:

    您可以使用 UIScrollView 并启用enabledZoom ON。

    - (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
    {
        return self.imageView;
    }
    

    在 viewDidLoad 方法中粘贴这段代码

    - (void)viewDidLoad {
        [super viewDidLoad];
        self.scrollView.minimumZoomScale=0.5;
        self.scrollView.maximumZoomScale=6.0;
        self.scrollView.contentSize=CGSizeMake(1280, 960);
        self.scrollView.delegate=self;
    }
    

    【讨论】:

    • 我已经使用了这段代码,但仍然面临问题。我想制作一个带有双击图像缩放和分页缩放缩放的照片库。你能为我提供一个演示项目吗?我会非常感谢你。
    • 我正在尝试使用滚动视图对子视图页面进行分页,这些子视图是可以在 iOS 上进行捏合缩放的图像。
    【解决方案2】:

    看this教程,对我很有帮助:

    【讨论】:

    • 在本教程的帮助下,我能够在滚动视图中对称地捏合和缩放图像,但我必须在滚动视图分页中进行对称缩放和捏合。在进行像缩放这样的分页时,我面临着图像对称缩放的问题。我会非常感谢你。
    • 在上面,我的意思是说我正在尝试使用滚动视图与子视图页面进行分页,这些子视图是可以在 iOS 上对称缩放的图像。
    • 我认为更好的是使用启用分页的 UICollectionView,将 UIScrollView 放入其 Cells,并将 UIImages 放入其。
    • 我有一个演示,其中图像的缩放和收缩是通过分页完成的。但是当我将此代码用于我的代码时,缩放不是对称的。这是演示的链接:code4app.net/ios/Pinch-ScrollView-Image/…。
    • 所以,我尝试使用这段代码,它工作正常,它对称缩放,你确定你在这个例子中所做的一切吗?
    【解决方案3】:

    假设您有一个属性 scrollView,请在您的视图控制器的 viewDidLoad 或 viewWillAppear 方法中尝试以下代码:

      self.scrollView.minimumZoomScale=1.0;
        self.scrollView.maximumZoomScale=2.0;
        self.scrollView.contentSize=self.scrollView.frame.size;
        self.scrollView.bounces=YES;
        self.scrollView.delegate=self;
    

    让您的视图控制器符合 UIScrollViewDelegate 协议。并实现委托方法:

    - (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
    {
        return self.imageView;// return the imageView inside the scrollview which has to be scaled.
    }
    

    【讨论】:

    • 我已经使用了这段代码,但仍然面临问题。你能给我一个演示项目吗
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多