如何检测UIWebView的缩放比例

4
我希望在用户缩放时(如iPhone上的默认邮件应用程序),增加UIWebView的高度。 因此,我尝试了下面的代码来查找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上缩放, 但是 scrollViewDisEndZooming 方法的 NSLog 显示了

比例为1.0

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

我做错了什么? 请帮忙。

提前感谢。

2个回答

5

我已经为您的代码进行了优化,现在需要进行以下修改:

您只需获取scrollview类的指针,就可以获得scrollview.contentSize.width。当您缩放时,该宽度会发生改变,但scrollview.zoomScale始终保持为1。因此,必须使用contensize.width来计算比例。

@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);

}

0

我认为没有一种适当的方法可以从公开的API中完成它,但有一种hacky的方法。

UIWebView包含一个UIScrollView,可以给它一个代理。然后当缩放改变时,你(代理)会得到一个回调scrollViewDidZoom:

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

现在,UIWebView也符合UIScrollViewDelegate。所以这可能意味着你正在改变web视图的实现,这可能是一个坏主意。一定要好好测试。


谢谢你的回答。我想要实现与iPhone默认邮件应用程序相同的功能,即用户只能缩放邮件内容,并且在缩放时它看起来像是Webview的高度在增加。我尝试使用设置在UITableView页脚上的Webview。我在Webview上进行了缩放,但它显示了表格视图和Webview的滚动条。我认为如果我根据缩放比例增加Webview的高度,它将仅在表格视图上显示滚动条。你有任何想法吗? - Dolly
有人能够做到这一点吗?我正在尝试模仿本机邮件客户端的UI,但无法做到。当webView缩放时如何重新定位其他视图? - SayeedHussain

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接