Ваш вопрос может быть истолкован двумя способами. Хотели бы вы уменьшить алгоритмическую сложность этой проблемы или хотите, чтобы она работала немного быстрее?
Снижение алгоритмической сложности не сработает. Проблема N-Queen - известная проблема, миллионы разработчиков уже видели это. Чтобы лучше понять значение выражения «алгоритмическая сложность», я предлагаю прочитать дополнительный материал. Предисловие к к этому документу + выполнение первых двух упражнений может стать хорошим началом.
Выполнение приложения немного быстрее, выполнимо. Знание Java больше и реализация небольших хитростей дает вам бесконечный источник способов сократить на несколько процентов время выполнения. Прежде чем вы начнете, вам следует установить надежную тестовую систему (например, JMH ), чтобы отслеживать ваши успехи. Вы можете взглянуть на детали размещения объектов, JIT, встраивание, размер ваших переменных и т. Д. Некоторые могут поначалу немного пугать, но это интересный способ узнать что-то новое.
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
.
Изучите bounces
свойство UIScrollView
. Quoth документы Apple:
, Если значение свойства
YES
(значение по умолчанию), возвраты представления прокрутки, когда оно встречается с границей содержания. Возврат визуально указывает, что прокрутка достигла края содержания. Если значениеNO
, прокрутив остановки сразу на границе содержания без возврата.
Удостоверяются, что Вы используете право UIScrollView
. Я не уверен, на что иерархия похожа для UIWebView
, но представление прокрутки могло быть родителем, не ребенком, UIWebView
.
Одно из подпредставлений UIWebView
должно быть UIScrollView
. Установите scrollEnabled
, свойство к NO
и веб-представление будет иметь прокрутку отключенного полностью.
Примечание: это технически использует частный API, и таким образом Ваше приложение могло быть отклонено или катастрофический отказ в будущих версиях ОС. Используйте @try
и respondsToSelector
Я смотрел на проект, который помогает создать веб-приложения как абсолютные устанавливаемые приложения на iPhone, названном QuickConnect, и нашел решение, которое работает, если Вы не хотите, чтобы Ваш экран был с возможностью прокрутки вообще, который в моем случае я не сделал.
В вышеупомянутом проекте/сообщении в блоге, они упоминают функцию JavaScript, которую можно добавить для выключения возврата, который по существу сводится к этому:
document.ontouchmove = function(event){
event.preventDefault();
}
, Если Вы хотите видеть больше о том, как они реализуют его, просто загрузите QuickConnect и проверьте его.... Но в основном все, что это делает, назвать тот JavaScript на загрузке страницы... Я пытался просто поместить его в заголовок моего документа, и это, кажется, хорошо работает.
У меня сработал метод Брэда. Если вы используете его, возможно, вы захотите сделать его немного безопаснее.
id scrollView = [yourWebView.subviews objectAtIndex:0]; if( [scrollView respondsToSelector:@selector(setAllowsRubberBanding:)] ) { [scrollView performSelector:@selector(setAllowsRubberBanding:) withObject:NO]; }
Если яблоко что-то изменит, отскок вернется, но, по крайней мере, ваше приложение не выйдет из строя.
Предупреждение. Я использовал setAllowsRubberBanding: в своем приложении, и Apple отклонила его, заявив, что закрытые функции API не разрешены (цитата: 3.3.1)
Вот два новых потенциальных решения. Видимо, для отключения прокрутки можно использовать jqtouch или pastrykit. Однако у меня этого нет для работы. Вы могли бы быть более компетентными.
Фиксированное позиционирование на мобильном Safari
Эта ссылка помогла мне много ..... его легко ... есть демонстрация ..
Я обошел коллекцию вложенных представлений UIWebView и установил их фон в [UIColor blackColor], тот же цвет, что и фон веб-страницы. Представление по-прежнему будет отскакивать, но не будет показывать этот уродливый темно-серый фон.
Мне кажется, что 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;
}
}
Я был раздражен, узнав, что 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)
Это отличный универсальный способ создания веб-представления с настраиваемым поведением прокрутки.Есть всего несколько вещей, на которые следует обратить внимание:
Все, что я сделал для этого:
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.