Skip to content

Instantly share code, notes, and snippets.

@yuseinishiyama
Last active August 29, 2015 13:56
Show Gist options
  • Save yuseinishiyama/8860658 to your computer and use it in GitHub Desktop.
Save yuseinishiyama/8860658 to your computer and use it in GitHub Desktop.
素材を用意せずに、単色のナビゲーションバーを設定する方法。
+ (UIImage *)imageForNavigationBar
{
/*
* 1x44、最下部のドットが灰色でその他は白色の画像を生成する。
*/
CGRect rect = CGRectMake(0.0f, 0.0f, 1.0f, 44.0f);
UIGraphicsBeginImageContext(rect.size);
CGContextRef context = UIGraphicsGetCurrentContext();
// 白で塗りつぶす。
CGContextSetFillColorWithColor(context, [[UIColor whiteColor] CGColor]);
CGContextFillRect(context, rect);
// 最下部に灰色の線を引く。
CGContextSetRGBStrokeColor(context, 0.0, 0.0, 0.0, 0.2);
CGContextSetRGBFillColor(context, 0.0, 0.0, 0.0, 0.2);
CGContextSetLineJoin(context, kCGLineJoinRound);
CGContextSetLineWidth(context, 1);
CGMutablePathRef pathRef = CGPathCreateMutable();
CGPathMoveToPoint(pathRef, NULL, 0, 44);
CGPathAddLineToPoint(pathRef, NULL, 1, 44);
CGPathCloseSubpath(pathRef);
CGContextAddPath(context, pathRef);
CGContextFillPath(context);
CGContextAddPath(context, pathRef);
CGContextStrokePath(context);
CGPathRelease(pathRef);
// コンテキストからUIImageを生成。
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}
- (void)setupNavigationBarAppearance
{
/*
単色の背景色の設定。
下記の理由ですべてのOSで汎用的に使える方法は無い。
setBackgroundColor→iOS5で反映されない。
setTintColor→デフォルトのボタンにも色が反映されてしまう。
そのため、
iOS7以降ではsetBarTintColorを使い
それ以外は、ナビゲーションバー用の画像をBackgroundImageに設定する。
という方法を選択した。
*/
if ([UINavigationBar instancesRespondToSelector:@selector(setBarTintColor:)]) {
[[UINavigationBar appearance] setBarTintColor:[UIColor whiteColor]];
} else {
// 単色の画像をそのまま使うと、ナビゲーションバー部の境界線が無くなってしまうので、下線がある画像を生成している。
[[UINavigationBar appearance] setBackgroundImage:[UIImageGenerator imageForNavigationBar]
forBarMetrics:UIBarMetricsDefault];
// iOS6ではMPMoviePlayerViewControllerにも上記の設定が反映されてしまうので、
// MPMoviePlayerViewControllerのNavigationBarの色がデフォルトのものになるように設定する。
[[UINavigationBar appearanceWhenContainedIn:[MPMoviePlayerViewController class], nil] setBackgroundImage:nil
forBarMetrics:UIBarMetricsDefault];
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment