我的 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】:您的父视图(按钮的超级视图)很可能有一个width
或height
,将过滤器按钮放置在其区域之外。该按钮仍会显示(如果您没有定义视图应切断子视图),但视图区域之外的元素将不会获得任何触摸事件。检查你的 superview 的宽度和高度。
【讨论】:
这就是问题所在。我更改了 filterBar 的原点,将其放在导航栏的范围内,并且按钮工作正常。不知道如何在不增加导航栏高度的情况下解决这个问题。可能只需要将 filterBar 从 navBar 中取出并将其添加为视图的子视图。将其隐藏在导航栏下方,这样当导航栏被隐藏并且用户滚动时,它就会显示出来。然而,这不是我想要的效果。【参考方案2】:您将filterBar
添加为navigationBar
的子视图,但您将navigationBar
内的y 原点设置为42。然后您将filterButtonContainer
的y 原点设置为在filterBar
到 2 内。假设navigationBar
的高度为 44,则大部分 filterBar
以及您的全部 filterButtonContainer
和 filterButton
不会在他们的 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 作为子视图添加到 UIButton 并将其置于前面无法正常工作