Zack Shapiro
Zack Shapiro

Reputation: 6998

Detecting UIButton tap for button inside of tappable view

I have a container view with a button over it which hides and shows the view. Within the shown view, there are N number of mini buttons that have actions.

The problem I'm having is, when I tap on the mini buttons, those targets are ignored and the larger view button is what receives the action.

How do I configure things so that the larger tappable button on the view still works in most places but where the mini buttons exist, those tap actions register as well?

Thanks!

Upvotes: 1

Views: 1194

Answers (3)

Miles
Miles

Reputation: 574

This is an old question but there actually is a simple solution, by overriding hitTest(_ point: CGPoint, with event: UIEvent?).

Inside your outer button:

override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
    if self.innerButton.frame.contains(point) {
        return self.innerButton
    }
    else if self.bounds.contains(point) {
        return self
    }
    else {
        return super.hitTest(point, with: event)
    }
}

It tests to see if the touch point is within the inner button (or you could have several inner buttons), if so it returns it and the touch is registered only by the inner button, if not it goes to the outer view. If neither view contains it, it calls super so the touch is handled correctly by other views.

Upvotes: 0

iOS Geek
iOS Geek

Reputation: 4855

Its not merely possible to get button action working within a button as

1) Adding a button [Large button] on ContainerView will cause always to detect Large button action and will not allow you to detect button inside it

2) If seen in case of layers large button layer is on top So Logically always large button will first come in Action not inside View of containerView

Possible Solutions :

1) try to make use of gestures on ContainerView

2) you can use a segmented control as show and hide or a UIButton that is placed on side of containerView not over it So you will be able to perform all the required Actions

Upvotes: 0

Jaydeep Vyas
Jaydeep Vyas

Reputation: 4470

There are two possible solution First

Change view hierarchy of uibutton (large on top of the stack in interface builder)

Like

-Largebutton

-minibutton1

-minibutton1

' '

-minibuttonn

Second one

Use gesture on the conainer view like

    let hideViewGesture = UITapGestureRecognizer(target: self, action: "hideView")

    containerView.addGestureRecognizer(hideViewGesture)


func hideView() {
    containerView.isHidden = true
}

Upvotes: 1

Related Questions