我遇到了同样的问题,而且我试图在加载后放大我的 pdf。如果过早调用此代码,它将使 pdf 无法使用 - 您根本无法平移/滚动 pdf,您仍然可以捏拉缩放,但它只会放大到最左上角。
我最初有一些代码可以在给定延迟后删除黑色边框并放大 pdf;
- (void)webViewDidFinishLoad:(UIWebView *)webView {
[self performSelector:@selector(zoomIntoPDF) withObject:nil afterDelay:0.6];
}
0.6s 的延迟是没用的。在(使用中的)iPhone 4S 上进行测试时(有时)仍然不够长。在最新的设备上,0.6 秒的性能提升在延迟
@graver 的解决方案帮助我调查了这个问题。正如建议的那样,我在 while 循环中运行 NSLog(@"%@", v);(我也在 while 循环之前运行 NSLog(@"-------------");)。
我也在像这样延迟 0.6 秒后打电话给viewDidLayoutSubviews;
[self performSelector:@selector(viewDidLayoutSubviews) withObject:nil afterDelay:0.6];
这些是我的日志:
-------------
<UIWebView: 0x7fd803c2e920; frame = (0 0; 320 568); opaque = NO; autoresize = W+H; layer = <CALayer: 0x7fd803c18290>>
<_UIWebViewScrollView: 0x7fd803f6a720; frame = (0 0; 320 568); clipsToBounds = YES; autoresize = H; gestureRecognizers = <NSArray: 0x7fd803f6afb0>; layer = <CALayer: 0x7fd803f6a660>; contentOffset: {0, 0}; contentSize: {320, 568}>
<UIWebBrowserView: 0x7fd80487b400; frame = (0 0; 320 568); opaque = NO; gestureRecognizers = <NSArray: 0x7fd803f65290>; layer = <UIWebLayer: 0x7fd803da2050>>
-------------
<UIWebView: 0x7fd803c2e920; frame = (0 0; 320 568); opaque = NO; autoresize = W+H; layer = <CALayer: 0x7fd803c18290>>
<_UIWebViewScrollView: 0x7fd803f6a720; frame = (0 0; 320 568); clipsToBounds = YES; autoresize = H; gestureRecognizers = <NSArray: 0x7fd803f6afb0>; layer = <CALayer: 0x7fd803f6a660>; contentOffset: {0, 0}; contentSize: {320, 568}>
<UIWebBrowserView: 0x7fd80487b400; frame = (0 0; 320 568); opaque = NO; gestureRecognizers = <NSArray: 0x7fd803f65290>; layer = <UIWebLayer: 0x7fd803da2050>>
Reachability Flag Status: -R -----l- networkStatusForFlags
Reachability Flag Status: -R ------- networkStatusForFlags
-------------
<UIWebView: 0x7fd803c2e920; frame = (0 0; 320 568); opaque = NO; autoresize = W+H; layer = <CALayer: 0x7fd803c18290>>
<_UIWebViewScrollView: 0x7fd803f6a720; frame = (0 0; 320 568); clipsToBounds = YES; autoresize = H; gestureRecognizers = <NSArray: 0x7fd803f6afb0>; layer = <CALayer: 0x7fd803f6a660>; contentOffset: {0, 0}; contentSize: {320, 273.14641744548288}>
<UIWebPDFView: 0x7fd803c02570; frame = (0 0; 320 273.146); opaque = NO; gestureRecognizers = <NSArray: 0x7fd803c239d0>; layer = <CALayer: 0x7fd803c16a70>>
<UIPDFPageView: 0x7fd80601cf60; frame = (0 7; 320 259); tag = 1000000; gestureRecognizers = <NSArray: 0x7fd803c27db0>; layer = <CALayer: 0x7fd803ddd2f0>>
如您所见,UIPDFPageView 直到最后才出现 - 第三次也是最后一次 viewDidLayoutSubviews 被延迟调用。
编辑:这与@Heiko 的答案非常相似,但使用的是递归方法而不是计时器。
一定有更好的解决方案,比如检测webViews子视图的变化,但是这个解决方案目前有效:
- (void)webViewDidFinishLoad:(UIWebView *)webView
{
[self.webView setScalesPageToFit:YES];
loopCap = 0;
[self performSelector:@selector(hasPDFLoaded) withObject:nil afterDelay:0.05];
}
- (void)hasPDFLoaded
{
BOOL containsPDF = NO;
for (UIView *child in self.webView.scrollView.subviews)
{
if ([NSStringFromClass([child class]) isEqualToString:@"UIWebPDFView"]) {
containsPDF = YES;
}
}
if (containsPDF) {
[self fixWebviewAndZoom];
} else {
if (loopCap < 20) {
loopCap++;
[self performSelector:@selector(hasPDFLoaded) withObject:nil afterDelay:0.05];
}
}
}
-(void)fixWebviewAndZoom {
UIView *v = self.webView;
while (v) {
v.backgroundColor = [UIColor whiteColor];
v = [v.subviews firstObject];
}
[self performSelector:@selector(zoomIntoPDF) withObject:nil afterDelay:0.05];
}
请原谅方法和变量名,明天我会想出更合适的!
如您所见,它是一种递归方法,它会调用自身直到 pdf 加载完毕。有一个上限可以避免任何无限循环(如果此时没有加载,应该有一个警报或其他东西)。上限为 20,延迟为 0.05 秒,允许 1 秒加载 pdf。我可能会将上限增加到 40,但我认为 0.05 在性能方面还可以,但我需要进行一些适当的测试。
我希望这很有见地,但我非常感谢对此解决方案的一些反馈或改进。