实现UIScrollView的缩放 Objective-C语言

Posted 清风清晨

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实现UIScrollView的缩放 Objective-C语言相关的知识,希望对你有一定的参考价值。

一、接下来,我们还要用代理,用代理来干什么呢,实现缩放吧,

1.UIScrollView不仅可以用来实现滚动,还可以用来实现缩放,

手指这样来回捏,就叫“捏合手势”,

2.通过UIScrollView实现缩放的基本思路:

3.第三步,UIScrollView里面,可能会有很多个子控件,它不知道你捏合的时候,是要缩放哪一个子控件,所以这个时候,就要你写一个代理,监听这个缩放事件,这个代理事件返回一个UIScrollView的子控件,当你缩放的时候,就是缩放这个子控件,UIScrollView一次只能缩放一个子控件,

第三步,就是监听这个缩放事件,在这个缩放事件里面,当它一开始缩放的时候,立刻你给它返回一个子控件,返回一个UIScrollView里面的子控件,返回这个控件的意思就是说,告诉UIScrollView

没有 InterfaceBuilder 的 UIScrollview 缩放实现

【中文标题】没有 InterfaceBuilder 的 UIScrollview 缩放实现【英文标题】:UIScrollview Zoom implementation without InterfaceBuilder 【发布时间】:2013-02-24 04:26:58 【问题描述】:

我无法放大UIScrollView。所以问题是平移工作正常。但是,捏合和缩放不起作用。我假设的原因是我没有代表。

我的方法:

    我尝试使用委托,我想出的唯一解决方案是scrollView.delegate=self

    我知道我需要在ViewController.h 中包含一些内容,但我不知道如何输入@property UIScrollView *scrollView; 然后将其连接到缩放功能。

我相信我走在正确的轨道上,但非常感谢有关在哪里连接的建议。

ViewController.h

#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
@end

ViewController.m

@implementation ViewController

- (void)viewDidLoad

    [super viewDidLoad];

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

    scrollView.delegate = self;
    CGSize containerSize = CGSizeMake(1280, 1280);
    UIView *containerView = [[UIView alloc] initWithFrame:(CGRect)    .origin=CGPointMake(0.0f, 0.0f), .size=containerSize];
    containerView.backgroundColor = [UIColor grayColor ];
    [scrollView addSubview:containerView];


    // Set up our custom view hierarchy
    UIView *redView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 640.0f, 80.0f)];
    redView.backgroundColor = [UIColor redColor];
    [containerView addSubview:redView];

    UIView *blueView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 560.0f, 640.0f, 80.0f)];
    blueView.backgroundColor = [UIColor blueColor];
    [containerView addSubview:blueView];

    UIView *greenView = [[UIView alloc] initWithFrame:CGRectMake(160.0f, 160.0f, 320.0f, 320.0f)];
    greenView.backgroundColor = [UIColor greenColor];
    [containerView addSubview:greenView];

    UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"slow.png"]];
    imageView.center = CGPointMake(320.0f, 320.0f);
    [containerView addSubview:imageView];
    scrollView.panGestureRecognizer.minimumNumberOfTouches=2;
    CGSize containerSize2 = CGSizeMake(640, 640);
    scrollView.contentSize=containerSize2;

    CGRect viewRect = CGRectMake(self.view.bounds.origin.x, self.view.bounds.origin.y,  self.view.bounds.size.width, self.view.bounds.size.height);

    [self.view addSubview:scrollView];



- (UIView*)viewForZoomingInScrollView:(UIScrollView *)scrollView 
    // Return the view that we want to zoom
    return self.containerView; //This gives error. 

【问题讨论】:

return self.containerView; //This gives error.什么错误? 【参考方案1】:

问题很可能是您没有添加viewForZoomingInScrollView

UIScrollView 类可以有一个必须采用 UIScrollViewDelegate 协议的委托。要使缩放和平移工作,代理必须同时实现 viewForZoomingInScrollView: 和 scrollViewDidEndZooming:withView:atScale:;另外,最大(maximumZoomScale)和最小(minimumZoomScale)缩放比例必须不同。

所以添加这个:

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView;

从文档here了解更多信息

【讨论】:

raywenderlich.com/10518/… 在本教程中,作者没有实现任何这些东西。但是,他的代码运行良好。 在该页面中搜索“viewForZoomingInScrollView”。您会在页面下方大约 1/3 处看到它。 我确实有这个。我把它贴在问题的底部。【参考方案2】:

只需提供适当的缩放比例即可。

scrollView.maximumZoomScale = 2.0; //Anything greater than 1.0 will allow you to zoom in

【讨论】:

【参考方案3】:

解决了我的问题的答案: 在 ViewRect() 之后的 viewDidLoad() 中添加这段代码

CGRect viewRect = CGRectMake(self.view.bounds.origin.x, self.view.bounds.origin.y,  self.view.bounds.size.width, self.view.bounds.size.height);

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

scrollView.minimumZoomScale = minScale;
scrollView.maximumZoomScale = 1.0f;
scrollView.zoomScale = minScale;

viewController.h 应该是这样的:

@interface ViewController ()
@property UIView *containerView;
@end
@implementation ViewController

@synthesize containerView = _containerView;

【讨论】:

以上是关于实现UIScrollView的缩放 Objective-C语言的主要内容,如果未能解决你的问题,请参考以下文章

没有 InterfaceBuilder 的 UIScrollview 缩放实现

iOS开发基础-UIScrollView实现图片缩放

iOS开发-54案例学习:通过UIScrollView的缩放图片功能练习代理模式的详细实现

iOS-UIScrollView-图片缩放

UIScrollView双击缩放不捏

正确缩放包含许多子视图的 UIScrollView