Дублирование функциональности типа Android ViewPager с меню на iPhone - PullRequest
2 голосов
/ 01 марта 2012

Я пытаюсь продублировать тип навигации по левому и правому жестам пользовательского интерфейса Android. Это используется в Android Marketplace, но также и в версии Google + для iPhone.

Вот ссылка на YouTube в действии, которую я пытаюсь имитировать. http://www.youtube.com/watch?v=RYW9yxhhhPU&t=0m25s

Как видно из видео выше, в верхней части основной области просмотра есть небольшая область прокрутки. Небольшая область прокрутки содержит текст «Входящие», «Круги», «Рядом» и перемещается между ними при прокрутке главной страницы.

То, что я пытался сделать (безуспешно), это создание двух UIScrollViews. Один для основной области и один для меньшей площади. Я установил меньший UIScrollView для смещения влево или вправо в 0,5 раза по сравнению с contentOffset.x основного scrollView.

Внешний вид несколько похож, но я испытываю огромные трудности с получением текстовых надписей в меньшем виде прокрутки для выравнивания точно в левом, среднем и правом положениях.

Я не уверен, что это правильный путь, но если есть какие-то другие способы, я бы хотел их услышать.

Я бы очень признателен за любую помощь в этом! Спасибо!

Ответы [ 2 ]

3 голосов
/ 07 марта 2012

Я должен сделать это и для проекта.У меня это в основном работает.Минус анимация при прокрутке.Я начал проект на GitHub для этого.Я буду добавлять к этому, как я иду, но в то же время это должно быть хорошей отправной точкой.Демоверсию можно найти здесь, https://github.com/btate/BTViewPager

0 голосов
/ 03 марта 2012

Я думаю, что лучшим подходом было бы создание подкачки 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);                    
                }];
            }
        }
    }
}

`

...