我的 UIView 有一个 UIButton 作为它的子视图之一,但不响应 Objective-c 中的事件

Posted

技术标签:

【中文标题】我的 UIView 有一个 UIButton 作为它的子视图之一,但不响应 Objective-c 中的事件【英文标题】:My UIView has a UIButton as one of it's subviews but not responding to events in objective-c 【发布时间】:2014-04-11 10:20:25 【问题描述】:

这是我的代码。在尝试解决此问题一两个小时后,它开始显得拥挤。我尝试将启用用户交互设置为是,我尝试仅使用一个按钮而不是使其成为另一个视图的子视图。

现在我有 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;

这是我试图触发的方法。

- (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];


【问题讨论】:

在 filterButtonTapped Action 更改 - 用 self.view 替换 self.collectionView 即 [filterOptions showInView:self.view]; 是的,意识到这是错误的,所以放一条 NSLog 消息来查看该操作是否正在触发,但没有运气。 【参考方案1】:

您的父视图(按钮的超级视图)很可能有一个widthheight,将过滤器按钮放置在其区域之外。该按钮仍会显示(如果您没有定义视图应切断子视图),但视图区域之外的元素将不会获得任何触摸事件。检查你的 superview 的宽度和高度。

【讨论】:

这就是问题所在。我更改了 filterBar 的原点,将其放在导航栏的范围内,并且按钮工作正常。不知道如何在不增加导航栏高度的情况下解决这个问题。可能只需要将 filterBar 从 navBar 中取出并将其添加为视图的子视图。将其隐藏在导航栏下方,这样当导航栏被隐藏并且用户滚动时,它就会显示出来。然而,这不是我想要的效果。【参考方案2】:

您将filterBar 添加为navigationBar 的子视图,但您将navigationBar 内的y 原点设置为42。然后您将filterButtonContainer 的y 原点设置为在filterBar 到 2 内。假设navigationBar 的高度为 44,则大部分 filterBar 以及您的全部 filterButtonContainerfilterButton 不会在他们的 navigationBar 超级视图内,因此按钮不会'不可选择。

编辑:为了使其在保持定位不变的同时可选择,我建议将过滤栏添加到self.view。例如,改变:

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

[self.view addSubview:filterBar];

【讨论】:

我的 filterBar 位于导航栏的正下方。当用户向下滚动时,navBar 被隐藏,而 filterBar 可见。 不,您已将 filterBar 设为导航栏的子视图,因此它在技术上位于导航栏中。 如果你想把它放在导航栏的正下方,把它添加到self.view中。 将 filterBar 设置为 self.view 的子视图使我的按钮可以工作,但是 filterBar 不会随着导航栏向上移动,因为它是隐藏的。这就是为什么我把它放在导航栏中,除非有更好的方法来做到这一点? filterBar 需要直接位于导航栏下方,并在隐藏时与它一起向上移动。 据我所知,您需要以编程方式制作这种动画。每当 navBar 向上移动时,也将 filterBar 向上移动。

以上是关于我的 UIView 有一个 UIButton 作为它的子视图之一,但不响应 Objective-c 中的事件的主要内容,如果未能解决你的问题,请参考以下文章

使用 UIView 作为按钮

将 UIView 作为子视图添加到 UIButton 并将其置于前面无法正常工作

UIButton 嵌入 UIVIew 不负责任

无法在 uiview 中动态居中自定义 uibutton

当 UILabel 动态调整大小时,在 UIView 中移动 UIButton。 iOS

iPhone 在 IB 中为自定义 UIView 创建 UIButton