Bir UITableView'ın başlık bölümüne ne musluğun yapıldığını nasıl bilebilirim?

Bazen bir başlık bölümüm var (sadece bir bölümüm olduğu gibi). Aşağıdakine benzer bir jest (tek dokunuşla) ekledim:

let singleTap = UIShortTapGestureRecognizer(target: self, action: "singleTap:")
singleTap.numberOfTapsRequired = 1
singleTap.numberOfTouchesRequired = 1
tableView.headerViewForSection(0)?.addGestureRecognizer(singleTap)

İşe yarıyor. Sorun şu ki, tableView'im sadece birkaç satır olduğunda, son satırın altına (boş bir alana) dokunursam, hareketi de tetikler.

Nasıl engellenir? Musluğun konumunun başlığın sınırları dahilinde olup olmadığını kontrol etmenin bir yolu olduğunu düşünüyordum ama nasıl yapacağımı bilmiyorum.

Normal bir satır için kolaydır, sadece tableView.indexPathForRowAtPoint (point: CGPoint) 'i kullanıyorum ama peki bir başlık için?

DÜZENLEME:

tableView.headerViewForSection (0) çağırdığımda bir şey almak için başlığımı kaydetmem gerekiyor gibi görünüyor, ancak sorun başlığımın değil, UIView olması UITableViewHeaderFooterView veya UITableViewCell böylece kaydedemem (sanırım ...).

Şimdiye kadar çalışıyordu çünkü jestleri masa görünümüne de ekledim.

Bu yüzden jest bütün tablo görünümüne eklendiğinden, bu görünümden hareketi görüntülediğimde, tabloyu değil başlık görünümünü alırım.

Yaptığım şey, başlığını kendi etiketini kullanarak tableView'dan almak:

let header = tableView.viewWithTag(Tag.Header.rawValue)

ve sonra başlık görünümünün içindeyse, musluğun konumunu kontrol edin:

let location = sender.locationInView(sender.view)
if header!.pointInside(location, withEvent: nil) { ... }
3

7 cevap

JestRecognizer'ı viewController'in ana görünümüne (tableView) ayarlamak ve jestRecognizer'ın jest eylemindeki izlenen görünümü algılamak için daha iyi bir yaklaşım olabilir:

{
    let singleTap = UIShortTapGestureRecognizer(target: self, action: "singleTap:")
    singleTap.numberOfTapsRequired = 1
    singleTap.numberOfTouchesRequired = 1
    tableView.addGestureRecognizer(singleTap) //<--
}
...

@IBAction func singleTap(tapGestureRecognizer: UIShortTapGestureRecognizer) {
   //detect the tapped view
    var loc = tapGestureRecognizer.locationInView(self.tableView)

    if (CGRectContainsPoint(tableView.headerViewForSection(0)?.frame, loc)) {
       //header was tapped
        ...
    }
}
5
katma
Düzenlememde açıkladığım gibi, başlığımı almak dışında yolumu kullandım, kaydetmem gerekiyor ama yapamıyorum.
katma yazar Nico, kaynak

JestRecognizer'ı viewController'in ana görünümüne (tableView) ayarlamak ve jestRecognizer'ın jest eylemindeki izlenen görünümü algılamak için daha iyi bir yaklaşım olabilir:

{
    let singleTap = UIShortTapGestureRecognizer(target: self, action: "singleTap:")
    singleTap.numberOfTapsRequired = 1
    singleTap.numberOfTouchesRequired = 1
    tableView.addGestureRecognizer(singleTap) //<--
}
...

@IBAction func singleTap(tapGestureRecognizer: UIShortTapGestureRecognizer) {
   //detect the tapped view
    var loc = tapGestureRecognizer.locationInView(self.tableView)

    if (CGRectContainsPoint(tableView.headerViewForSection(0)?.frame, loc)) {
       //header was tapped
        ...
    }
}
5
katma
Düzenlememde açıkladığım gibi, başlığımı almak dışında yolumu kullandım, kaydetmem gerekiyor ama yapamıyorum.
katma yazar Nico, kaynak

JestRecognizer'ı viewController'in ana görünümüne (tableView) ayarlamak ve jestRecognizer'ın jest eylemindeki izlenen görünümü algılamak için daha iyi bir yaklaşım olabilir:

