如何在 iOS 中的分页滚动视图中具有收缩缩放的图像



我正在尝试使用滚动视图对子视图页面进行分页,这些子视图是可以在iOS上缩放的图像。分页有效,但一旦图像被捏合缩放,应用程序就会崩溃并显示 EXEC_BAD_ACCESS(代码=1,地址=...

我知道滑动缩放的图像来平移图像和滑动以分页有点奇怪,但在实际应用程序中,分页将使用页面控件完成。此外,我认为它可以像预览应用程序一样工作。如果缩放图像,平移将向下到图像的底部,然后到达该底部,它将转到下一个图像。

这可能吗?

下面是一个示例:

AppDelegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    ScrollerViewController *viewController = [[ScrollerViewController alloc] init];
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.window.rootViewController = viewController;
    [self.window makeKeyAndVisible];
    return YES;
}

ScrollerViewController.m - 外部分页视图控制器

- (void)viewDidLoad {
    [super viewDidLoad];
    // outer scroll view for paging with two pages
    CGRect frame = CGRectMake(0,0,self.view.bounds.size.width,self.view.bounds.size.height);
    UIScrollView *pagingScroller = [[UIScrollView alloc] initWithFrame:frame];
    pagingScroller.pagingEnabled = YES;
    pagingScroller.scrollsToTop = NO;
    pagingScroller.userInteractionEnabled = YES;
    pagingScroller.contentSize = CGSizeMake(self.view.bounds.size.width*2,self.view.bounds.size.height);
    // first page
    ImageViewController *page1 = [[ImageViewController alloc] init];
    page1.filename = @"cat.jpg";
    page1.view.frame = CGRectMake(0,0,self.view.bounds.size.width,self.view.bounds.size.height);
    [pagingScroller addSubview:page1.view];
    // second page
    ImageViewController *page2 = [[ImageViewController alloc] init];
    page2.filename = @"dog.jpg";
    page2.view.frame = CGRectMake(self.view.bounds.size.width,0,self.view.bounds.size.width,self.view.bounds.size.height);
    [pagingScroller addSubview:page2.view];
    self.view = pagingScroller;
}

ImageViewController.m - 捏缩放图像

- (void)viewDidLoad {
    [super viewDidLoad];
    // scroll view for pinch zooming
    CGRect frame = CGRectMake(0,0,self.view.bounds.size.width,self.view.bounds.size.height);
    UIScrollView *zoomScroller = [[UIScrollView alloc] initWithFrame:frame];
    zoomScroller.minimumZoomScale = 1.0;
    zoomScroller.maximumZoomScale = 5.0;
    zoomScroller.userInteractionEnabled = YES;
    zoomScroller.delegate = self;
    imageView = [[UIImageView alloc] initWithFrame:frame];
    imageView.userInteractionEnabled = YES;
    imageView.contentMode = UIViewContentModeScaleAspectFit;
    imageView.image = [UIImage imageNamed:filename];
    [zoomScroller addSubview:imageView];
    self.view = zoomScroller;
}
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView {
    return imageView;
}

整个项目正在 https://github.com/tomkincaid/ZoomScrollTest

我可以通过更改来测试捏合缩放是否有效

ScrollerViewController *viewController = [[ScrollerViewController alloc] init];

ImageViewController *viewController = [[ImageViewController alloc] init];
viewController.filename = @"cat.jpg";

你发布你的问题已经有一段时间了。我敢打赌你自己已经修复了它,但我想确保其他人可以使用你的代码。

但是,我下载了您的小型GitHub项目,发现您崩溃了,因为您没有在[ScrollerViewController viewDidLoad]中保留ImageViewController的页面1和page2。他们自己的视图不保留他们的控制器,因此控制器会在 viewDidLoad 之后释放。然后,当您捏合图像滚动视图时,它会调用其委托,但它已被解除分配。

为了解决这个问题,我在 ScrollerViewController 类中添加了两个 ImageViewController 属性,并将控制器对象存储在那里。

@interface ScrollerViewController ()
@property (strong) ImageViewController *page1;
@property (strong) ImageViewController *page2;
@end

在[ScrollerViewController viewDidLoad]中,我在最后添加了:

self.page1 = page1;
self.page2 = page2;

我希望有人会发现这些信息有用。也许您想更新您的 GitHub 项目,以便它能够编译和运行。

最新更新