调整大小时,在UIWebView中保持滚动位置

时间:2012-01-26 01:49:16

标签: objective-c ios

我有一个UIWebView,可以在旋转设备时调整大小。调整webview的大小时,页面顶部的滚动位置保持不变,但由于内容的高度发生变化,因此在旋转结束时最终会出现在不同的位置。

webview的内容是未缩放以适合的文本和图像。在较小的宽度处,文本会断开,使其更高。

是否有一种保持滚动位置的好方法?

2 个答案:

答案 0 :(得分:0)

解决此问题的一种方法是在轮换后调整webviews的scrollview的contentOffset。由于文本中换行符的更改,页面的整体大小可能会在轮换期间发生变化。

因此,要解决此问题,您必须在“willRotateToInterfaceOrientation”方法中保存webviews内容的旧大小,然后计算“didRotateFromInterfaceOrientation”方法中的相对更改并调整scrollviews contentOffset。 (这几乎'解决了问题 - 我说几乎是因为换行符的变化,你最终可能会偏离你想要的位置一两行。)

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
    oldSize = self.webView.scrollView.contentSize;
}

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
{
    CGSize newSize = self.webView.scrollView.contentSize;
    float xFactor = newSize.width / oldSize.width;
    float yFactor = newSize.height / oldSize.height;

    CGPoint newOffset = webView.scrollView.contentOffset;
    newOffset.x *= xFactor;
    newOffset.y *= yFactor;

    webView.scrollView.contentOffset = newOffset;    
}

答案 1 :(得分:0)

看看我的解决方案:https://github.com/cxa/WebViewContentPositioner。简而言之,我使用document.caretRangeFromPoint(0, 0)来捕获Range,并插入一个元素来跟踪其位置。调整大小后,使用捕获的Range信息来确定位置。