UIWebViewの背景を透明にしてみよう!
UIWebView* transWebView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)]; NSString* innerHTML = @"<span style=\"color: #F00;\">hogehoge</span>"; NSString* outerHTML = @"<body style=\"background-color: transparent\">%@</body>"; NSString* htmlString = [NSString stringWithFormat:outerHTML, innerHTML]; [transWebView setBackgroundColor:[UIColor clearColor]]; [transWebView setOpaque:NO]; [transWebView loadHTMLString:htmlString baseURL:nil]; [[self view] addSubview:transWebView]; [transWebView release];
- webViewのbackgroundColorをclearColorに
- webViewのopaqueをfalseに
- webView内のbodyのbackground-colorをtransparentに
調べても、なかなか出てこないもので。
UIWebViewの内部リンクからSafariを開いてみよう!
UIWebViewのデリゲートを使う。
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
このメソッドはUIWebViewからURLがリクエストされる度に実行されて、
引数としてリクエストの内容(URL, リクエストの種類等)が渡されてくる。
で、そのリクエストを実行するかどうかを決めて、YES/NOで返す、と。
今回はURLをSafariで開きたいので、
UIWebView内でのページ遷移(普通にリンクするとUIWebView内で開く)
は、
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { return NO; }
のようにして、全てキャンセル。
で、文字列からのロードを試してみる。
[webView loadHTMLString:htmlString baseURL:nil];
……何も表示されない。
ここのshouldStartLoadWithRequestには、
コードからの読み込みも含まれてしまうらしい。
なので、
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { NSString* scheme = [[request URL] scheme]; if([scheme compare:@"about"] == NSOrderedSame) { return YES; } return NO; }
about:blankを見逃してやればよかった。
あとは、http://〜で飛んでくるリクエストをsafariで開く部分。
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { NSString* scheme = [[request URL] scheme]; if([scheme compare:@"about"] == NSOrderedSame) { return YES; } if([scheme compare:@"http"] == NSOrderedSame) { [[UIApplication sharedApplication] openURL: [request URL]]; } return NO; }
こんな感じ。
UIWebViewのスクロールをOFFにしてみよう!
11/04/18追記
Undocumented APIでリジェクト対象になるようです。ご注意ください。
(thx iPhoneDveloper/via comment)
UIWebView* webView = [[UIWebView alloc] init]; UIScroller* scroller = [[webView subviews] lastObject]; [scroller setScrollingEnabled:NO];
コード的にはこれだけの話なんだけど、UIScrollerが無いよ、という警告が出る。
UIScrollerがどこで定義されてるかわからなかったので、
@interface UIScroller { } - (void)setScrollingEnabled:(BOOL)_bool; @end
としておいた。