如何检测UIWebView的缩放比例

时间:2011-03-27 14:11:22

标签: iphone uiwebview uiscrollview zoom

我希望在用户放大时增加UIWebView的高度(例如iPhone中的默认邮件应用)。 因此,我尝试使用以下代码在webview中查找scrollview并添加UIScrollViewDelegate以使用scrollViewDidZoom来检测缩放比例,以便在此方法上增加webview的高度。

// MessageAppDelegate.h
@interface MessageAppDelegate : NSObject <UIApplicationDelegate,UIWebViewDelegate,UIScrollViewDelegate> {   
    UIWebView *webview;
    UIScrollView *scrollview;
}


//MessageAppDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{

    [self.window makeKeyAndVisible];

    webview = [[UIWebView alloc] initWithFrame:CGRectMake(0, 150, 320, 100)];
    webview.delegate = self;
    webview.scalesPageToFit = YES;
    webview.userInteractionEnabled = YES;

    [webview loadHTMLString:@"<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, maximum-scale=6.0 user-scalable=yes\">test test" baseURL:nil];

    [self.window addSubview:webview];

    // Find scrollview in webview
    for (UIView *view in webview.subviews) {
        if ([view isKindOfClass:[UIScrollView class]]) {
            // Get UIScrollView object
            scrollview = (UIScrollView *) view;
            scrollview.delegate = self;
        }
    }

    return YES;
}

- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale{
    NSLog(@"scale %f",scale);
}

- (void)scrollViewDidZoom:(UIScrollView *)scrollView{
    NSLog(@"scrollViewDidZoom %f",scrollview.zoomScale);
}

问题是我无法在webview上放大/缩小 但NSLog方法显示scrollViewDisEndZooming

  

比例1.0

当我结束缩放时 并且scrollViewDidZoom方法没有显示任何内容。 我想检测webview的缩放比例,以便在scrollViewDidZoom计算其高度。

我做错了什么? 请帮忙。

提前致谢。

2 个答案:

答案 0 :(得分:5)

我为你的代码做得很好,做了以下修改:

您只需获取scrollview类点,然后可以获得scrollview.contentSize.width,当您放大时可以更改,但scrollview.zoomScale始终保持1.so必须使用contensize.width来计算比例。 / p>

@interface dictViewController : UIViewController<UIWebViewDelegate,UITextFieldDelegate,UIGestureRecognizerDelegate,UIScrollViewDelegate>{

UIScrollView *scrollview;
......................

//scrollview.delegate = self;

for (UIView *view in webViewM.subviews) {
    if ([view isKindOfClass:[UIScrollView class]]) {
        // Get UIScrollView object
        scrollview = (UIScrollView *) view;
        //scrollview.delegate = self;
    }
}
/*
- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale{
//NSLog(@"scale zooming %f",scale);
}

- (void)scrollViewDidZoom:(UIScrollView *)scrollView{
//NSLog(@"scrollViewDidZoom %f",scrollview.zoomScale);
}*/


- (void)swipeRightAction:(id)ignored
{  

 NSLog(@"wid=%f", scrollview.contentSize.width);
 NSLog(@"zoomscale=%f", scrollview.zoomScale);

}

答案 1 :(得分:0)

我认为没有一种正确的方法可以从暴露的API中做到这一点,但是有一种hacky方式。

UIWebView包含UIScrollView,可以为其授予代理人权限。然后,当缩放更改时,您(委托)将获得一个名为scrollViewDidZoom:的回调。

为了找到滚动视图,您可以从网络视图中获取subviews集合并迭代以查看哪一个isKindOfClass:[UIScrollView class]

现在,UIWebView也符合UIScrollViewDelegate。这可能意味着您正在改变Web视图的实现,这可能是一个坏主意。测试好。