6

私はfacebookのようなサイドメニュー付きのアプリケーションを作成しました。私は自分自身の上にビューを追加するルートビューコントローラを持っています。そして、ユーザが 'メニュー'ボタンを押すと、ビューをスライドさせてメニューを見ることができます。UINavBarは他のボタンよりも目に見えないレイヤーを持っているようです。

私の問題は、ビューが最初にロードされるとき、UINavBarが約20ピクセルかそれ以下であるように見えるということです。これは、自動的に自分自身を調整し、モーダル遷移が完了したときだけで、ステータスバーの下に移動

enter image description here

(下の画像は、それがモーダル左右反転であるため、ビットはオフ中心見えます)。ここで

enter image description here

私は、「メニュー」ボタンを押したときに何が起こるかのスクリーンショットです。それは右の上平面図をスライド

私は赤に設定し、左矢印と右矢印のフレームの背景を持っている上に、私はどこクリッカブル/タップ可能な地域を見ることができるように、あなたが画像で見ることができるようenter image description here

です。青い線をクリックすると青い線が引かれ、青い線をクリックすると上の矢印が表示されません。左側の同じ一般的な領域をクリックすると、メニューボタンがトリガーされます。私はシミュレータとモバイルデバイスの両方でこれを再現することができます(私はボタンを指で操作していません)。

enter image description here

ナビゲーションバーがロードされているので、それがiPhoneに想定しているよりも低いが、私はそれがまだメニューをトリガされUIButton枠内をクリックしたときに、それはそう、その位置のままであると考えていることを私には思えます矢印セレクタをトリガしません。矢印の途中で直接タップすると、矢印セレクタがトリガされますが、画像の外に少しだけ表示されると、矢印セレクタはトリガされません。ここで

は私のRootViewControllerのviewDidLoad

AppointmentViewController *appointmentViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"AppointmentViewController"]; 
NSLog(@"B: %@",NSStringFromCGRect(appointmentViewController.view.frame)); 
self.navController = [[UINavigationController alloc] initWithRootViewController:appointmentViewController]; 
NSLog(@"B2: %@",NSStringFromCGRect(appointmentViewController.view.frame)); 
NSLog(@"Nav Bounds: %@",NSStringFromCGRect(self.navController.view.frame)); 
NSLog(@"Bounds: %@",NSStringFromCGRect(self.contentView.bounds)); 
self.navController.view.frame = self.contentView.bounds; 
NSLog(@"Nav Bounds2: %@",NSStringFromCGRect(self.navController.view.frame)); 
[self addShadowToMenu]; 
[self.contentView addSubview:self.navController.view]; 

RootViewControllerログ

2012-04-30 12:24:44.533 My-App[19929:fb03] B: {{0, 20}, {320, 460}} 
2012-04-30 12:24:44.535 My-App[19929:fb03] B2: {{0, 20}, {320, 460}} 
2012-04-30 12:24:44.535 My-App[19929:fb03] Nav Bounds: {{0, 0}, {320, 480}} 
2012-04-30 12:24:44.535 My-App[19929:fb03] Bounds: {{0, 0}, {320, 460}} 
2012-04-30 12:24:44.535 My-App[19929:fb03] Nav Bounds2: {{0, 0}, {320, 460}} 

AppointmentViewController

self.title = [dataObj.preferences objectForKey:@"appts_name_plural"]; 
self.navigationItem.title = self.title; 
dayView = [[APCalendarDayView alloc] initWithCalendarView:(APCalendarView *)self]; 
APListView = [self.storyboard instantiateViewControllerWithIdentifier:@"AppointmentListView"]; 
APListView.tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero]; 


SideMenuView *myDelegate = [[SideMenuView alloc] init]; 
[self setSideMenuDelegate:myDelegate]; 
//set the delegate's currentViewController property so that we can add a subview to this View. 
[sideMenuDelegate setCurrentViewController:self]; 

UIBarButtonItem *flexSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil]; 
UIBarButtonItem *today = [[UIBarButtonItem alloc] initWithTitle:@"Today" style:UIBarButtonItemStyleBordered target:nil action:@selector(todayPressed)]; 
NSArray *appointmentNavigationItems = [[NSArray alloc] initWithObjects:@"Day",@"List",@"Month", nil]; 
navcontrol = [[UISegmentedControl alloc] initWithItems:appointmentNavigationItems]; 
[navcontrol setSegmentedControlStyle:UISegmentedControlStyleBar]; 
[navcontrol addTarget:self action:@selector(appointmentNavigationClicked:) forControlEvents:UIControlEventValueChanged]; 
[navcontrol setSelectedSegmentIndex:0]; 
UIBarButtonItem *segmentItems = [[UIBarButtonItem alloc] initWithCustomView:navcontrol]; 

NSArray *items = [NSArray arrayWithObjects:today,flexSpace,segmentItems, flexSpace, nil]; 
[appointmentToolbar setItems:items animated:NO]; 
[appointmentToolbar setAutoresizesSubviews:YES]; 


[[self.view superview] addSubview:myDelegate.view]; 
[self setViewSizeOffset:(appointmentToolbar.bounds.size.height)]; 

CalendarDayView

です

headerViewをさらに遠ざけると、赤い領域のどこかを選択して矢印セレクタをトリガーすることができます。しかし、私はAppleのカレンダーと一致し、ナビゲーションバーのすぐ下にあるようにします。

ナビゲーションバーがheaderViewの上部をタップしないようにする理由を知っていますか?クリアされるために、ブロックされているheaderViewの部分は、青い線の上から上に向かっています。赤い背景を持つUIButtonは、フレームに関連付けられたアクションを持っているため、イベントがトリガーされるはずですが、navbarがUIButtonの半分をタップしているのをブロックしているようです。

+0

投稿した最初のコードスニペットから、コンテンツビューの境界とnavコントローラのフレームの両方を記録できますか? NSStringFromCGRectを使用して、コンソールに印刷できる標準文字列を取得します。 – Sam

+0

@Samバインドされたログを含めるようにOPを編集しました – Bot

答えて

1

この現象は、UIWindowがナビゲーションバーフレームと一致するタッチに伝播していないためです。この動作を無効にする唯一の方法は、UIWindowをサブクラス化して、hitTest:メソッドをオーバーライドすることです。これにより、この領域のタッチを検出し、適切な応答者に転送することができます。

Hereは、カスタムUIWindowサブクラスを示すサンプルプロジェクトで、画面上のどこに触れても反応します。

+0

これが私にどのように適用され、どのように私のニーズに使用するかの例を挙げることができますか? – Bot

関連する問題