缩放后在 UIScrollView 中启用分页

问题描述 投票:0回答:2

我有一个

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];
    }
}

任何想法都将受到高度赞赏..

ios pagination uiscrollview zooming xcode4.3
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()
}

神奇之处就在于 funcscrollViewWillEndDragging 中,当 contentSize 是否等于 mainScrollViewContentSize 时,如果是 mainScrollViewController,则进行分页,否则不执行任何操作。

  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

© www.soinside.com 2019 - 2024. All rights reserved.