如何让 viewForZoomingInScrollView 在 Xcode 中跨多个 UIViewControllers 工作?

Posted

技术标签:

【中文标题】如何让 viewForZoomingInScrollView 在 Xcode 中跨多个 UIViewControllers 工作?【英文标题】:How to get viewForZoomingInScrollView to work across multiple UIViewControllers in Xcode? 【发布时间】:2017-02-18 02:52:37 【问题描述】:

我对 Xcode 比较陌生,并且正在使用 Objective C 制作一个应用程序,其中包含多个 viewControllers,每个 viewControllers 都有一个 UIScrollView,其中包含一个可以缩放和滚动的 UIImage。

此代码适用于第一张图像(皮节),但我不知道如何调整 UIView 以启用对第二张图像(anatomicPlanes)的缩放和滚动。目前第二个图像正确导入到第二个 UIScrollView,但是当我尝试缩放时它只是向下和向右跳并在那里保持静止。

UIScrollViews 的大小是使用 Interface Builder 设置的,没有问题。

viewController.h:

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController <UIScrollViewDelegate> 

    IBOutlet UIScrollView *dermatomeScrollView;
    UIImageView *dermatomesImageView;
    IBOutlet UIScrollView *anatomicPlaneScrollView;
    UIImageView *anatomicPlanesImageView;


@property (strong, nonatomic) IBOutlet UIScrollView *dermatomeScrollView;

@property (strong, nonatomic) IBOutlet UIImageView *dermatomesImageView;

@property (strong, nonatomic) IBOutlet UIImageView *anatomicPlanesImageView;

@property (strong, nonatomic) IBOutlet UIScrollView *anatomicPlaneScrollView;

@end

viewController.m

#import "ViewController.h"
@interface ViewController ()

@end

@implementation ViewController

@synthesize dermatomeScrollView, anatomicPlanesImageView, dermatomesImageView, anatomicPlaneScrollView;

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


- (void)viewDidLoad 
    [super viewDidLoad];

    UIImageView *dermatomes = [[UIImageView alloc]
                                  initWithImage:[UIImage imageNamed:@"dermatomes.jpg"]];

    self.dermatomesImageView = dermatomes;
    dermatomeScrollView. maximumZoomScale = 1.2;
    dermatomeScrollView. minimumZoomScale = 0.4;
    dermatomeScrollView. delegate = self;
    [dermatomeScrollView addSubview:dermatomesImageView];
    dermatomeScrollView.zoomScale = 0.6;

    UIImageView *planes = [[UIImageView alloc]
                               initWithImage:[UIImage imageNamed:@"anatomic planes.jpg"]];
    self.anatomicPlanesImageView = planes;
    anatomicPlaneScrollView. maximumZoomScale = 1.2;
    anatomicPlaneScrollView. minimumZoomScale = 0.4;
    anatomicPlaneScrollView. delegate = self;
    [anatomicPlaneScrollView addSubview:anatomicPlanesImageView];
    anatomicPlaneScrollView.zoomScale = 0.6;

感谢任何帮助!

【问题讨论】:

【参考方案1】:

您需要根据请求的滚动视图返回正确的视图。委托模式中的每个方法都传递了对方法调用发起者的引用,因此您的委托实现可以不同地处理它。在这种情况下,委托方法调用的发起者是滚动视图:

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView 
    if (scrollView == dermatomeScrollView) 
        return dermatomesImageView;
    

    return anatomicPlanesImageView;

如果您添加更多滚动视图,则必须进一步扩展此方法。

【讨论】:

谢谢!这正是我一直在寻找的东西(现在我看到它很直观,但我没有想到)。 太棒了!很高兴它对你有效!不要忘记接受我的回答。 :) 完成。如果其他人遇到这个问题,为了防止“控件可能到达非无效函数的结尾”错误,添加一个 else return nil; 子句 我不确定您会在哪里看到该错误消息,因为我发布的 sn-p 中的两个代码路径都以 return 结尾。 (对于任何可能对您的评论感到困惑的人。?)

以上是关于如何让 viewForZoomingInScrollView 在 Xcode 中跨多个 UIViewControllers 工作?的主要内容,如果未能解决你的问题,请参考以下文章

Jfreechart柱状图如何让变成纯色

android中如何让文字环绕图片

如何让GridView 标题居中

请教如何让UIActivityIndicatorView永远居中

如何让ActionBar标题居中

EBS如何让从值集不显示