Остановить UIWebView от «подпрыгивания» по вертикали?

Кто-нибудь знает, как остановить UIWebView от прыгания по вертикали? Я имею в виду, когда пользователь прикасается к экрану своего iphone, тянет их пальцем вниз, а веб-просмотр показывает пустое место над загруженной мной веб-страницей?

Я рассмотрел следующие возможные решения, но никто из них не работал для меня:

http://www.iphonedevsdk.com/forum/iphone-sdk-development/996-turn-off-scrolling-bounces-uiwebview.html

http://forums.macrumors.com/showthread.php?t=619534

Как остановить UIScrollView от прыгания по горизонтали?

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;

  • NULL против нуля в Objective-C
  • Заголовок Swift для Objective-C, не созданный в Xcode 6
  • Когда происходит освобождение связанного объекта?
  • iPhone: настройка заголовка панели навигации
  • Как написать данные в plist?
  • глубокая изменчивая копия NSMutableDictionary
  • Эквивалент карты NSArray
  • Очереди отправки: как узнать, запущены ли они и как их остановить
  • Замена на устаревший размерWithFont: в iOS 7?
  • AppDelegate, rootViewController и presentViewController
  • Какова стоимость использования автореферата в cocoa?
  • Interesting Posts

    Как вы управляете работником с AWS Elastic Beanstalk?

    Могу ли я проверить, существует ли почтовый адрес с использованием .net?

    Не удается сохранить пакетный файл вскоре после его запуска в Windows 7

    Outlook. Как вы можете автоматически синхронизировать встречи из моего календаря Outlook с открытым календарем Outlook?

    Есть ли способ получить уведомление, когда пользователь отключает устройство?

    Настройка моей мостовой сети на виртуальной машине CentOS

    Как создать хеш-файл MD5 в Cocoa?

    JPA Query выбирает только определенные столбцы, не используя Query Query?

    Плагин jQuery Validation: отключить проверку для указанных кнопок отправки

    Вопросы UIImagePNGR? / Изображения, повернутые на 90 gradleусов

    Как нарисовать коробку со значительным уровнем?

    Mac OS X для VirtualBox

    Android findViewbyId с вариантной строкой

    Как реализовать систему достижений в RoR

    Приложение WPF не закрывается при закрытии главного windows

    Давайте будем гением компьютера.