这是我的代码。在试图解决这个问题一两个小时后,它开始显得拥挤起来。我试着将用户交互设置为"是",我试着只使用一个按钮,而不使其成为另一个视图的子视图。
现在我有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];
}
很可能您的父视图(按钮的超视图)中有一个width
或height
,它将过滤器按钮放置在其区域之外。按钮仍然显示(如果您没有定义视图应该剪切子视图),但视图区域外的元素将不会得到任何触摸事件。检查超视图的宽度和高度。
您将filterBar
添加为navigationBar
的子视图,但将其在navigationBar
中的y原点设置为42。然后将filterButtonContainer
在filterBar
中的y原点设置为2。假设navigationBar
的高度为44,则大多数filterBar
以及整个filterButtonContainer
和filterButton
都不在其navigationBar
超视图中,因此该按钮将不可选择。
编辑:为了在保持定位不变的情况下使其可选择,我建议在self.view
中添加过滤条。例如,change:
[[[self navigationController] navigationBar] addSubview:filterBar];
至
[self.view addSubview:filterBar];