如何在 iOS 的分页滚动视图中缩放图像?
Posted
技术标签:
【中文标题】如何在 iOS 的分页滚动视图中缩放图像?【英文标题】:How to have images that pinch-zoom in a paginating scroll view in iOS? 【发布时间】:2014-02-23 16:13:06 【问题描述】:我正在尝试使用滚动视图对子视图页面进行分页,这些子视图页面是可以在 ios 上进行缩放的图像。分页工作,但只要图像被捏缩放,应用程序就会崩溃,并显示 EXEC_BAD_ACCESS(code=1,address=...)
我知道滑动缩放的图像以平移图像并滑动以分页有点奇怪,但在实际应用程序中,分页将通过页面控件完成。我也认为它可以像预览应用程序一样工作。如果图像被缩放,平移将向下移动到图像的底部,然后移动到下一张图像。
这可能吗?
这是一个例子:
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";
【问题讨论】:
【参考方案1】:您发布问题已经有一段时间了。我打赌你已经自己修复了它,但我想确保其他人可以使用你的代码。
但是我下载了你的小GitHub项目,发现你崩溃了,因为你没有在[ScrollerViewController viewDidLoad]中保留ImageViewController的page1和page2。他们自己的视图不会保留他们的控制器,因此在您的情况下,控制器会在 viewDidLoad 之后被释放。然后,当您捏住图像滚动视图时,它会调用它的委托,但它已经被释放了。
为了解决这个问题,我向 ScrollerViewController 类添加了两个 ImageViewController 属性并将控制器对象存储在那里。
@interface ScrollerViewController ()
@property (strong) ImageViewController *page1;
@property (strong) ImageViewController *page2;
@end
在[ScrollerViewController viewDidLoad]我最后添加了:
self.page1 = page1;
self.page2 = page2;
我希望有人会发现此信息有用。也许您想更新您的 GitHub 项目,以便它能够编译和运行。
【讨论】:
感谢您的回答。实际上我从来没有想通并放弃了。以上是关于如何在 iOS 的分页滚动视图中缩放图像?的主要内容,如果未能解决你的问题,请参考以下文章