2012-03-01 7 views
1

headerViewがあります。デフォルトの状態は折りたたまれています。UIControlのフレームを設定すると、ビューの境界が変更されますが、タッチが届く場所は変更されません。

次のコードを使用してheaderViewを展開します。

if (!self.headerViewIsExpanded) { 
    [UIView beginAnimations:nil context:nil]; 
    [UIView setAnimationDuration:0.5]; 
    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; 
    [self.collapsedHeaderView removeFromSuperview]; 
    self.headerView.frame = self.expandedHeaderView.frame; 
    [self.headerView addSubview:self.expandedHeaderView]; 

    self.tableView.frame = CGRectMake(self.tableView.frame.origin.x, self.tableView.frame.origin.y + offset, self.tableView.frame.size.width, self.tableView.frame.size.height - offset); 

    [UIView commitAnimations]; 
    self.headerViewIsExpanded = YES; 
} 

正しくビューフレームを展開し、tableViewフレームを縮小します。しかし、元のUIControlの受け取り領域を拡大することができないため、元のフレームがどこにあるかを押すだけで折りたたむことができます。

この問題を解決するにはどうすればよいですか?

EDIT:または、私は問題を解決できない理由、または少なくとも安全に解決していない理由を説明した回答を受け入れます。

編集1:より明確にするため、headerViewは、tableViewヘッダービューではありません。それはちょうどheaderViewと呼ばれることがあるテーブルの上に座っている単なるビューです。 headerViewtableViewは、利用可能なウィンドウにまたがるメインUIViewのサブビューです。

答えて

0

layoutSubviewsメソッドをオーバーロードしようとすることができます。内部では、headerViewにsetFrameメソッドを使用して、すべてのビュー要素の位置を定義する必要があります。

+0

なぜ「layoutSubviews」をオーバーライドする必要がありますか?これは動詞ではありませんか? –

+0

このメソッドは、UIViewが ' - (void)layoutIfNeeded'を呼び出すときに呼び出されます。いくつかのイベント中にサブビューの位置を再定義します。例として、私はstandart textLabelを別のフレームのUITableViewセルに配置し、セル内にUITableViewを追加するためにこのメソッドを使用しています...しかし、tableView reloadDataの後にheightForHeaderInSectionメソッドを使用すると同じ効果が得られると思います。 – kokoko

+0

私はそれをより明確にすべきでした... 'headerView'は' tableView'の外にあります。 'headerView'と呼ばれるようになった、普通の古い' UIControl'です。 tableViewには 'headerForSection:'は定義されていません。これは本当に 'UIControl'に関する単なる質問です。 –

関連する問題