2010-01-13 3 views
10

Мое приложение имеет две перекрывающиеся UIButtons. Верхняя кнопка может быть отключена время от времени. Однако в этом случае любые полученные сенсорные события, похоже, передаются в основное представление, которое в моем случае является другой кнопкой.Предотвращение отключения UIButton от распространенных событий касания

Мне нужна верхняя кнопка, перехватывающая все касания и не позволяющая им добраться до нижней кнопки, даже в отключенном состоянии (я был бы счастлив, даже если это вызванное действие вызывается в отключенном состоянии).

До сих пор я пытался:

[topButton setUserInteractionEnabled:YES]; 

и

[topButton setExclusiveTouch:YES]; 

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

ответ

1

Создайте подкласс кнопки, а затем переопределить эти методы так, чтобы кнопка будет перехватывать события, но игнорировать их, если какое-то свойство кнопки установлено значение NO:

touchesBegan:withEvent: 
touchesCancelled:withEvent: 
touchesEnded:withEvent: 
touchesMoved:withEvent: 

Эти методы UIResponder.

Попросите их просто вызвать свой метод [super ...], если вы хотите обработать событие, иначе просто не вызывайте его и не возвращайте, если хотите, чтобы события «съели».

см Также в этом в случае, если это необходимо: Observing pinch multi-touch gestures in a UITableView

+0

Похоже, что эти методы не вызываются вообще, когда кнопка отключена. –

+0

Да, это то, что я понял (вот почему я сказал «какое-то свойство»), поэтому вам может понадобиться либо использовать второй метод, либо сделать что-то другое, кроме как отключить кнопку, например, имитировать ее как-то отключить. Второй метод, вероятно, будет больно, поскольку UIApplication (который вызывает sendEvent в окне), вероятно, является тем, что игнорирует отключенные UIControls. – Nimrod

2

То, что я сделал это размещая UIImageView того же размера с UIButton только под UIButton. Тогда даже если вы отключите UIButton, события касания не распространяют UIImageView.

+0

Это на самом деле самое простое и быстрое решение. – codingFriend1

13

я добавил следующий метод для надтаблицы кнопки инвалидов:

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event 
{ 
    if (!self.watchButton.enabled && 
     [self.watchButton pointInside:[self convertPoint:point toView:self.watchButton] 
          withEvent:nil]) { 
     return nil; 
    } 
    return [super hitTest:point withEvent:event]; 
} 

Это хорошо работает с UITableView клеток.

1

Мне удалось получить эту работу, как мне было нужно, с измененной версией ответа @kolyuchiy. Я перепробовал метод hitTest:withEvent: в моем подклассе UIButton, возвращая self, когда он отключен, и точка находится в кадре представления, так что прикосновение потребляется, но обработка события кнопки не вызывается.

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event 
{ 
    if (!self.enabled && [self pointInside:[self convertPoint:point toView:self] withEvent:event]) 
    { 
     return self; 
    } 
    return [super hitTest:point withEvent:event]; 
} 
2

После попытки @kolyuchiy (что требует изменить UIButton поведение вне ее сферы) и @ PATRICK-Линча (который просто не работал для меня) решения пришли с более элегантной, который относится к подклассу UIButton :

private static let dummyView: UIView = { 
    let view = UIView(frame: .zero) 
    view.userInteractionEnabled = true 
    return view 
}() 

public override func hitTest(point: CGPoint, withEvent event: UIEvent?) -> UIView? { 
    if !enabled && pointInside(point, withEvent: event) { 
     return self.dynamicType.dummyView 
    } 
    return super.hitTest(point, withEvent: event) 
} 
+1

. Голосовать за view.userInteractionEnabled = true. – iwill