UIScrollViewの下部にあるUIButtonsがタッチを受信していません
質問
タブバーとナビゲーションバーを備えたiPhoneアプリを作成しています。特定の時点で、DetailsViewControllerクラスのインスタンスをNavigation Controllerスタックにプッシュして表示しています。
このコントローラーはコード内でビュー階層を作成します:コントローラーの view
プロパティはUIScrollViewに設定されます。UIScrollViewには、すべてのコンテンツを保持できるサイズのプレーンなUIView(示される。このcontentViewの下部には、4つのUIButtonがあります。
(現在のシミュレーターで)アプリを実行し、ビューの下部までスクロールすると、上部の2つのボタンがタッチに反応します。 3番目のボタンは上部のタッチにのみ反応し、下部のボタンはタッチにまったく反応しません。 3番目のボタンのさまざまな部分をクリックすると、スクロールビューの下部の93ピクセルがタッチイベントをサブビューに渡していないように見えます。
93は疑わしい:タブバー(49ピクセル)とナビゲーションバー(44ピクセル)の合計の高さでもあります。ただし、ナビゲーションバーとタブバーはスクロールビューの外側にあります。なぜこれが起こっているのでしょうか?
問題のコードは次のとおりです。
- (void)loadView
{
CGRect frame = [[UIScreen mainScreen] applicationFrame];
UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:frame];
scrollView.autoresizingMask = (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight);
scrollView.delegate = self;
self.view = scrollView;
UIView *contentView = [[UIView alloc] initWithFrame:scrollView.bounds];
contentView.autoresizingMask = (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight);
[scrollView addSubview:contentView];
CGSize viewSize = contentView.bounds.size;
CGSize size;
CGFloat y = 0;
/* Snip creating various labels and image views */
/* Actions view creates and lays out the four buttons; its sizeThatFits:
** method returns the frame size to contain the buttons */
actionsView = [[PropertyDetailActionsView alloc] initWithFrame:CGRectZero];
actionsView.autoresizingMask = (UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleWidth);
actionsView.delegate = self;
size = [actionsView sizeThatFits:viewSize];
actionsView.frame = CGRectMake(0, y, size.width, size.height);
[contentView addSubview:actionsView];
y += size.height;
[contentView setFrame:CGRectMake(0, 0, viewSize.width, y)];
scrollView.contentSize = contentView.frame.size;
[contentView release];
[scrollView release];
}
解決
昨日Twitterで提案したように、actionsViewに設定された柔軟な下余白と関係があるかもしれません。
この提案は問題を解決しませんでしたが、正しい方向に導きました。 contentViewの柔軟な高さを削除することで、問題が修正されました。
だから誰かが同様の問題を抱えているなら、autoresizingMasksで遊んでみてください。