tag:blogger.com,1999:blog-6538117324271148932.post5897564127446759073..comments2022-04-05T00:19:16.846+09:00Comments on プログラミング雑記: UIWebViewのズームKenji Nakamurahttp://www.blogger.com/profile/15945949488491632185noreply@blogger.comBlogger5125tag:blogger.com,1999:blog-6538117324271148932.post-20059684294532590612013-04-21T10:19:27.281+09:002013-04-21T10:19:27.281+09:00PDFの場合はwebViewDidFinishLoad:が呼ばれてもまだ描画が完了していなかったので...PDFの場合はwebViewDidFinishLoad:が呼ばれてもまだ描画が完了していなかったのですが、htmlの場合は完了しているようです。htmlしか対象にしないのであれば、Timerによる処理はなくてもズームが行えました。(どんなに大きなサイズでも大丈夫かどうかはわかりませんが...)Kenji Nakamurahttps://www.blogger.com/profile/15945949488491632185noreply@blogger.comtag:blogger.com,1999:blog-6538117324271148932.post-7070786004203158012013-04-12T08:01:08.522+09:002013-04-12T08:01:08.522+09:00numberOfPages=1固定だと待ち時間も固定になってしまいます。
ループ内で次のようなことを...numberOfPages=1固定だと待ち時間も固定になってしまいます。<br />ループ内で次のようなことをやってみたらいいかがでしょう。<br />scroolViewのサイズが変更されるのを待つ。<br />サイズが変更しないこともあるのでタイムアウト(50~100msec程度?)を設ける。<br />サイズが変更されてもループを継続し、同じサイズが数回連続するのを待つ。<br />サイズが安定したら描画完了とみなす。<br />サイズが安定してもScrollViewのZoomが有効になるまでもう少し時間がかかるかもしれないので、同じサイズが連続する回数で調整する。もしかしたら、サイズによって待ち時間を長くする必要があるかもしれません。Kenji Nakamurahttps://www.blogger.com/profile/15945949488491632185noreply@blogger.comtag:blogger.com,1999:blog-6538117324271148932.post-77562157627260201872013-04-12T07:24:47.629+09:002013-04-12T07:24:47.629+09:00@interface を書きませんでしたが、このクラスはUIWebViewのサブクラスになってます。...@interface を書きませんでしたが、このクラスはUIWebViewのサブクラスになってます。<br />@interface MyWebView : UIWebView <br />多分selfがUIWebView以外のクラスのため、self.scrollViewでエラーになるのでしょう。<br />selfをUIWebViewオブジェクトに置き換えてみてください。<br />setZoomAnimated:メソッドは自分で作ったものです。適当なメソッドを作り、そこでズームを実行してください。<br />このメソッドではスームインする領域の位置、サイズを計算して、zoomToRect:animated:を実行しています。<br />別メソッドにしてあるのはロードとローテイトの両方から呼び出すためです。Kenji Nakamurahttps://www.blogger.com/profile/15945949488491632185noreply@blogger.comtag:blogger.com,1999:blog-6538117324271148932.post-87078534382203090872013-04-10T12:25:56.042+09:002013-04-10T12:25:56.042+09:00こんな方法で対処してました。待ち時間の数値を変えて試してみてください。
1ページだけの場合も少し待っ...こんな方法で対処してました。待ち時間の数値を変えて試してみてください。<br />1ページだけの場合も少し待っています。<br />デバイス回転時についてはよくわかりませんが、やはり気にならない程度に待てばよさそうですが...<br />@implementation MyWebView<br />{<br /> int cnt;<br /> int numberOfPages;<br /> NSTimer *timerWaiting;<br />}<br /><br />- (void)webViewDidFinishLoad:(UIWebView *)webView<br />{<br /> .....<br /> numberOfPages= CGPDFDocumentGetNumberOfPages(pdf);<br /> float interval = 0.01; //<--OSのスケジューリングに依存するので、実際はもっと長くなる<br /><br /> //この時点ではまだスクロールビューの描画が完了していないため、timerでさらに描画完了を待つ。<br /> if (timerWaiting == nil) {<br /> cnt = 0;<br /> timerWaiting = [NSTimer scheduledTimerWithTimeInterval:interval<br /> target:self<br /> selector:@selector(didFinishExpandingScrollView)<br /> userInfo:nil<br /> repeats:YES];<br /> }<br />}<br /><br />//スクロールビューのframeが拡大したら描画完了とみなす。<br />//frame拡大後も描画は完了していないので、ページ数に応じてもう少しまつ。<br />//1ページだけの場合も数回ループする。<br />- (void)didFinishExpandingScrollView<br />{<br /> cnt++;<br /> int n1 = 5 + numberOfPages / 5;<br /> int n2 = n1 + 5; //frame拡大後も数回ループする<br /> if (cnt < n1) {<br /> if (numberOfPages == 1<br /> || self.scrollView.contentSize.height >= pageHeight * (numberOfPages - 1) * initScale) {<br /> cnt = n1;<br /> }<br /> } else if (cnt > n2) {<br /> [timerWaiting invalidate];<br /> timerWaiting = nil;<br /> [self setZoomAnimated:NO];<br /> }<br />}Kenji Nakamurahttps://www.blogger.com/profile/15945949488491632185noreply@blogger.comtag:blogger.com,1999:blog-6538117324271148932.post-24139267539558265372013-04-10T08:59:44.257+09:002013-04-10T08:59:44.257+09:00現在、storyboardを使用し、オリジナルブラウザを作成しています。webViewDidFini...現在、storyboardを使用し、オリジナルブラウザを作成しています。webViewDidFinishLoad:でNSTimerで別メソッドを呼び、何かの処理をさせているのでしょうか?1ページだけのときはcontentSizeに変化がないので、困っています。<br />1ページだけだとデバイス回転時に変化がありません。何かいい方法があれば教えて頂きたいのですが。。。 <br />Anonymoushttps://www.blogger.com/profile/10502714733375417865noreply@blogger.com