Мешать UIWebView “возвратиться” вертикально?

Ваш вопрос может быть истолкован двумя способами. Хотели бы вы уменьшить алгоритмическую сложность этой проблемы или хотите, чтобы она работала немного быстрее?

Снижение алгоритмической сложности не сработает. Проблема N-Queen - известная проблема, миллионы разработчиков уже видели это. Чтобы лучше понять значение выражения «алгоритмическая сложность», я предлагаю прочитать дополнительный материал. Предисловие к к этому документу + выполнение первых двух упражнений может стать хорошим началом.

Выполнение приложения немного быстрее, выполнимо. Знание Java больше и реализация небольших хитростей дает вам бесконечный источник способов сократить на несколько процентов время выполнения. Прежде чем вы начнете, вам следует установить надежную тестовую систему (например, JMH ), чтобы отслеживать ваши успехи. Вы можете взглянуть на детали размещения объектов, JIT, встраивание, размер ваших переменных и т. Д. Некоторые могут поначалу немного пугать, но это интересный способ узнать что-то новое.

225
задан TheNeil 9 May 2019 в 23:39
поделиться

12 ответов

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 .

422
ответ дан 23 November 2019 в 03:53
поделиться

Изучите bounces свойство UIScrollView. Quoth документы Apple:

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

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

0
ответ дан Alex 23 November 2019 в 03:53
поделиться

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

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

0
ответ дан rpetrich 23 November 2019 в 03:53
поделиться

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

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

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

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

46
ответ дан Brad Parks 23 November 2019 в 03:53
поделиться

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

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

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

3
ответ дан 23 November 2019 в 03:53
поделиться

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

9
ответ дан 23 November 2019 в 03:53
поделиться

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

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

копание в кондитерских изделиях

1
ответ дан 23 November 2019 в 03:53
поделиться

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

Эта ссылка помогла мне много ..... его легко ... есть демонстрация ..

1
ответ дан 23 November 2019 в 03:53
поделиться

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

2
ответ дан 23 November 2019 в 03:53
поделиться

Мне кажется, что 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
ответ дан 23 November 2019 в 03:53
поделиться

Я был раздражен, узнав, что 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'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) animated: YES, чтобы заставить незаметное изменение, которое установит правильный размер содержимого веб-представления.
2
ответ дан 23 November 2019 в 03:53
поделиться

Все, что я сделал для этого:

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.

18
ответ дан 23 November 2019 в 03:53
поделиться