如何让图像在iOS中的分页滚动视图中进行缩放?

时间:2014-02-23 16:13:06

标签: ios uiscrollview uiimageview pagination pinchzoom

我正在尝试使用滚动视图对子视图页面进行分页,这些子视图是可以在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";

1 个答案:

答案 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项目,以便它可以编译和运行。