UIPopoverPresentationController 不会在标题视图上禁用点击手势
UIPopoverPresentationController doesn't disable tap gesture on title view
我有一个带有导航栏的视图控制器,其中包含处理点击手势的标题视图。还有一个 rightBarButtonItem
,它在 iPad 上显示 UIAlertController
作为弹出窗口。示例代码如下:
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = UIColor.whiteColor;
UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 100, 30)];
titleLabel.text = @"Popover test";
titleLabel.backgroundColor = UIColor.greenColor;
titleLabel.userInteractionEnabled = YES;
[titleLabel addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(titleLabelPress)]];
self.navigationItem.titleView = titleLabel;
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd
target:self
action:@selector(showPopover)];
}
- (void)showPopover {
UIAlertController *controller = [UIAlertController alertControllerWithTitle:nil
message:nil
preferredStyle:UIAlertControllerStyleActionSheet];
controller.popoverPresentationController.barButtonItem = self.navigationItem.rightBarButtonItem;
[controller addAction:[UIAlertAction actionWithTitle:@"One" style:UIAlertActionStyleDefault handler:nil]];
[controller addAction:[UIAlertAction actionWithTitle:@"Two" style:UIAlertActionStyleDefault handler:nil]];
[self presentViewController:controller animated:YES completion:nil];
}
- (void)titleLabelPress {
BOOL isYellow = [((UILabel *)self.navigationItem.titleView).backgroundColor isEqual:UIColor.yellowColor];
((UILabel *)self.navigationItem.titleView).backgroundColor = isYellow ? UIColor.greenColor : UIColor.yellowColor;
}
问题是当弹出窗口出现时我仍然可以点击标题标签并且弹出窗口不会关闭。此外,如果我点击状态栏弹出窗口,也不会关闭。出现这些问题的原因可能是什么?
根据回答:
UIPopoverController does not dismiss when clicking on the NavigationBar
UIPopoverController seems to add the navigation bar to its
passthroughViews array when it is presented.
解决方法是:
[self presentViewController:controller animated:YES completion:^{
controller.popoverPresentationController.passthroughViews = nil;
}];
我有一个带有导航栏的视图控制器,其中包含处理点击手势的标题视图。还有一个 rightBarButtonItem
,它在 iPad 上显示 UIAlertController
作为弹出窗口。示例代码如下:
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = UIColor.whiteColor;
UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 100, 30)];
titleLabel.text = @"Popover test";
titleLabel.backgroundColor = UIColor.greenColor;
titleLabel.userInteractionEnabled = YES;
[titleLabel addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(titleLabelPress)]];
self.navigationItem.titleView = titleLabel;
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd
target:self
action:@selector(showPopover)];
}
- (void)showPopover {
UIAlertController *controller = [UIAlertController alertControllerWithTitle:nil
message:nil
preferredStyle:UIAlertControllerStyleActionSheet];
controller.popoverPresentationController.barButtonItem = self.navigationItem.rightBarButtonItem;
[controller addAction:[UIAlertAction actionWithTitle:@"One" style:UIAlertActionStyleDefault handler:nil]];
[controller addAction:[UIAlertAction actionWithTitle:@"Two" style:UIAlertActionStyleDefault handler:nil]];
[self presentViewController:controller animated:YES completion:nil];
}
- (void)titleLabelPress {
BOOL isYellow = [((UILabel *)self.navigationItem.titleView).backgroundColor isEqual:UIColor.yellowColor];
((UILabel *)self.navigationItem.titleView).backgroundColor = isYellow ? UIColor.greenColor : UIColor.yellowColor;
}
问题是当弹出窗口出现时我仍然可以点击标题标签并且弹出窗口不会关闭。此外,如果我点击状态栏弹出窗口,也不会关闭。出现这些问题的原因可能是什么?
根据回答:
UIPopoverController does not dismiss when clicking on the NavigationBar
UIPopoverController seems to add the navigation bar to its passthroughViews array when it is presented.
解决方法是:
[self presentViewController:controller animated:YES completion:^{
controller.popoverPresentationController.passthroughViews = nil;
}];