{
    let singleTap = UIShortTapGestureRecognizer(target: self, action: "singleTap:")
    singleTap.numberOfTapsRequired = 1
    singleTap.numberOfTouchesRequired = 1
    tableView.addGestureRecognizer(singleTap) //<--
}
...

@IBAction func singleTap(tapGestureRecognizer: UIShortTapGestureRecognizer) {
   //detect the tapped view
    var loc = tapGestureRecognizer.locationInView(self.tableView)

    if (CGRectContainsPoint(tableView.headerViewForSection(0)?.frame, loc)) {
       //header was tapped
        ...
    }
}
5
katma
Düzenlememde açıkladığım gibi, başlığımı almak dışında yolumu kullandım, kaydetmem gerekiyor ama yapamıyorum.
katma yazar Nico, kaynak

Bunu yapmanın kolay bir yolu, dinleyiciyi tablo size bildirdiğinde ( UITableViewDelegate aracılığıyla) bir başlık göstermek üzere:

override func tableView(tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
    let singleTap =//setup gesture

   //Add gesture to already created header
    view.addGestureRecognizer(singleTap)
}

O zaman seçici işlevini ayarlayabilirsiniz:

func singleTap(gesture: UITapGestureRecognizer) {
    let headerView = gesture.view
   //Do something with header view
}
3
katma
Ah, anladım. Eğer daha fazla sorun yaşarsan bize bildir, ama anladığına sevindim!
katma yazar Firo, kaynak
Benim durumumda sorun, bütün tableView için aynı hareketi kullanıyorum, bu yüzden jest.view etiketinin bir headerView olup olmadığını bulamadım (ya da belki headerView için global bir değişken kullanarak)
katma yazar Nico, kaynak

Bunu yapmanın kolay bir yolu, dinleyiciyi tablo size bildirdiğinde ( UITableViewDelegate aracılığıyla) bir başlık göstermek üzere:

override func tableView(tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
    let singleTap =//setup gesture

   //Add gesture to already created header
    view.addGestureRecognizer(singleTap)
}

O zaman seçici işlevini ayarlayabilirsiniz:

func singleTap(gesture: UITapGestureRecognizer) {
    let headerView = gesture.view
   //Do something with header view
}
3
katma
Ah, anladım. Eğer daha fazla sorun yaşarsan bize bildir, ama anladığına sevindim!
katma yazar Firo, kaynak
Benim durumumda sorun, bütün tableView için aynı hareketi kullanıyorum, bu yüzden jest.view etiketinin bir headerView olup olmadığını bulamadım (ya da belki headerView için global bir değişken kullanarak)
katma yazar Nico, kaynak

Bunu yapmanın kolay bir yolu, dinleyiciyi tablo size bildirdiğinde ( UITableViewDelegate aracılığıyla) bir başlık göstermek üzere:

override func tableView(tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
    let singleTap =//setup gesture

   //Add gesture to already created header
    view.addGestureRecognizer(singleTap)
}

O zaman seçici işlevini ayarlayabilirsiniz:

func singleTap(gesture: UITapGestureRecognizer) {
    let headerView = gesture.view
   //Do something with header view
}
3
katma
Ah, anladım. Eğer daha fazla sorun yaşarsan bize bildir, ama anladığına sevindim!
katma yazar Firo, kaynak
Benim durumumda sorun, bütün tableView için aynı hareketi kullanıyorum, bu yüzden jest.view etiketinin bir headerView olup olmadığını bulamadım (ya da belki headerView için global bir değişken kullanarak)
katma yazar Nico, kaynak

HeaderView için Etiket eklemeye çalışın.

-(void) selectheader:(UITapGestureRecognizer *)gestureRecognizer{
    UIView *headerView = gestureRecognizer.view;
      if (headerView.tag) {

       }
}

Ve

-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
    UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, tableView.frame.size.width, 18)];
    view.tag = section;
//add your gesture 
    return view;
}
2
katma
Nasıl? HeaderView'a etiketi eklemek demek istiyorum, ancak UITapGestureRecognizer ile eşleşmesi nasıl olur, çünkü bunun etiketi yoktur?
katma yazar Nico, kaynak
Başlığım kaydedilemediği için bu şekilde çalışamamıştır (güncellememde açıklandığı gibi). Ama etiket fikri için teşekkürler
katma yazar Nico, kaynak