简体   繁体   中英

Why do these Auto Layout constraints for a UIView prevent UIButton subviews from receiving touch events?

I'm using auto layout, programmatically. I've got a simple UIViewController with a few controls, including two UIButton s arranged side-by-side. I often group related controls within a UIView , to act as a container, making the arrangement of groups-of-controls a bit easier to manage. You'll see that below with _iapButtonsView , which holds the two buttons and some spacers.

My question . In the following example, I was caught out by what I thought was a valid change to the constraints, that actually resulted in the UIButton s not receiving touch events.

Code extract - constraints in which the buttons do receive touch events:

- (void)viewDidLoad
{
    [super viewDidLoad];

    ...

    _buyButton = [ViewCreationHelper createRoundedBorderButtonBold];
    [_buyButton addTarget:self action:@selector(buyTap:) forControlEvents:UIControlEventTouchUpInside];

    _restoreButton = [ViewCreationHelper createRoundedBorderButton];
    [_restoreButton addTarget:self action:@selector(restorePurchaseTap:) forControlEvents:UIControlEventTouchUpInside];

    _iapButtonsView = [UIView new];
    _iapButtonsView.translatesAutoresizingMaskIntoConstraints = NO;
    [contentView addSubview:_iapButtonsView];

    ...

    [_iapButtonsView addSubview:_buyButton];
    [_iapButtonsView addSubview:_restoreButton];

    // Constraints
    NSDictionary* views = NSDictionaryOfVariableBindings(scrollView, contentView, iapDesciption, _iapButtonsView, _buyButton, _restoreButton, spacer1, spacer2, spacer3);

    ...

    constraints = [NSLayoutConstraint
                   constraintsWithVisualFormat:@"V:|-25-[iapDesciption]-40-[_iapButtonsView]|"
                   options:0
                   metrics:nil
                   views:views];

    [contentView addConstraints:constraints];

    constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-20-[_iapButtonsView]-20-|" options:0 metrics:nil views:views];
    [contentView addConstraints:constraints];

    constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[spacer1][_buyButton(==120.0)][spacer2(==spacer1)][_restoreButton(==_buyButton)][spacer3(==spacer1)]|" options:NSLayoutFormatAlignAllCenterY metrics:nil views:views];
    [_iapButtonsView addConstraints:constraints];

    constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|[_buyButton(==80.0)]|" options:0 metrics:nil views:views];
    [_iapButtonsView addConstraints:constraints];

    constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|[_restoreButton(==80.0)]|" options:0 metrics:nil views:views];
    [_iapButtonsView addConstraints:constraints];

    ...
}

The constraints in question are the vertical constraints for _iapButtonsView . During development (this is an In-App Purchase screen) I had some debug controls at the bottom, which is why I had the trailing | connecting to the superview's bottom edge, like this:

constraintsWithVisualFormat:@"V:|-25-[iapDesciption]-40-[_iapButtonsView][someSpacer][someControls]|"

When I took those debug controls out, I changed those constraints to be:

constraintsWithVisualFormat:@"V:|-25-[iapDesciption]-40-[_iapButtonsView]"

thinking that was more correct: they're anchored from the top, only, the _iapButtonsView gets its size from its subviews (principally, the two buttons), so I shouldn't connect to the bottom edge of the superview ...

With that change, the buttons no longer receive touch events. To experiment, I tried explicitly setting the vertical size of _iapButtonsView , but still not connecting to the bottom edge of the superview, eg

constraintsWithVisualFormat:@"V:|-25-[iapDesciption]-40-[_iapButtonsView(==80.0)]"

With those constraints, the buttons still do not receive touch events.

What am I not understanding?

(Edit: I removed the duplicated [contentView addSubview:_iapButtonsView]; in the code, above, per suggestion from daddy warbucks )

One issue, you've called this two times:

[contentView addSubview:_iapButtonsView];

Not sure if this helps, but it could be an issue.

Also, you don't have to use "(==80.0)", just use "(80.0)", or even "(80)" not sure if this helps, but hey, it could, right?

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM