UIWebView внутри UIScrollView

В моем приложении есть несколько представлений UIWebView внутри UIScrollView.Иногда у меня есть html-контент, поэтому я загружаю UIWebView с помощью метода UIWebView loadHTMLString :baseURL :. Это, похоже, не вызывает проблем. Недавно я начал загружать некоторые экземпляры UIWebView с URL-адресом, используя метод loadRequest :. Как только я начал это делать, каждый раз, когда я прокручиваю, я получаю следующую ошибку:

*Завершение работы приложения из-за необработанного исключения «CALayerInvalidGeometry», причина :«Позиция CALayer содержит NaN :[nan nan]»

Со следующей трассировкой стека:

Thread 1, Queue : (null)
#0  0x01dd5caa in objc_exception_throw ()
#1  0x01f5da48 in +[NSException raise:format:arguments:] ()
#2  0x01f5d9b9 in +[NSException raise:format:] ()
#3  0x007e8c0d in CA::Layer::set_position(CA::Vec2<double> const&, bool) ()
#4  0x007def55 in -[CALayer setPosition:] ()
#5  0x037b07d3 in -[WebFixedPositionContent scrollOrZoomChanged:] ()
#6  0x00a5bfae in -[UIWebDocumentView _updateFixedPositionContent] ()
#7  0x00c66ff3 in -[UIWebBrowserView _updateFixedPositionContent] ()
#8  0x00a5b07e in -[UIWebDocumentView _didScroll] ()
#9  0x01fb6dea in -[NSObject performSelector:] ()
#10 0x01f207f1 in -[NSArray makeObjectsPerformSelector:] ()
#11 0x0091627d in -[UIScrollView(Static) _notifyDidScroll] ()
#12 0x009029ae in -[UIScrollView setContentOffset:] ()
#13 0x00909ac8 in -[UIScrollView _updatePanGesture] ()
#14 0x0090d3c0 in -[UIScrollView handlePan:] ()
#15 0x00b84e29 in _UIGestureRecognizerSendActions ()
#16 0x00b84133 in -[UIGestureRecognizer _updateGestureWithEvent:] ()
#17 0x00b853bf in -[UIGestureRecognizer _delayedUpdateGesture] ()
#18 0x00b87a21 in ___UIGestureRecognizerUpdate_block_invoke_0541 ()
#19 0x00b8797c in _UIGestureRecognizerApplyBlocksToArray ()
#20 0x00b803d7 in _UIGestureRecognizerUpdate ()
#21 0x008e51a2 in -[UIWindow _sendGesturesForEvent:] ()
#22 0x008e5532 in -[UIWindow sendEvent:] ()

Я просмотрел множество вопросов и ответов по этому поводу и понял, что Apple не одобряет это, но я не видел ответов, которые бы предлагали альтернативу.

Мой первый вопрос :Есть ли альтернативный способ добиться такого же эффекта?

Ниже приведен фрагмент того, как я создаю UIWebView

- (void) createWebView:(NSString*)url{
NSInteger requestedHeight = 480;
NSInteger requestedWidth = 640;

self.webContent = [[UIWebView alloc] initWithFrame: CGRectMake(0, self.frame.size.height, requestedWidth, requestedHeight)];
self.webContent.scrollView.userInteractionEnabled = NO;
self.webContent.scrollView.scrollEnabled = NO; 
self.webContent.scrollView.bounces = NO;

NSURLRequest *urlRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:url]];
[self.webContent loadRequest:urlRequest];

[self addSubview:self.webContent];

NSInteger calculatedHeight = self.webContent.frame.origin.y + self.webContent.frame.size.height;
NSInteger calculatedWidth = self.webContent.frame.origin.x + self.webContent.frame.size.width;
if (calculatedHeight > self.frame.size.height || calculatedWidth > self.frame.size.width){
    self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y, MAX(self.frame.size.width, calculatedWidth), MAX(self.frame.size.height, calculatedHeight + 5));
}    
}

. Как видите, я отключил прокрутку и пользовательский ввод для UIWebView.

Мой второй вопрос :Почему UIWebView (или, по крайней мере, одно или несколько его подпредставлений )вообще обрабатывают прокрутку, когда я явно отключил эту функцию?

Мой третий вопрос :Так как кажется, что прокрутка все равно обрабатывается, есть ли другой способ перехватить или отключить уведомление о прокрутке, которое отправляется в UIWebView?

Как видите, на самом деле я не собираюсь позволять пользователю взаимодействовать с содержимым UIWebView -, просто позволяю ему видеть содержимое.

В этом сценарии возможной альтернативой было бы каким-то образом создать UIWebView за пределами UIScrollView, который не виден пользователю, захватить его содержимое в изображение, а затем отобразить содержимое в UIImageView? Если да, то как мне захватить содержимое UIWebView в изображение?

РЕДАКТИРОВАТЬ :Я нашел решение для этого, которое было довольно простым. В основном загружайте свой UIWebView, но не добавляйте его в качестве подвида. Когда UIWebView завершит загрузку,создайте образ с кодом ниже:

- (void)webViewDidFinishLoad:(UIWebView *)webView{
UIGraphicsBeginImageContext(self.webContent.bounds.size);
[self.webContent.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

[self.imageContent setImage:image];
}

Мне все еще было бы интересно услышать ответы на вопросы с 1 по 3. В будущем, если мы решим поддерживать интерактивные UIWebView, это решение не будет работать.

Какие-либо предложения?

8
задан CharlesB 19 February 2013 в 14:21
поделиться