Пользовательская панель прокрутки для iPhone UIView (создание длинных свитков не сосать)
В сообщении Создание длинных прокруток на 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" ), и вы можете коснуться определенной метки, чтобы перейти к целевому разделу. В этом случае, однако, очень длинная страница не имеет разделов, и она должна работать для прокрутки общего назначения, а не для перехода к разделам.
Итак, как я могу реализовать этот метод прокрутки? Я ищу общие идеи и конкретные детали реализации. Мне также интересно, существует ли реализация с открытым исходным кодом (это похоже на проблему общего назначения/решение).
Ответы
Ответ 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
, и если оно достаточно близко к стороне представления, выполните быструю прокрутку. В противном случае используйте медленную прокрутку.