缩放后启用UIScrollView的分页功能

7

我有一个加载了三个不同页面的UIScrollView
当我对页面进行缩放,并缩回到原始大小时,应用程序停止让我在页面之间滚动,就像分页已被禁用一样。当缩放回原始大小(比例==1)时,我该怎么做才能重新启用分页?

这是我的代码

- (void)viewDidLoad
{
    [ScView setMaximumZoomScale : 2.0f];
    [ScView setMinimumZoomScale : 1.0f];

    ScView.contentSize = CGSizeMake(1024*3, 1.0);
    ScView.pagingEnabled = YES;

    ScView.clipsToBounds = YES;
    ScView.delegate = self;

    ScView.showsHorizontalScrollIndicator = NO;
    ScView.showsVerticalScrollIndicator = NO;

    [super viewDidLoad]; 

    [self returnImages];
}

-(void)returnImages{
    for (pageNumber = 1; pageNumber <= 3; pageNumber++) {
        imagen = [[UIImageView alloc] initWithImage:[UIImage imageNamed:[NSString stringWithFormat:@"%d.png",pageNumber]]];
        imagen.frame = CGRectMake((pageNumber-1)*1024, 0, 1024, 768);

        [ScView addSubview:imagen];
    }
}

//
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView{
        return ScView;
   //   return [imagen initWithImage:[UIImage imageNamed:[NSString stringWithFormat:@"%d.png",pageNumber]]];
}

- (void)scrollViewWillBeginZooming:(UIScrollView *)myScrollView withView:(UIView *)view
{ 
    NSLog(@"Scroll Will Begin");
    ScView.scrollEnabled = YES;
}

- (void)scrollViewDidEndZooming:(UIScrollView *)myScrollView withView:(UIView *)view atScale:(float)scale 
{ 
    if(scale == 1)
    {
        ScView.scrollEnabled = YES;
        ScView.pagingEnabled = YES;
        [self returnImages];
        NSLog(@"Scrolol will end");
        //ScView.maximumZoomScale = 2.0f;
       // [super viewDidLoad];

        [self returnImages];
    }
}

任何想法都将不胜感激...
2个回答

19

要获得适当的分页和缩放效果,您需要将每个页面的UIScrollView嵌入到父UIScrollView中。这种组合将允许您同时使用分页和内部滚动。

下面是一个UIViewController的示例,具有父滚动视图和三个嵌入式可缩放页面。

#define VIEW_FOR_ZOOM_TAG (1)

@implementation SVViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    UIScrollView *mainScrollView = [[UIScrollView alloc] initWithFrame:self.view.bounds];
    mainScrollView.pagingEnabled = YES;
    mainScrollView.showsHorizontalScrollIndicator = NO;
    mainScrollView.showsVerticalScrollIndicator = NO;

    CGRect innerScrollFrame = mainScrollView.bounds;

    for (NSInteger i = 0; i < 3; i++) {
        UIImageView *imageForZooming = [[UIImageView alloc] initWithImage:[UIImage imageNamed:[NSString stringWithFormat:@"page%d", i + 1]]];
        imageForZooming.tag = VIEW_FOR_ZOOM_TAG;

        UIScrollView *pageScrollView = [[UIScrollView alloc] initWithFrame:innerScrollFrame];
        pageScrollView.minimumZoomScale = 1.0f;
        pageScrollView.maximumZoomScale = 2.0f;
        pageScrollView.zoomScale = 1.0f;
        pageScrollView.contentSize = imageForZooming.bounds.size;
        pageScrollView.delegate = self;
        pageScrollView.showsHorizontalScrollIndicator = NO;
        pageScrollView.showsVerticalScrollIndicator = NO;
        [pageScrollView addSubview:imageForZooming];

        [mainScrollView addSubview:pageScrollView];

        if (i < 2) {
            innerScrollFrame.origin.x += innerScrollFrame.size.width;
        }
    }

    mainScrollView.contentSize = CGSizeMake(innerScrollFrame.origin.x + innerScrollFrame.size.width, mainScrollView.bounds.size.height);

    [self.view addSubview:mainScrollView];
}

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView {
    return [scrollView viewWithTag:VIEW_FOR_ZOOM_TAG];
}

- (NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskPortrait;
}

- (BOOL)shouldAutorotate {
    return NO;
}

@end

2

我按照@NikNarmo的方法编写了一个小型的Swift Xcode项目来演示缩放和分页功能。

希望能帮助任何想要完成相同任务的人。

其中一些代码来自于UIScrollView教程:入门 http://www.raywenderlich.com/76436/use-uiscrollview-scroll-zoom-content-swift

还有一些来自于UIScrollView初学者指南 http://www.appcoda.com/uiscrollview-introduction/

使用Xcode 7.0和Swift 2.0

  override func viewDidLoad() {

    super.viewDidLoad()

    mainScrollView = UIScrollView(frame: self.view.bounds)
    mainScrollView.pagingEnabled = true
    mainScrollView.showsHorizontalScrollIndicator = false
    mainScrollView.showsVerticalScrollIndicator = false

    pageScrollViews = [UIScrollView?](count: photos.count, repeatedValue: nil)

    let innerScrollFrame = mainScrollView.bounds

    mainScrollView.contentSize =
        CGSizeMake(innerScrollFrame.origin.x + innerScrollFrame.size.width,
            mainScrollView.bounds.size.height)

    mainScrollView.backgroundColor = UIColor.redColor()
    mainScrollView.delegate = self
    self.view.addSubview(mainScrollView)

    configScrollView()
    addPageControlOnScrollView()
}

重点在于 func scrollViewWillEndDragging 这个方法,当 contentSize 和 mainScrollViewContentSize 相等时就执行主滚动视图控制器的分页操作,否则不做任何处理。

  func scrollViewWillEndDragging(scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) {

    let targetOffset = targetContentOffset.memory.x
    let zoomRatio = scrollView.contentSize.height / mainScrollViewContentSize.height

    if zoomRatio == 1 {
        // mainScrollViewController
        let mainScrollViewWidthPerPage = mainScrollViewContentSize.width / CGFloat(pageControl.numberOfPages)

        let currentPage = targetOffset / (mainScrollViewWidthPerPage * zoomRatio)
        pageControl.currentPage = Int(currentPage)
        loadVisiblePages()

    }
    else {
        // pageScorllViewController
    }
}

以下是该项目的代码:https://github.com/Charles-Hsu/ScrollViewDemo


如何将Swift代码连接到Storyboard?我下载了你的整个项目代码,但是注意到你的storyboard只是一个视图控制器。 - user2872856
这是我的问题:http://stackoverflow.com/questions/34449359/zoom-images-in-paged-uiscrollview - user2872856
有个问题。我无法将Admob添加到滚动视图中。请帮忙。http://stackoverflow.com/questions/34460756/loading-admob-without-using-storyboard-swift/34460786 - user2872856
我遇到了另一个问题。如何在特定页面开始分页?http://stackoverflow.com/questions/34463298/set-initial-page-of-uiscrollview-using-swift - user2872856
在viewDidLoad中调用gotoPage(page: Int)方法,@user2872856。 - charles.cc.hsu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接