0

我喜欢 iPhone 导航的 kindle——它可以让你在导航栏中滑动标题以从一个视图移动到另一个视图。(我附上图片)iPhone Kindle 应用截图

但是,我昨天搜索了很长时间,但找不到任何做过类似事情的人。

你对如何做到这一点有任何想法吗?

更新:2012 年 5 月 24 日

所以现在我有代码了。感谢本教程http://bit.ly/xNOiqd。(我只是复制了他的大部分代码。)但我仍然无法达到与kindle应用程序导航栏相同的效果。我现在可以查看左右项目,但我的滚动视图会跳过数组奇数索引上的标签。假设我有“收藏夹”、“所有产品”和“类别”。当我向左滑动时,我从“收藏夹”移动到“类别”并跳过“所有产品”

这是代码。

#pragma mark -

- (void)loadVisiblePages {
    // First, determine which page is currently visible
    CGFloat pageWidth = self.scrollView.frame.size.width;
    NSInteger page = (NSInteger)floor((self.scrollView.contentOffset.x * 2.0f + pageWidth) / (pageWidth * 2.0f));

    // Update the page control
    self.pageControl.currentPage = page;

    // Work out which pages we want to load
    NSInteger firstPage = page - 1;
    NSInteger lastPage = page + 1;

    // Purge anything before the first page
    for (NSInteger i=0; i<firstPage; i++) {
        [self purgePage:i];
    }
    for (NSInteger i=firstPage; i<=lastPage; i++) {
        [self loadPage:i];
    }
    for (NSInteger i=lastPage+1; i<self.pageImages.count; i++) {
        [self purgePage:i];
    }
}

- (void)loadPage:(NSInteger)page {
    if (page < 0 || page >= self.pageImages.count) {
        // If it's outside the range of what we have to display, then do nothing
        return;
    }

    // Load an individual page, first seeing if we've already loaded it
    UIView *pageView = [self.pageViews objectAtIndex:page];
    if ((NSNull*)pageView == [NSNull null]) {
        CGRect frame = self.scrollView.bounds;

        //frame.origin.x = frame.size.width * page;
        frame.origin.x = (frame.size.width /2) * page;
        frame.origin.y = 0.0f;

        //
        frame = CGRectInset(frame, 10.0f, 0.0f);
        //self.scrollView.bounds = frame;

        /* == orig line
         UIImageView *newPageView = [[UIImageView alloc] initWithImage:[self.pageImages objectAtIndex:page]];
         newPageView.contentMode = UIViewContentModeScaleAspectFit;
         newPageView.frame = frame;
         */

        UILabel *newPageView = [[UILabel  alloc] init];
        newPageView.text = [self.pageImages objectAtIndex:page];
        newPageView.textColor = [UIColor whiteColor];
        //newPageView.textColor = [UIColor grayColor];
        newPageView.textAlignment = UITextAlignmentCenter;
        newPageView.font = [UIFont fontWithName:@"Helvetica-Bold" size:20];
        [newPageView setBackgroundColor:[UIColor clearColor]];



        newPageView.frame = frame;

        [self.scrollView addSubview:newPageView];
        [self.pageViews replaceObjectAtIndex:page withObject:newPageView];
    }
}

- (void)purgePage:(NSInteger)page {
    if (page < 0 || page >= self.pageImages.count) {
        // If it's outside the range of what we have to display, then do nothing
        return;
    }

    // Remove a page from the scroll view and reset the container array
    UIView *pageView = [self.pageViews objectAtIndex:page];
    if ((NSNull*)pageView != [NSNull null]) {
        //[pageView removeFromSuperview];
        //[self.pageViews replaceObjectAtIndex:page withObject:[NSNull null]];
    }
}

- (void)viewDidLoad
{
    [super viewDidLoad];
//scroll view stuff
    self.scrollView.delegate = self;

    //attempt to make size of scrollview smaller
    //CGRect frame = self.scrollView.bounds;
    //frame = CGRectInset(frame, 10.0f, 0.0f);
    //CGFloat width = self.scrollView.frame.size.width/2.0f;

    self.pageImages = [NSArray arrayWithObjects:@"Favourites", @"All Products", @"Categories",@"Boo yah", nil];
    NSInteger pageCount = self.pageImages.count;

    // Set up the page control
    self.pageControl.currentPage = 0;
    self.pageControl.numberOfPages = pageCount;

    // Set up the array to hold the views for each page
    self.pageViews = [[NSMutableArray alloc] init];
    for (NSInteger i = 0; i < pageCount; ++i) {
        [self.pageViews addObject:[NSNull null]];
    }

}
- (void) viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated];
CGSize pagesScrollViewSize = self.scrollView.frame.size;
    //self.scrollView.contentSize = CGSizeMake(pagesScrollViewSize.width * self.pageImages.count, pagesScrollViewSize.height);

//This modifies the size of the scroll view, I can't seem to get it right
    self.scrollView.contentSize = CGSizeMake((pagesScrollViewSize.width / 1.50f )* self.pageImages.count, self.scrollView.frame.size.height);

    // Load the initial set of pages that are on screen
    [self loadVisiblePages];


}
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    // Load the pages which are now on screen
    [self loadVisiblePages];
}
4

2 回答 2

2

iCarousel是一个不错的开源项目,有很多滚动类型。

于 2012-05-24T06:49:19.207 回答
0

分页滚动视图和AQGridView最有可能。如果不是,无论如何这将是一种可接受的逆向工程尝试。

于 2012-05-23T00:42:22.540 回答