2017-09-16 16 views
0

ラベルやボタンがたくさんある非常に背の高いUITableViewCellがあります。ラベル/ボタンで覆われていない特定の領域(大体右上の1/4)が必要ですセルの選択状態をトリガーするものになります(そこにチェックボックスがあり、ユーザーには非常に明確になります)。私はデフォルトのUITableViewCell選択を使用したいと思います。サブビューの背景などを処理するときに、セル全体を薄い青色で表示するにはセルのタップ状態が必要です。UITableViewCellの特定の領域のみをトリガーするセルを選択する

私はラベルとボタンの背後に何もしない領域を「マスク」するための大きなボタンを配置しようとしましたが、実際にはボタン自体をタップしているところで動作しますが、その背後にボタンがあると、セルはそのタップを消費し、セルがハイライト表示されます。タップは奇妙な中間のボタンには行かない。

タップをインターセプトして、特定の領域内でのみテーブルビューにそのタップが表示され、セルのハイライトがトリガーされることを確認できますか?

+0

あなたが選択= .noneを使用し、自分でセル内の選択を扱う、しようとしましたか? –

+0

@ReinierMelianはい、言及したように、テーブルビューのデフォルト選択を使用する必要があります。これはすべてのサブビューを繰り返し、ラベルの背景をクリアしてセルの選択ビューを表示します。 – Sencha

+0

私の答えをチェックし、それを試してみて@Senchaを教えてください –

答えて

0

あなたが選択アクションテイク場所が必要部分にUIButtonを使用して、あなたのセルにこの実装を追加する場合は、

サンプルコード

import UIKit 

class OnlySelectablePartTableViewCell: UITableViewCell { 

    override func awakeFromNib() { 
     super.awakeFromNib() 
     // Initialization code 
    } 
    //Action linked to the button for valid selection part of your cell 
    @IBAction func selectionAction(_ sender: Any) { 
     self.selectionStyle = .blue 
     self.setSelected(!self.isSelected, animated: true) 
    } 

    override func setSelected(_ selected: Bool, animated: Bool) { 
     super.setSelected(selected, animated: animated) 
     if(!selected) 
     { 
      self.selectionStyle = .none 
     } 
     // Configure the view for the selected state 
    } 

} 
+0

@Sencha最後に私の答えをテストしましたか?フィードバックをお願いします –

0

はのような音必要として働かなければなりませんセル内の特定のビューをタップすると[UITableViewDelegate tableView:didSelectRowAtIndexPath:]が呼び出されるのを避けたいとします。あなたのUITableViewCellサブクラスで[UIView hitTest:withEvent:]を無効にすることで、これを達成することをお勧めします。 [UIView hitTest:withEvent:]のデフォルトの戻り値は、現在のビュー最も遠い子孫であり、点を含む

ビューオブジェクトに従うと定義されます。ポイントが受信者のビュー階層の外部にある場合はnilを返します。

ので、それをオーバーライドし、代わりにUITableViewCellインスタンスの代替UIViewインスタンス(あなたのサブビューのインスタンス)を返すことによって、我々はTableViewControllerはあなたがUITableViewCellインスタンス以外の何か他のものまであることを信じることができます。

例は以下のようになります(私はスウィフトの非常に限られた知識をしました私のapplogies。。):

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { 
    // suppose you put all your subviews in contentView 
    for (UIView *subview in self.contentView) { 
     // translates the point relative to the subviews coordinate system. 
     CGPoint convertedPoint = [self convertPoint:point toView:subview]; 
     // returns the subview instance if the touch happens inside the subview. 
     if (CGRectContainsPoint(subview.bounds, convertedPoint)) { 
      return subview; 
     } 
    } 
    // call the super's implementation if you find the touch didn't hit any sub view 
    return [super hitTest:point withEvent:event]; 
} 
関連する問題