Остановить UIWebView от «подпрыгивания» по вертикали?
Кто-нибудь знает, как остановить UIWebView от прыгания по вертикали? Я имею в виду, когда пользователь прикасается к экрану своего iphone, тянет их пальцем вниз, а веб-просмотр показывает пустое место над загруженной мной веб-страницей?
Я рассмотрел следующие возможные решения, но никто из них не работал для меня:
http://www.iphonedevsdk.com/forum/iphone-sdk-development/996-turn-off-scrolling-bounces-uiwebview.html
- Неверное завершение кода Xcode 6 не работает
- Получение случайного объекта из NSArray без дублирования
- Как работает новый механизм автоматического подсчета ссылок?
- Что означает подчеркивание в имени переменной-члена в Objective-C?
- Должен ли я использовать NSUserDefaults или plist для хранения данных?
http://forums.macrumors.com/showthread.php?t=619534
Как остановить UIScrollView от прыгания по горизонтали?
- Восстановить пре-iOS7 UINavigationController pushViewController animation
- MKAnnotation, простой пример
- Проблема UITableView при использовании отдельного делегата / источника данных
- Получение видимого прямоугольника содержимого UIScrollView
- Метод доступа после завершения анимации UIImageView
- Как изменить определенный цвет в изображении?
- Objective-c iPhone-процент кодирует строку?
- Какую строку формата я использую в миллисекундах в строках даты на iPhone?
for (id subview in webView.subviews) if ([[subview class] isSubclassOfClass: [UIScrollView class]]) ((UIScrollView *)subview).bounces = NO;
… кажется, работает нормально.
Он также будет принят в App Store.
Обновление : в iOS 5.x + есть более простой способ – UIWebView
имеет свойство scrollView
, поэтому ваш код может выглядеть так:
webView.scrollView.bounces = NO;
Я смотрел проект, который упрощает создание веб-приложений в качестве полноценных устанавливаемых приложений на iPhone под названием QuickConnect и нашел решение, которое работает, если вы не хотите, чтобы ваш экран был прокручиваемым вообще, что в моем случае Я этого не сделал.
В вышеупомянутом проекте / блоге они упоминают функцию javascript, которую вы можете добавить, чтобы отключить подпрыгивание, что, в сущности, сводится к следующему:
document.ontouchmove = function(event){ event.preventDefault(); }
Если вы хотите больше узнать о том, как они его реализуют, просто загрузите QuickConnect и проверьте его. Но в основном все, что он делает, это вызов этого javascript на загрузку страницы … Я попытался просто поместить его в голову моего документа, и он работает нормально.
Ну, все, что я сделал для этого:
UIView *firstView = [webView.subviews firstObject]; if ([firstView isKindOfClass:[UIScrollView class]]) { UIScrollView *scroll = (UIScrollView*)firstView; [scroll setScrollEnabled:NO]; //to stop scrolling completely [scroll setBounces:NO]; //to stop bouncing }
Работает отлично для меня … Кроме того, тикающий ответ на этот вопрос – тот, который Apple отвергает, если вы используете его в своем приложении iphone.
В SDK iOS 5 вы можете получить доступ к просмотру прокрутки, связанному с веб-представлением, а не итерации через свои подзоны.
Поэтому, чтобы отключить «отскок» в режиме прокрутки, вы можете использовать:
myWebView.scrollView.bounces = NO;
См. Справочник по classу UIWebView .
(Однако, если вам нужно поддерживать версии SDK до 5.0, вы должны следовать советам Mirek Rusin ).
Предупреждение. Я использовал setAllowsRubberBanding: в своем приложении Apple отклонила его, указав, что непубличные функции API не разрешены (cite: 3.3.1)
Swift 3
webView.scrollView.bounces = false
В Swift отключить отскоки
webViewObj.scrollView.bounces = false
Метод Брэда работал для меня. Если вы используете его, вы можете сделать его немного более безопасным.
id scrollView = [yourWebView.subviews objectAtIndex: 0]; if ([scrollView отвечаетToSelector: @selector (setAllowsRubberBanding :))) { [scrollView performSelector: @selector (setAllowsRubberBanding :) withObject: NO]; }
Если яблоко что-то изменит, то отскок вернется – но по крайней мере ваше приложение не будет разбиваться.
На iOS5 только если вы планируете позволить пользователям увеличить содержимое веб-просмотра (ei: double tap), настройка отказов недостаточна. Вам также нужно установить alwaysBounceHorizontal и alwaysBounceVertical properties на NO, иначе, когда они уменьшат масштаб (другой двойной кран …) по умолчанию, он снова подпрыгнет.
Я прошел коллекцию подпрограмм UIWebView и установил их фоны на [UIColor blackColor], тот же цвет, что и фон веб-страницы. Представление все равно будет отскакивать, но оно не покажет этот уродливый темно-серый фон.
Мне кажется, что UIWebView имеет UIScrollView. Вы можете использовать документированные API для этого, но подпрыгивание устанавливается для обоих направлений, а не отдельно. Это в документах API. UIScrollView имеет свойство отскока, поэтому что-то вроде этого работает (не знаю, есть ли более одного прокрутки):
NSArray *subviews = myWebView.subviews; NSObject *obj = nil; int i = 0; for (; i < subviews.count ; i++) { obj = [subviews objectAtIndex:i]; if([[obj class] isSubclassOfClass:[UIScrollView class]] == YES) { ((UIScrollView*)obj).bounces = NO; } }
Мне было очень неприятно узнать, что UIWebView не является прокруткой, поэтому я сделал собственный подclass, чтобы получить представление прокрутки веб-представления. Это suclass содержит прокрутку, поэтому вы можете настроить поведение своего веб-представления. Линии перфорации этого classа:
@class CustomWebView : UIWebview ... - (id) initWithFrame:(CGRect)frame{ self = [super initWithFrame:frame]; // WebViews are subclass of NSObject and not UIScrollView and therefore don't allow customization. // However, a UIWebView is a UIScrollViewDelegate, so it must CONTAIN a ScrollView somewhere. // To use a web view like a scroll view, let's traverse the view hierarchy to find the scroll view inside the web view. for (UIView* v in self.subviews){ if ([v isKindOfClass:[UIScrollView class]]){ _scrollView = (UIScrollView*)v; break; } } return self;
}
Затем, когда вы создаете пользовательский веб-просмотр, вы можете отключить подпрыгивание с помощью:
customWebView.scrollView.bounces = NO; //(or customWebView.scrollView.alwaysBounceVertically = NO)
Это отличный универсальный способ создания веб-представления с настраиваемым поведением прокрутки. Осталось всего несколько вещей, на которые нужно обратить внимание:
- как и в любом представлении, вам также необходимо переопределить – (id) initWithCoder: если вы используете его в Interface Builder
- когда вы сначала создаете веб-представление, его размер содержимого всегда совпадает с размером фрейма представления. После прокрутки в Интернете размер содержимого представляет собой размер фактического содержимого веб-сайта внутри представления. Чтобы обойти это, я сделал что-то взломанное – вызов -setContentOffset: CGPointMake (0,1) анимированный: ДА, чтобы заставить незаметное изменение, которое установит правильный размер содержимого веб-представления.
Пришел к этому поиску ответа, и мне в итоге просто повезло в ответ на мой вопрос, возившись. я сделал
[[webview scrollView] setBounces:NO];
и это сработало.
Это сработало для меня и прекрасно (я пользуюсь телефоном с помощью webView)
[[webView.webView scrollView] setScrollEnabled:NO];
или
[[webView scrollView] setScrollEnabled:NO];
Я попробовал несколько иной подход, чтобы предотвратить прокрутку и переключение объектов UIWebView : добавление распознавателя жестов для переопределения других жестов.
Кажется, UIWebView или его подпрограмма скроллера использует свой собственный распознаватель жестов для обнаружения прокрутки пользователя. Но согласно документации Apple есть законный способ переопределения одного распознавателя жестов с другим. Протокол UIGestureRecognizerDelegate имеет метод gestureRecognizer: shouldRecognizeSimultaneousWithGestureRecognizer: – который позволяет контролировать поведение любых встречных распознавателей жестов.
Итак, что я сделал
в представлении controllerа viewDidLoad:
// Install a pan gesture recognizer // We ignore all the touches except the first and try to prevent other pan gestures // by registering this object as the recognizer's delegate UIPanGestureRecognizer *recognizer; recognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePanFrom:)]; recognizer.delegate = self; recognizer.maximumNumberOfTouches = 1; [self.view addGestureRecognizer:recognizer]; self.panGestureFixer = recognizer; [recognizer release];
затем метод переопределения жестов:
// Control gestures precedence - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { // Prevent all panning gestures (which do nothing but scroll webViews, something we want to disable in // the most painless way) if ([otherGestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]]) { // Just disable every other pan gesture recognizer right away otherGestureRecognizer.enabled = FALSE; } return NO; }
Конечно, этот метод делегата может меня усложнить в реальном приложении – мы можем выборочно отключать другие распознаватели, анализируя otherGestureRecognizer.view и принимаем решение на основе того, что это за точка зрения.
И, наконец, ради полноты, метод, который мы зарегистрировали как обработчик панорамирования:
- (void)handlePanFrom:(UIPanGestureRecognizer *)recognizer { // do nothing as of yet }
он может быть пустым, если все, что мы хотим, это отменить прокрутку и перескакивание веб-представлений или он может содержать наш собственный код для реализации вида движений и анимаций панорамирования, которые мы действительно хотим …
Пока я просто экспериментирую со всем этим, и, похоже, он работает более или менее, как я этого хочу. Тем не менее, я еще не пытался отправлять какие-либо приложения в iStore. Но я считаю, что до сих пор я не использовал ничего недокументированного … Если кто-то найдет это иначе, пожалуйста, сообщите мне.
Вот два новых возможных решения. По-видимому, вы можете использовать jqtouch или pastrykit для отключения прокрутки. Тем не менее, у меня их нет. Вы могли бы быть более компетентными.
отключение вертикальной прокрутки
копать в pastrykit
фиксированное позиционирование на мобильном safari
Эта ссылка помогла мне много ….. Ее легко .. Есть демо ..
(Пример Xcode 5 iOS 7 SDK) Вот пример универсального приложения, использующий функцию scrollview setBounces. Это проект / пример с открытым исходным кодом, расположенный здесь: ссылка на SimpleWebView (пример проекта и пример исходного кода)
Одним из подпрограмм UIWebView
должен быть UIScrollView
. Установите scrollEnabled
свойства scrollEnabled
значение NO
и веб-просмотр полностью отключит прокрутку.
Примечание. Это технически использует частный API, и, таким образом, ваше приложение может быть отклонено или сбой в будущих выпусках ОС. Использовать @try
и @try
Посмотрите на свойство UIScrollView
. Укажите документы Apple:
Если значением свойства является
YES
(по умолчанию), просмотр прокрутки отскакивает, когда он сталкивается с границей содержимого. Отскок визуально указывает, что прокрутка достигла края содержимого. Если значение равноNO
, прокрутка немедленно останавливается на границе содержимого без отскока.
Убедитесь, что вы используете правильный UIScrollView
. Я не уверен, как выглядит иерархия для UIWebView
, но представление прокрутки может быть родительским, а не дочерним элементом UIWebView
.
Чтобы отключить прокрутку UIWebView
вы можете использовать следующую строку кода:
[ObjWebview setUserInteractionEnabled:FALSE];
В этом примере ObjWebview
имеет тип UIWebView
.
webView.scrollView.scrollEnabled = NO; webView.scrollView.bounces = NO;