2016-09-13 4 views
1

сказать, у меня есть кнопка, лежащий под UITableView, как я могу нажать на кнопку через UITableViewCell, но не вызвать событие ячейки, нажмите:Как нажать на кнопку, лежащую ниже UITableView

enter image description here

Причина Я поставил кнопку за столом, так что хочу видеть и нажимать кнопку под ячейкой, чей цвет установлен на четкость, а когда я прокручиваю таблицу, кнопка может быть закрыта ячейкой, которая не имеет четкого цвета.

+0

довести кнопку над Tableview является простым способом, почему бы и нет? – Tj3n

+0

Язык ObjC или Swift? –

+0

@ Tj3n причина немного сложная, но я должен сделать вот так: – itenyh

ответ

2

Я создал образец проекта и получил это работает:

override func viewDidLoad() { 
    super.viewDidLoad() 

    // Do any additional setup after loading the view. 

    let tap = UITapGestureRecognizer(target: self, action: #selector(TableViewVC.handleTap)) 
    tap.numberOfTapsRequired = 1 
    self.view.addGestureRecognizer(tap) 
} 

func handleTap(touch: UITapGestureRecognizer) { 
    let touchPoint = touch.locationInView(self.view) 
    let isPointInFrame = CGRectContainsPoint(button.frame, touchPoint) 

    print(isPointInFrame) 

    if isPointInFrame == true { 
     print("button pressed") 
    } 
} 

Для проверки кнопки действительно нажата, мы должны использовать длинный водопроводную жест:

override func viewDidLoad() { 
    super.viewDidLoad() 

    // Do any additional setup after loading the view. 

    let tap = UILongPressGestureRecognizer(target: self, action: #selector(TableViewVC.handleTap)) 
    tap.minimumPressDuration = 0.01 
    self.view.addGestureRecognizer(tap) 
} 


func handleTap(touch: UILongPressGestureRecognizer) { 
    let touchPoint = touch.locationInView(self.view) 

    print(" pressed") 
    if touch.state == .Began { 
     let isPointInFrame = CGRectContainsPoint(button.frame, touchPoint) 
     print(isPointInFrame) 

     if isPointInFrame == true { 
      print("button pressed") 
      button.backgroundColor = UIColor.lightGrayColor() 
     } 
    }else if touch.state == .Ended { 

     button.backgroundColor = UIColor.whiteColor() 
    } 
} 
+0

Возможно ли, чтобы кнопка выглядела как «действительно» нажата? – itenyh

+0

нет невозможно !! для этого ваша кнопка должна быть сверху не под таблицей – Lion

+0

Да, с каким-то взломом! Проверьте обновленный ответ. –

2

Получить точку касания на главном экране. Затем используйте следующий метод для проверки точки касания внутри рамки кнопки или нет.

bool CGRectContainsPoint(CGRect rect, CGPoint point) 
+0

Это одна из идей, но вы должны поместить его в 'touchhesBegan' или что-то еще, и после проверки отправьте действие программно с помощью' button.sendActionsForControlEvents' – Tj3n

+0

Да, вы правы @ Tj3n – Sujit

1

Вы можете написать ваш пользовательский вид на сенсорную кнопку или специальный вид за верхним окном

class MyView: UIView { 

    override func hitTest(point: CGPoint, withEvent event: UIEvent?) -> UIView? { 
     for subview in self.subviews { 
      if subview is UIButton { 
       let subviewPoint = self.convertPoint(point, toView: subview) 
       if subview.hitTest(subviewPoint, withEvent: event) != nil { // if touch inside button view, return button to handle event 
        return subview 
       } 
      } 
     } 
     // if not inside button return nomal action 
     return super.hitTest(point, withEvent: event) 
    } 
} 

Затем установите вид контроллера для пользовательского класса MyView

enter image description here

+0

Спасибо, это ответ, который я хочу ~ – itenyh

Смежные вопросы