没有 InterfaceBuilder 的 UIScrollview 缩放实现

Posted

技术标签:

【中文标题】没有 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;

【讨论】:

以上是关于没有 InterfaceBuilder 的 UIScrollview 缩放实现的主要内容,如果未能解决你的问题,请参考以下文章

没有 InterfaceBuilder 的 UIScrollview 缩放实现

UIS R170 G2安装centos启动报Attempt to access block outside partition

为啥我的自定义类没有出现在 Interface Builder 的下拉列表中?

复制粘贴引发的鸠占鹊巢——IDEA复制项目导致sources root复用了另一个项目

qt 怎么打开cmakelist

C语言小游戏 贪吃蛇