简体   繁体   中英

My UIView has a UIButton as one of it's subviews but not responding to events in objective-c

Here is my code. It has started to look crowded after an hour or 2 of trying to solve this issue. I've tried setting user interaction enabled to yes, I've tried just using a button alone and not making it the subview of another view.

Right now I have filterBar > filterBarContainer > filterButton.

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    self.navigationController.navigationBar.userInteractionEnabled = YES;
    self.view.userInteractionEnabled = YES;
    // Create filter bar with specified dimensions
    UIView *filterBar = [[UIView alloc] initWithFrame:CGRectMake(0, 42, self.view.frame.size.width, self.navigationController.navigationBar.frame.size.height)];
    [filterBar setUserInteractionEnabled:YES];

    // Make it a subview of navigation controller
    [[[self navigationController] navigationBar] addSubview:filterBar];
    [filterBar setBackgroundColor:[[UIColor whiteColor] colorWithAlphaComponent:0.9f]];
    [filterBar setTag:1];

    // Reusable vars
    // CGFloat filterBarX = filterBar.frame.origin.x;
    //CGFloat filterBarY = filterBar.frame.origin.y;
    CGFloat filterBarHeight = filterBar.frame.size.height;
    CGFloat filterBarWidth = filterBar.frame.size.width;

    // Create centre filter button with specified dimensions
    UIView *filterButtonContainer = [[UIView alloc] initWithFrame:CGRectMake(0, 2, filterBarWidth / 2 - 30 , filterBarHeight - 10)];
        [filterButtonContainer setUserInteractionEnabled:YES];

    // Make it a subview of filter bar
    [filterBar addSubview:filterButtonContainer];
    [filterButtonContainer setBackgroundColor:[UIColor redColor]];

    // Centre the button
    [filterButtonContainer setCenter:[filterBar convertPoint:filterBar.center fromView:filterBar.superview]];

     // Add button to filter button
    UIButton *filterButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [filterButton setUserInteractionEnabled: YES];
    [filterButton setFrame:CGRectMake(0, 0,40 , 20)];
    [filterButton setTitle:@"test" forState:UIControlStateNormal];
    [filterButtonContainer addSubview:filterButton];
    [filterButton setBackgroundColor:[UIColor yellowColor]];
   // self.filterButton = filterButton;
    [filterButton addTarget:self action:@selector(filterButtonTapped:) forControlEvents:UIControlEventTouchUpInside];
    NSLog(@"dd");
    filterButtonContainer.layer.borderColor = [UIColor blackColor].CGColor;
    filterButtonContainer.layer.borderWidth = 1;

This is the method I'm trying to trigger.

- (void)filterButtonTapped:(UIButton *)sender
{
    NSLog(@"filter button tapped");
    UIActionSheet *filterOptions = [[UIActionSheet alloc] initWithTitle:@"Filter Garments"
                                                              delegate:self
                                                     cancelButtonTitle:@"Cancel"
                                                destructiveButtonTitle:nil
                                                      otherButtonTitles:@"Recommended", @"What's New", @"Price - High to Low", @"Price - Low to High", nil];
    [filterOptions showInView:self.collectionView];

}

Most likely one of your parent views (superviews of your button) have a width or height that places the filter button outside of their area. The button is still displayed (if you don't define that the view should cut off subviews), but elements outside the view's area will not get any touch events. Check your superview's width and height.

You're adding filterBar as a subview of your navigationBar , but you're setting it's y-origin within navigationBar to 42. And then you're setting your filterButtonContainer 's y-origin within the filterBar to 2. Assuming navigationBar 's height is 44, most of the filterBar and the entirety of your filterButtonContainer and filterButton won't be within their navigationBar superview so the button wouldn't be selectable.

Edit: To make it selectable while keeping the positioning intact, I suggest adding the filter bar to self.view . For example, change:

[[[self navigationController] navigationBar] addSubview:filterBar];

to

[self.view addSubview:filterBar];

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