u_

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];
  1. webViewのbackgroundColorをclearColorに
  2. webViewのopaqueをfalseに
  3. 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

としておいた。