Подтвердить что ты не робот

Пользовательская панель прокрутки для iPhone UIView (создание длинных свитков не сосать)

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

Sticky Scroll Indicator

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

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

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

Dropbox scrollbar at the topDropbox scrollbar at the bottom

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

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

4b9b3361

Ответ 1

Общая идея:

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

На ощупь:

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

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

Ответ 2

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

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

Ответ 3

Для этого, вероятно, есть реализация с открытым исходным кодом. Я не знаю. Возможно, стрелять по электронной почте разработчикам 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.
    }
}

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

Ответ 4

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