Пользовательская полоса прокрутки для iPhone UIView (заставляя длинные свитки не сосать) - PullRequest
33 голосов
/ 02 декабря 2010

В сообщении, Создание длинных свитков на iPhone не сосет , Аза Раскин описывает альтернативный элемент управления полосой прокрутки, который лучше справляется с очень длинными страницами:

Sticky Scroll Indicator

Не важно, чтобы полоса прокрутки «оставалась на некоторое время», чтобы активировать ее; Я в порядке, просто проведя пальцем по правому краю экрана iPhone, чтобы ухватиться за ручку полосы прокрутки. Идея состоит в том, что если я перетащу ручку на 3/4 вниз на физическом экране, я буду на 3/4 вниз на странице.

Приложение Dropbox для iPhone (это здорово, кстати!) Имеет именно такую ​​полосу прокрутки для длинных PDF-документов. Регулярная прокрутка выполняется перетаскиванием в любое место, кроме ручки; перетаскивание ручки перемещает вид в это место. Кажется, это было реализовано «с нуля», так как я не думаю, что SDK достаточно гибок, чтобы настроить поведение существующей полосы прокрутки.

Однако Dropbox использует собственные средства просмотра документов для отображения документов на iPhone, поэтому они каким-то образом добавляют к нему функциональность полосы прокрутки. Видите ручку полосы прокрутки? Вы можете перетащить это, чтобы быстро получить где-нибудь еще в документе.

Dropbox scrollbar at the top Dropbox scrollbar at the bottom

Эта концепция очень похожа на работу индексных полос в UITableView (т.е. Contacts.app); индекс отображается в виде столбца с правой стороны таблицы (например, от «а» до «z»), и вы можете нажать на конкретную метку, чтобы перейти к целевому разделу. В этом случае, однако, на очень длинной странице нет разделов, и она должна работать для прокрутки общего назначения, а не для перехода к разделам.

Так как же я могу реализовать этот метод прокрутки? Я ищу общие идеи и конкретные детали реализации. Мне также интересно, существует ли реализация с открытым исходным кодом (это похоже на проблему / решение общего назначения).

Ответы [ 4 ]

7 голосов
/ 03 декабря 2010

Общая идея:

Я схватил приложение Dropbox (это круто) и немного поиграл.Похоже, что просмотр PDF занимает немного больше в приложении для фото, так как он условно отображает полупрозрачную панель навигации и панель инструментов при прикосновении, в дополнение к поддержке полосы прокрутки.Я почти уверен, что происходит то, что у них есть собственный контроллер вида, который перехватывает прикосновения и реагирует соответствующим образом.

На прикосновение:

  1. Если это касание, показать / скрытьНавбар и панель инструментов.
  2. Если он находится в скруббере, начните отслеживать касание и прокручивать представление прокрутки / веб-просмотр (с чем бы они ни отображались).Я уверен, что прокрутка это что-то простое, как scrollView.contentOffset = CGPointMake(0, (scrubber.y / [UIScreen mainScreen].bounds.size.height) * scrollView.contentSize.height).3)
  3. Иначе, передайте касание приложенному представлению.

Может быть другое скрытое волшебство с отображением PDF (я никогда не делал это в касании какао), но кое-чтоговорит мне, что это их основной процесс.

4 голосов
/ 02 декабря 2010

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

Если вы знаете высоту вашего окна, высоту вашего контента и текущее смещение контента (что вы делаете), то у вас есть все инструменты, необходимые для создания пользовательского UIView, который может служить в качестве сенсорный слайдер. А затем просто закрасьте его поверх стандартного скроллера.

0 голосов
/ 01 апреля 2011

Попробуйте использовать UIPanGestureRecognizer. В своем действии вы можете использовать locationInView, чтобы определить точку, к которой обращается пользователь. Делайте это, когда состояние UIGestureRecognizerStateBegan и если оно достаточно близко к стороне представления, реализуйте быструю прокрутку. В противном случае используйте медленную прокрутку.

0 голосов
/ 02 февраля 2011

Вероятно, для этого есть реализация с открытым исходным кодом. Я не знаю ни одного. Может, отправить письмо разработчикам Dropbox?

В любом случае, я бы так и сделал:

@interface UICustomisedScrollView : UISCrollView
{
    BOOL showingScroller;
    UIView scroller; //Customise this, either in IB or in viewDidLoad
}

@implementation UICustomisedScrollView

- (BOOL)touchesShouldBegin:(NSSet *)touches withEvent:(UIEvent *)event inContentView:(UIView *)view {
    showingScroller = !showingScroller;
    if(showingScroller)
        scroller.hidden = NO;
    else
        scroller.hidden = YES;
}

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    if(showingScroller) {
        if(/*the touch is on the scroller*/) {
             /* scrollview.setContentOffset(...) we want to scroll according to how much the user scrolls here */
        }
        //move scroller.frame.origin to where the touch is.
    }
}

Полагаю, это не будет слишком сложно ... Но я еще не тестировал приведенный выше код. Так или иначе, это общая идея =)

...