Остановить UIWebView от "подпрыгивания" по вертикали? - PullRequest
222 голосов
/ 01 февраля 2009

Кто-нибудь знает, как остановить вертикальный отскок 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?

Ответы [ 22 ]

2 голосов
/ 20 января 2012

Наткнулся на это в поисках ответа, и я, в конце концов, просто поверил в ответ на мой собственный вопрос. Я сделал

[[webview scrollView] setBounces:NO];

и это сработало.

2 голосов
/ 09 июня 2010

Я был раздражен, узнав, что UIWebView не является представлением прокрутки, поэтому я создал собственный подкласс, чтобы получить представление прокрутки в веб-представлении. Этот класс содержит вид прокрутки, так что вы можете настроить поведение вашего веб-представления. Изюминки этого класса:

@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: если вы используете его в Интерфейсном Разработчике
  • при первоначальном создании веб-представления размер его содержимого всегда совпадает с размером фрейма представления. После прокрутки в Интернете размер содержимого соответствует размеру реального веб-содержимого в представлении. Чтобы обойти это, я сделал что-то хакерское - вызвал -setContentOffset: CGPointMake (0,1) animated: YES, чтобы вызвать незаметное изменение, которое установит правильный размер содержимого веб-представления.
2 голосов
/ 03 июня 2010

Мне кажется, что UIWebView имеет UIScrollView. Для этого вы можете использовать документированные API-интерфейсы, но отскок устанавливается для обоих направлений, а не по отдельности. Это в документации по API. UIScrollView имеет свойство bounce, поэтому что-то вроде этого работает (не знаю, существует ли более одного scrollview):

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;
    }
}
2 голосов
/ 02 марта 2010

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

1 голос
/ 21 января 2014

(пример Xcode 5 для iOS 7 SDK) Вот пример универсального приложения, использующего функцию scrollview setBounces. Это проект / пример с открытым исходным кодом, расположенный здесь: Ссылка на SimpleWebView (Пример Zip и исходного кода проекта)

1 голос
/ 22 января 2010

фиксированное позиционирование на мобильном сафари

Эта ссылка мне очень помогла ..... Это легко .. Есть демо ..

1 голос
/ 10 марта 2011

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

Кажется, UIWebView или его подпредставление скроллера использует собственный распознаватель жестов панорамирования для обнаружения пользовательской прокрутки. Но согласно документации Apple, существует законный способ переопределения одного распознавателя жестов другим. UIGestureRecognizerDelegate протокол имеет метод gestRecognizer: shouldRecognizeSim одновременноouslyWithGestureRecognizer: - который позволяет управлять поведением любых коллизионных распознавателей жестов.

Итак, что я сделал, было

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

1 голос
/ 16 декабря 2009

Вот два новых потенциальных решения. По-видимому, вы можете использовать jqtouch или pastrykit, чтобы отключить прокрутку. Тем не менее, я не получил их на работу. Вы можете быть более компетентным.

отключение вертикальной прокрутки

копание в пастрыките

0 голосов
/ 10 сентября 2012

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

0 голосов
/ 06 февраля 2009

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

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

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

...