我正在尝试使用滚动视图对子视图页面进行分页,这些子视图是可以在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";
答案 0 :(得分: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项目,以便它可以编译和运行。