セグメント化されたコントロール、 UIImageView などのいくつかのコントロールを含む UITableView のカスタム セクション ヘッダーを作成しました。正常に表示されますが、タップできないため、コントロールを操作できません。
このヘッダー ビューを選択可能にするにはどうすればよいですか?
セグメント化されたコントロール、 UIImageView などのいくつかのコントロールを含む UITableView のカスタム セクション ヘッダーを作成しました。正常に表示されますが、タップできないため、コントロールを操作できません。
このヘッダー ビューを選択可能にするにはどうすればよいですか?
UITableViewDelegateでそれを行う方法はありません。
UITapGestureRecognizer を yourHeaderView に追加する必要があります。
UITapGestureRecognizer *singleTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(gestureHandler:)];
[singleTapRecognizer setDelegate:self];
singleTapRecognizer.numberOfTouchesRequired = 1;
singleTapRecognizer.numberOfTapsRequired = 1;
[yourHeaderView addGestureRecognizer:singleTapRecognizer];
-(void) handleGesture:(UIGestureRecognizer *)gestureRecognizer; //do in this method whatever you want
スイフト 3.0 の場合
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(YOURVIEWCONTROLLER.TapGestureRecognizer(_:)))
yourHeaderView.addGestureRecognizer(tapGesture)
func TapGestureRecognizer(gestureRecognizer: UIGestureRecognizer) {
//do your stuff here
}
スウィフト >= 4.0
継承されたUIGestureRecognizerDelegate クラス参照を追加
let tap = UITapGestureRecognizer(target: self, action:#selector(self.handleTap(_:)))
tap.delegate = self
self.view.addGestureRecognizer(tap)
@objc func handleTap(_ sender: UITapGestureRecognizer) {
//Do your work
}
役立つかもしれません。
ハッピーコーディング。
これが私のために働いたものです:
override func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
let v = UITableViewHeaderFooterView()
v.textLabel?.text = "Header Text"
let tapRecognizer = UITapGestureRecognizer(target: self, action: #selector(handleTap))
tapRecognizer.delegate = self
tapRecognizer.numberOfTapsRequired = 1
tapRecognizer.numberOfTouchesRequired = 1
v.addGestureRecognizer(tapRecognizer)
return v
}
func handleTap(gestureRecognizer: UIGestureRecognizer)
{
print("Tapped")
}
UIButton をヘッダー ビューに追加するだけです (または、ヘッダー ビューを UIButton 自体にすることもできます)。
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section{
static NSString *cellIdentifier = @"cellIdentifier";
UITableViewCell *cell = (UITableViewCell*)[tableView dequeueReusableCellWithIdentifier:cellIdentifier];
UIButton *cellButton = (UIButton*)[cell viewWithTag:1];
[cellButton addTarget:self action:@selector(premiumSectionClicked:) forControlEvents:UIControlEventTouchUpInside];
return cell;
}
-(void)buttonTapped:(id)sender{
}
これに対する迅速な解決策:
let tapR : UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "gotoHeaderArticle")
tapR.delegate = self
tapR.numberOfTapsRequired = 1
tapR.numberOfTouchesRequired = 1
yourView.addGestureRecognizer(tapR)
次に実装
func gotoHeaderArticle() {
}
呼び出し元のビューコントローラーが UIGestureRecognizerDelegate に準拠していることを確認してください
Swift での私の実装:
あなたのUITableViewController
:
let myView = MyView()
let tapRecognizer = UITapGestureRecognizer(target: myView, action: "handleTap")
myView.addGestureRecognizer(tapRecognizer)
self.tableView.tableHeaderView = myView
でMyView
:
class MyView: UIView {
func handleTap() {
// Handle touch event here
}
}
テーブルビューに複数のセクションがある場合に機能するソリューションが必要な場合、私は同じ問題を抱えていました。私が思いついた解決策はviewForHeaderInSection
、セクションに基づいてメソッドのボタンに異なるターゲットを作成することでした。ボタンを使用していますが、これは UITapGestureRecognizer でも同様に機能するはずです
func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
// ...
if section == 0 {
cell.button.addTarget(self, action: #selector(firstSectionTapped(_:)), for: .touchUpInside)
} else if section == 1 {
cell.button.addTarget(self, action: #selector(secondSectionTapped(_:)), for: .touchUpInside)
}
// ...
}
次に、ViewController で:
@objc func goalCategoryTapped(_ sender: UITapGestureRecognizer?) {
print("Section One Tapped")
}
@objc func ideaCategoryTapped(_ sender: UITapGestureRecognizer?) {
print("Section Two Tapped")
}