使用iPhone上的菜单复制Android ViewPager类型功能

时间:2012-03-01 01:29:14

标签: iphone uitableview uiscrollview google-plus

我正在尝试复制Android UI左右手势导航类型。这在Android Marketplace中使用,但也在iPhone +的iPhone版本中使用。

以下是我正在尝试模仿的Google+动态的YouTube链接。 http://www.youtube.com/watch?v=RYW9yxhhhPU&t=0m25s

正如您在上面的视频中看到的那样,主要观看区域顶部有一个小的滚动区域。小滚动区域保存文本“Incoming”,“Circles”,“Nearby”,并在滚动主页面时在它们之间切换。

我试图做的(失败的)是制作两个UIScrollViews。一个用于主要区域,一个用于较小区域。我将较小的UIScrollView设置为向左或向右移动主滚动视图的contentOffset.x的0.5倍。

外观有点相似,但是我很难在较小的滚动视图中获取文本标签,以便在左侧,中间和右侧位置精确排列。

我不确定这是否是正确的做法,但如果还有其他方法,我很乐意听到。

我真的很感激任何帮助!谢谢!

2 个答案:

答案 0 :(得分:3)

我也必须为项目做这件事。我得到它主要工作。滚动时减去动画。我已经在github上开始了一个项目。我会在我去的时候添加它,但同时这应该是一个很好的跳跃点。可以在此处找到演示https://github.com/btate/BTViewPager

答案 1 :(得分:0)

我认为最好的方法是创建一个分页UIScrollView。然后将导航和主要内容UIScroll放在一个UIView /页面中。滑动时,页面将锁定到位。看起来导航有点动画,但我认为Google使用了这种方法。

这是一个包含示例代码的教程,可以准确地为您提供分页滚动视图所需的内容。

http://www.iosdevnotes.com/2011/03/uiscrollview-paging/

为了完成导航标签,我将子类化为UIView并在主滚动视图的正上方添加视图。然后告诉视图重新组织标签。可能在` - (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView

这是我很快写的东西来证明我的意思。这将是UIView的子类

- (void)addLablesForItems:(NSArray *)items
{

    for (NSString *s in items)
    {
        UILabel *l = [[UILabel alloc] initWithFrame:CGRectZero];
        l.text = s;
        [self addSubview:l];
    }

    [self layoutSubviews];
}

- (void)layoutSubviews
{

    for (UIView *l in [self subviews])
    {
        if ([l isKindOfClass:[UILabel class]])
        {
            int index = [[self subviews] indexOfObject:l];
            if (index == 0)
            {
                l.frame = CGRectMake(0, 0, 20, 20);
            }
            else
            {
                UILabel *previousL = (UILabel *)[[self subviews] objectAtIndex:index -1];

                l.frame = CGRectMake(previousL.frame.origin.x+previousL.frame.size.width, 0, 20, 20);
            }
        }
    }
}    

- (void)shiftLabels:(int)direction
{
    //0 is left
    //1 is right    
    for (UIView *l in [self subviews])
    {
        if ([l isKindOfClass:[UILabel class]])
        {
            if (direction == 0)
            {
                int newOrigin = l.frame.origin.x - l.frame.size.width;
                if (newOrigin < 0)
                {
                    newOrigin = self.frame.size.width - l.frame.size.width;
                }
                [UIView animateWithDuration:.5 animations:^{

                    l.frame = CGRectMake(newOrigin, 0, 20, 20);
                }];
            }
            if (direction == 1)
            {
                int newOrigin = l.frame.origin.x + l.frame.size.width;
                if (newOrigin < 0)
                {
                    newOrigin = self.frame.origin.x;
                }

                [UIView animateWithDuration:.5 animations:^{
                    l.frame = CGRectMake(newOrigin, 0, 20, 20);                    
                }];
            }
        }
    }
}

`