Master-Details プロジェクトをセットアップして XCode で実行してもまったく問題なく、すべて正常に動作します。ただし、NavigationBar の右上隅と左上隅を丸くしようとすると、非常に奇妙な効果があります。基本的に、詳細ビューの「戻る」左ボタンの「タッチ」応答を相殺します。
ボタンは引き続き機能しますが、iPhone は、ボタン自体ではなく、NavigationBar のすぐ下をクリックしたときにのみユーザーのタッチを検出できるようです。
私が持っているコードは次のとおりです。
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect
{
UIColor *color = [UIColor darkGrayColor];
UIImage *img = [UIImage imageNamed:@"nav-bar"];
[img drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
self.tintColor = color;
// Create mask to round corners
CGRect bounds = CGRectMake(0, 0, self.frame.size.width, self.frame.size.height);
UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:bounds byRoundingCorners:(UIRectCornerTopLeft | UIRectCornerTopRight) cornerRadii:CGSizeMake(10.0, 10.0)];
CAShapeLayer *maskLayer = [CAShapeLayer layer];
maskLayer.frame = bounds;
maskLayer.path = maskPath.CGPath;
// Apply mask to navigation bar
[self.layer addSublayer:maskLayer];
self.layer.mask = maskLayer;
// Apply logo to navigation bar
UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"logo"]];
self.topItem.titleView = imageView;
}
これは私が意味することのスクリーンショットです。ボタンは、矢印が指している場所に触れたときにのみ応答します。
- - アップデート - -
いくつかのテストの後、問題は「self.layer.mask = maskLayer」行にあることがわかりました。コードをリファクタリングし、ストーリー ボードではなく xib ファイルのみを使用する別のプロジェクトでテストしましたが、問題はありませんが、現在のプロジェクトではまだ機能していません。
CGRect bounds = CGRectMake(0, 0, navigationController.navigationBar.bounds.size.width,
navigationController.navigationBar.bounds.size.height);
UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:bounds byRoundingCorners:(UIRectCornerTopLeft | UIRectCornerTopRight) cornerRadii:CGSizeMake(10.0, 10.0)];
CAShapeLayer *maskLayer = [CAShapeLayer layer];
maskLayer.frame = bounds;
maskLayer.path = maskPath.CGPath;
// Apply mask to navigation bar
//navigationController.navigationBar.layer.mask = maskLayer;
[navigationController.navigationBar.layer addSublayer:maskLayer];
navigationController.navigationBar.layer.mask = maskLayer;