Остановить 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 от горизонтального подпрыгивания?

Ответ 1

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;

То же самое касается WKWebView.

Ответ 2

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

В вышеупомянутом сообщении проекта/блога они упоминают функцию javascript, которую вы можете добавить, чтобы отключить подпрыгивание, что по существу сводится к следующему:

    document.ontouchmove = function(event){
        event.preventDefault();
    }

Если вы хотите больше узнать о том, как они его реализуют, просто загрузите QuickConnect и проверьте его. Но в основном все, что он делает, это вызов этого javascript на загрузку страницы... Я попробовал просто положить его в голову мой документ, и, похоже, он работает нормально.

Ответ 3

Хорошо, что я сделал для этого:

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.

Ответ 4

В iOS 5 SDK вы можете получить доступ к просмотру прокрутки, связанному с веб-представлением, а не итерации через его подзоны.

Итак, чтобы отключить "отскок" в представлении прокрутки, вы можете использовать:

myWebView.scrollView.bounces = NO;

См. Справочник по классу UIWebView.

(Однако, если вам нужно поддерживать версии SDK до 5.0, вы должны следовать советам Mirek Rusin.)

Ответ 5

Предупреждение. Я использовал setAllowsRubberBanding: в своем приложении Apple отклонила его, заявив, что функции, не относящиеся к публичному API, не разрешены (cite: 3.3.1)

Ответ 6

Swift 3

webView.scrollView.bounces = false

Ответ 7

В Swift отключить отскоки

webViewObj.scrollView.bounces = false

Ответ 8

Метод Брэда работал у меня. Если вы используете его, вы можете сделать его немного более безопасным.

id scrollView = [yourWebView.subviews objectAtIndex:0];
if( [scrollView respondsToSelector:@selector(setAllowsRubberBanding:)] )
{
    [scrollView performSelector:@selector(setAllowsRubberBanding:) withObject:NO];
}

Если яблоко что-то изменит, тогда отскок вернется - но по крайней мере ваше приложение не потерпит крах.

Ответ 9

На iOS5 только если вы планируете, чтобы пользователи увеличивали содержимое веб-просмотра (e.i.: double tap), настройка отказов недостаточна. Вам также нужно установить alwaysBounceHorizontal и alwaysBounceVertical properties на NO, иначе, когда они уменьшат масштаб (другой двойной кран...) по умолчанию, он снова подпрыгнет.

Ответ 10

Я просмотрел коллекцию подпрограмм UIWebView и установил их фоны на [UIColor blackColor], тот же цвет, что и фон веб-страницы. Вид все равно будет отскакивать, но он не покажет этот уродливый темно-серый фон.

Ответ 11

Мне кажется, что 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;
    }
}

Ответ 12

Мне было очень неприятно узнать, что UIWebView не является прокруткой, поэтому я сделал собственный подкласс, чтобы получить представление прокрутки веб-представления. Это suclass содержит прокрутку, поэтому вы можете настроить поведение своего веб-представления. Линии перфорации этого класса:

@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 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) анимированный: YES, чтобы заставить незаметное изменение, которое установит правильный размер содержимого веб-представления.

Ответ 13

Пришел к этому поиску ответа, и мне в итоге просто повезло на мой собственный ответ, возившись. Я сделал

[[webview scrollView] setBounces:NO];

и он работал.

Ответ 14

Это сработало для меня и красиво (я использую телефонную связь с webView)

[[webView.webView scrollView] setScrollEnabled:NO];

или

[[webView scrollView] setScrollEnabled:NO];

Ответ 17

Я попробовал несколько иной подход, чтобы предотвратить прокрутку и перетаскивание объектов UIWebView: добавление распознавателя жестов для переопределения других жестов.

Кажется, UIWebView или его подпрограмма scroller использует свой собственный распознаватель жестов для обнаружения прокрутки пользователя. Но согласно документации Apple есть законный способ переопределения одного распознавателя жестов с другим. Протокол UIGestureRecognizerDelegate имеет метод gestureRecognizer: shouldRecognizeSimultaneousWithGestureRecognizer: - который позволяет управлять поведением любых встречных распознавателей жестов.

Итак, я сделал

в представлении контроллера 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 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. Но я считаю, что до сих пор я не использовал ничего недокументированного... Если кто-то найдет это иначе, пожалуйста, сообщите мне.

Ответ 19

Одно из подзонов UIWebView должно быть UIScrollView. Установите для свойства scrollEnabled значение NO, и веб-просмотр полностью отключит прокрутку.

Примечание. Это технически использует частный API, и, таким образом, ваше приложение может быть отклонено или сбой в будущих выпусках ОС. Используйте @try и respondsToSelector

Ответ 20

Посмотрите на bounces свойство UIScrollView. Укажите документы Apple:

Если значение свойства YES (по умолчанию), просмотр прокрутки отскакивает, когда он сталкивается с границей содержимого. Отскок визуально указывает, что прокрутка достигла края содержимого. Если значение NO, прокрутка немедленно останавливается на границе содержимого без отскока.

Убедитесь, что вы используете правильный UIScrollView. Я не уверен, как выглядит иерархия для UIWebView, но представление прокрутки может быть родительским, а не дочерним, UIWebView.

Ответ 21

Чтобы отключить прокрутку UIWebView, вы можете использовать следующую строку кода:

[ObjWebview setUserInteractionEnabled:FALSE];

В этом примере ObjWebview имеет тип UIWebView.

Ответ 22

webView.scrollView.scrollEnabled = NO; webView.scrollView.bounces = НЕТ;