gpt4 book ai didi

iOS - PopOver 呈现和解雇

转载 作者:行者123 更新时间:2023-11-28 17:37:30 26 4
gpt4 key购买 nike

我的 iPad 应用程序主屏幕顶部有一个 UIToolbar。它上面有 6 个 UIBarButtonItems。其中 4 个项目触发 UIPopOvers 出现。其他 2 项要么切换到不同的 View ,要么改变当前 View 的某些内容。

4 个 UIPopOver 中的 3 个出现在点击的 UIBarButtonItem 中,第 4 个没有箭头出现在屏幕中间。

我想要以下功能,但很难实现:

  1. 当没有显示任何 UIPopOver 并且用户点击生成 UIPopOver 的 UIBarButtonItems 之一时,显示 UIPopOver(非常简单;使它起作用。)
  2. 当显示 UIPopOver 并且用户点击 UIToolbar 时,关闭该 UIPopOver。 (使用只需轻按 1 次的 UIGestureRecognizer 即可完成这项工作。)
  3. 当显示 UIPopOver 并且用户点击 UIPopOver 被“绑定(bind)”到的 UIBarButtonItem 时,关闭 UIPopOver。 (这是我的问题。)
  4. 当显示 UIPopOver 并且用户点击另一个 UIBarButtonItem 时,关闭当前的 UIPopOver 并显示相应的新 UIPopOver。 (这工作正常。)

因此,我面临的问题是 UIGestureRecognizer 在点击按钮之前触发。当用户按下 UIBarButtonItem 时,我也找不到“选择退出”UIGestureRecognizer 的好方法(因此,只有在点击 UIToolbar 本身而不是 UIBarButtonItem 时才触发 UIGestureRecognizer 的操作)。这样做的最终结果是,当显示 UIPopOver(来自 UIBarButtonItem)并且用户点击相同的 UIBarButtonItem 时,UIPopOver 被关闭然后再次显示。

我试图避免某种计时问题,我将“toolbarTapped”标志设置为 YES 0.10 秒,然后将其设置回 NO(或类似的东西)。

我想找到一种真正优雅地做到这一点的方法(而不是 hack-y)。

我似乎无法找到一种方法来确定 UIGestureRecognizer 何时基于 UIBarButtonItem 触摸被触发,因为 UIGestureRecognizer 首先触发并且似乎没有一种好的(非私有(private))方法来获取框架一个 UIBarButtonItem。

基本上,我正在努力使 UIToolbar 及其 UIBarButtonItems 的行为符合任何有理智的人所期望的方式,但我正在用头撞墙。

这是 UIGestureRecognizer 的代码:

// Initialization
UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(removeAllPopOvers)];
[tapRecognizer setCancelsTouchesInView:NO];
[tapRecognizer setNumberOfTapsRequired:1];
[tapRecognizer setNumberOfTouchesRequired:1];
[[self Toolbar] addGestureRecognizer:tapRecognizer];

// Tap handler
- (void)removeAllPopOvers {
NSLog(@"removing all popovers");
if ([self firstPopOver]) {
[[self firstPopOver] dismissPopoverAnimated:YES];
[self setFirstPopOver:nil];
}
// and so on with the rest...
}

下面是我的一个 UIPopOver 的显示方式:

- (IBAction)showSettings:(id)sender {
NSLog(@"settings button tapped");
if (![self SettingsPopOver]) {
SettingsViewController *settingsVC = [[SettingsViewController alloc] initWithNibName:@"SettingsView-iPad" bundle:nil];
UIPopoverController *popOver = [[UIPopoverController alloc] initWithContentViewController:settingsVC];
[popOver setDelegate:self];
[self setSettingsPopOver:popOver];
[[self SettingsPopOver] setPopoverContentSize:CGSizeMake(320, 300)];
[[self SettingsPopOver] presentPopoverFromBarButtonItem:[self Settings] permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
}
}

所有这一切的最终结果是我可以选择以下两个选项之一(但不能同时选择两个):

  1. 允许 UIBarButtonItem 关闭 UIPopOver。
  2. 允许点击 UIToolbar 以关闭 UIPopOver。

有什么想法吗?

谢谢!

最佳答案

目前,我已经实现了一些可行但不优雅的东西(至少,我不认为它是优雅的)。

基本上,我所做的是通过首先将 UIGestureRecognizer 的 Action 发送到“缓冲区”方法来延迟它的 Action :

#pragma mark - PopOver Dismissal
// dismissAllPopOversBuffer is called as the action of my UIGestureRecognizer
- (void)dismissAllPopOversBuffer {
NSLog(@"dismiss all popovers buffer...");
[self performSelector:@selector(dismissAllPopOvers) withObject:nil afterDelay:0.1];
}
- (void)dismissAllPopOvers {
NSLog(@"dismissing all popovers");
// actual dismissal logic
}

如您所见,这将实际的关闭逻辑推迟了 0.1 秒。然后,在每个按钮按下方法中,我这样做:

#pragma mark - UIBarButtonItem Press Event Handlers
- (IBAction)buttonPressed:(id)sender {
[NSObject cancelPreviousPerformRequestsWithTarget:self
selector:@selector(dismissAllPopOvers)
object:nil];
// The rest of the logic to dismiss/show UIPopOver
}

到目前为止,我的测试表明它可以正常工作。基于 NSLog 时间戳,UIGestureRecognizer 操作和 UIBarButtonItem 事件之间的实际耗时通常为 1 毫秒(0.001 秒),因此在大多数情况下推出 0.1 秒(或正常时间间隔的 100 倍)应该是安全的,但我仍然不喜欢。

我很想找到一种方法来确定用户何时点击了 UIToolbar 而不是任何 UIBarButtonItems。这看起来相当简单(逻辑上)但相当困难(实际上)。

关于iOS - PopOver 呈现和解雇,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9432793/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com