且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

方向更改后将UIScrollView重置为新的框架尺寸

更新时间:2022-12-25 21:07:26

如果有人感兴趣的话,让它工作。我不得不对我的ImageZoom.m文件进行一些更改:

Got it working in case anyone is interested. I had to make some changes to my ImageZoom.m file:

#import "ImageZoom.h"

@interface ImageZoom ()

@property (nonatomic, strong) UIImage *image;
@property (nonatomic, strong) UIImageView *imageView;
@property (nonatomic, strong) UIScrollView *scrollView;
@property BOOL zoomed;

@end

@implementation ImageZoom

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self)
    {
        [self loadContentWithFrame:frame];
    }
    return self;
}
-(void)loadContentWithFrame:(CGRect)frame
{
    self.scrollView = [[UIScrollView alloc]initWithFrame:CGRectMake(self.frame.origin.x, self.frame.origin.y, frame.size.width, frame.size.height)];
    self.scrollView.delegate = self;
    self.scrollView.contentSize = self.image.size;
    self.backgroundColor = [UIColor redColor];
    [self.scrollView addSubview:self.imageView];
    [self addSubview:self.scrollView];

    CGRect scrollViewFrame = self.scrollView.frame;
    CGFloat scaleWidth = scrollViewFrame.size.width / self.scrollView.contentSize.width;
    CGFloat scaleHeight = scrollViewFrame.size.height / self.scrollView.contentSize.height;
    CGFloat minScale = MIN(scaleWidth, scaleHeight);

    self.scrollView.minimumZoomScale = minScale;
    self.scrollView.maximumZoomScale = 1;
    self.scrollView.zoomScale = minScale;

    UITapGestureRecognizer *doubleTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(scrollViewDoubleTapped:)];
    doubleTapRecognizer.numberOfTapsRequired = 2;
    doubleTapRecognizer.numberOfTouchesRequired = 1;
    [self.scrollView addGestureRecognizer:doubleTapRecognizer];

    self.zoomed = NO;
}

-(void)willAnimateToFrame:(CGRect)frame
{
    self.frame = frame;
    [self loadContentWithFrame:frame];
}


- (id)initWithImageView:(UIImageView *)imageView andFrame:(CGRect)frame
{
    self.image = imageView.image;
    self.imageView = imageView;
    return [self initWithFrame:frame];
}

- (id)initWithImage:(UIImage *)image andFrame:(CGRect)frame
{
    self.image = image;
    self.imageView = [[UIImageView alloc] initWithImage:self.image];
    return [self initWithFrame:frame];
}

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

- (void)scrollViewDidZoom:(UIScrollView *)sv
{
    UIView* zoomView = [sv.delegate viewForZoomingInScrollView:sv];
    CGRect zoomViewFrame = zoomView.frame;
    if(zoomViewFrame.size.width < sv.bounds.size.width)
    {
        zoomViewFrame.origin.x = (sv.bounds.size.width - zoomViewFrame.size.width) / 2.0;
    }
    else
    {
        zoomViewFrame.origin.x = 0.0;
    }
    if(zoomViewFrame.size.height < sv.bounds.size.height)
    {
        zoomViewFrame.origin.y = (sv.bounds.size.height - zoomViewFrame.size.height) / 2.0;
    }
    else
    {
        zoomViewFrame.origin.y = 0.0;
    }
    zoomView.frame = zoomViewFrame;
}

- (void)scrollViewDoubleTapped:(UITapGestureRecognizer*)recognizer
{
    if(self.zoomed==NO)
    {
        CGPoint pointInView = [recognizer locationInView:self.imageView];
        CGSize scrollViewSize = self.scrollView.bounds.size;
        CGFloat w = scrollViewSize.width / self.scrollView.maximumZoomScale;
        CGFloat h = scrollViewSize.height / self.scrollView.maximumZoomScale;
        CGFloat x = pointInView.x - (w / 2.0);
        CGFloat y = pointInView.y - (h / 2.0);

        CGRect rectToZoomTo = CGRectMake(x, y, w, h);

        [self.scrollView zoomToRect:rectToZoomTo animated:YES];
        self.zoomed = YES;
    }
    else if(self.zoomed == YES)
    {
        CGRect rectToZoomTo = CGRectMake(0, 0, self.scrollView.contentSize.width, self.scrollView.contentSize.height);
        [self.scrollView zoomToRect:rectToZoomTo animated:YES];
        self.zoomed = NO;
    }
}

@end