UIWebView的UIScrollView子视图可以滚动但反弹回帧而不会出现垂直滚动指示器

时间:2013-11-07 09:23:38

标签: ios uiwebview uiscrollview uiimagepickercontroller

更新 - 解决方案2

第一个解决方案(下面)仅适用于iOS 7,而不适用于iOS 6和iOS 5.因此,当使用-(void)scrollViewDidScroll:(UIScrollView *)scrollView进行任何滚动运动时,另一种方法是更新滚动视图的内容大小iOS 7,6和5。

-(void)scrollViewDidScroll:(UIScrollView *)scrollView内,我记录了最高内容大小

if (_currentWebPageContentHeight < [[_webView scrollView] contentSize].height) {
        _currentWebPageContentHeight = [[_webView scrollView] contentSize].height;
    }

每当加载另一个网页或重新加载当前页面时,将_currentWebPageContentHeight恢复为默认高度(网页视图的高度)。

更新 - 解决方案1 ​​

我找到了解决办法,但不知道为什么会有效。略微更改滚动视图的contentInset会强制将contentSize刷新为当前版本。

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
    /// Load image data in async manner from photo chosen in album or taken by camera
    // ....

    /// Refresh the contentSize of UIScrollView inside UIWebView
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
        [_galleryPopoverController dismissPopoverAnimated:YES];

        /// A patch to force refresh the contentSize of scrollView, 0.01 is chosen to give unnoticeable layout change to user
        [[webView scrollView] setContentInset:UIEdgeInsetsMake(0, 0, 0.01, 0)]; // UIEdgeInsetsMake(top, left, bottom, right)
    } else {
        [picker dismissViewControllerAnimated:YES completion:^{
            /// A patch to force refresh the contentSize of scrollView, 0.01 is chosen to give unnoticeable layout change to user
            [[webView scrollView] setContentInset:UIEdgeInsetsMake(0, 0, 0.01, 0)]; // UIEdgeInsetsMake(top, left, bottom, right)
          }];
    }
}

原始问题

使用Xcode 5,iOS 7,iPhone 5,没有nib文件,没有手动添加自动布局约束。

在一个项目中,有一个UIWebView,左下角有一个按钮,该按钮用于将照片从iPhone的相册或相机上传到测试网站。

当我尝试从相册上传照片时单击Choose按钮时,方法-(void)imagePickerController:didFinishPickingMediaWithInfo:被调用,当此方法完成时,UIImagePickerController将随动画消失,并且会加载所选的照片。但是UIWebView的UIScrollView子视图虽然可以向下滚动到当前网页的末尾,但是会继续弹回到UIWebView的可见框架(origin.x = 0,origin.y = 64,size.width = 320,size.height) = 568 - 64),也看不到垂直滚动指示器。

UIWebView中嵌入的UIScrollView的框架/边界是正确的,我在以下语句的^ {}中检查它:

// At the end of the -(void)imagePickerController:didFinishPickingMediaWithInfo:
[imagePickerControllerInstance dismissViewControllerAnimated:YES completion:^{}];

我也强迫这些值是正确的。但不会改变上述意外行为。

[[webView scrollView] setShowsVerticalScrollIndicator:YES];
[[webView scrollView] setScrollIndicatorInsets:UIEdgeInsetsMake(0, 0, 0, 0)];
[[webView scrollView] setContentSize:(CGSizeMake([[UIScreen mainScreen] bounds].size.width, [[UIScreen mainScreen] bounds].size.height - 64))];

关于上面使用的数字:

  • 320是iPhone 5的宽度。
  • 568是iPhone 5的高度。
  • 64是状态栏和导航栏的高度。

任何人都可以解决这个问题?谢谢!

1 个答案:

答案 0 :(得分:2)

您应该setContentSize:到实际的内容大小,而不是可见的帧大小。那就是你的内容是1000px高,您应该setContentSize:CGSizeMake(width, 1000)。这样你告诉UIScrollView它应滚动显示1000px高内容。如果将UIScrollView的内容大小设置为等于其框架,则不会执行滚动,也不会显示滚动指示符(仅限弹跳效果)。