gpt4 book ai didi

ios - 防止或检测从 iOS 8 键盘传递的事件

转载 作者:可可西里 更新时间:2023-11-01 04:46:15 27 4
gpt4 key购买 nike

在我们的 iOS 8 应用程序中,与 App Store 应用程序的搜索屏幕类似的搜索屏幕不再可靠地工作。当用户点击一个键时,键盘有时会关闭,甚至会执行一个 Action 。

部分原因是点击事件被传递到较低层,即关闭键盘(烟幕),导航到搜索结果(带有搜索结果的 UITableView)或执行搜索(带有搜索词建议的 UITableView ).

由于某些未知原因,只要用户留在应用程序中,它就可以正常工作。但是,如果他/她转到另一个应用程序然后返回,则事件会继续传递。此行为会影响所有 iOS 8 版本(8.0.x、8.1)。

我们如何防止键盘传递点击事件或我们如何检测此类事件(例如来自 tableView:didSelectRowAtIndexPath:)?

问题“Keyboard intermittently disappears when editing using IOS 8”似乎指的是同一个问题,尽管我不知道如何将那个丑陋的 hack 应用到我的情况中。


我刚找到一个类似的 post在 Apple 的开发者论坛中。不幸的是,它没有答案,同时已被存档:

I have overriden -hitTest:withEvent: on a view on my view hierarchy where I check if it was touched and will forward the touch to its subviews and fire a selector to dismiss the keyboard.

On iOS 7 (and, more strangely, when the app is launched on iOS 8) this works perfectly and -hitTest:withEvent: will never be called if the view is behind the keyboard and the user taps on the keyboard.

But on iOS 8, if the user sends the app to the background and brings it back to the foreground, tapping anything on the keyboard will trigger -hitTest:withEvent: as if the view was above the keyboard on the view hierarchy. I've used Reveal.app to verify that it is not above the keyboard, it is behind as expected.

Anyone got any ideas of what could be happening? I've created a sample project and attached it to a radar for Apple as this looks like a bug on iOS 8 for not working the same way consistently.

更新

我的搜索屏幕包含两个 View (彼此重叠):没有可用搜索结果时可见的背景 View 和可用搜索结果时可见的表格 View 。除此之外,如果搜索栏激活,我会动态添加两个额外的 View :一个可以点击以结束搜索文本条目的烟雾类 View ,以及一个显示搜索文本建议的 TableView 。所有四个 View 都直接包含在 View Controller 的主视图中并覆盖整个区域。

现在有趣的是,键盘将事件转发到两个动态添加的 View ,而不是转发到始终存在的两个较低 View 。

最佳答案

我认为点击事件传递到键盘下方的 View 是一个错误。正如我同时发现只有动态添加的 View 受到影响,而不是那些属于 Interface Builder 文件的 View ,我现在想出了一个解决方法:如果键盘出现,我缩小这些两个 View ,因此它们不会延伸到键盘下方。当键盘消失时,我会再次种植它们。

这是代码。直到(不包括)[[NSNotificationCenter defaultCenter] 的上部已经存在。剩下的就是解决方法。

- (BOOL) searchBarShouldBeginEditing: (UISearchBar*) searchBar {

// calculate from for entire area
CGRect frame = ... // omitted

// add smoke screen
_smokeScreen = [UIButton buttonWithType: UIButtonTypeCustom];
_smokeScreen.frame = frame;
_smokeScreen.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
_smokeScreen.backgroundColor = [UIColor colorWithWhite: 0.0f alpha: 0.5f];
[_smokeScreen addTarget: self action: @selector(smokeScreenPressed:) forControlEvents: UIControlEventTouchDown];
[self.view addSubview: _smokeScreen];

// add table view for search term suggestions
_suggestionTableView = [[SearchControllerTableView alloc] initWithFrame:frame style:UITableViewStylePlain];
_suggestionTableView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
_suggestionTableView.dataSource = self;
_suggestionTableView.delegate = self;
_suggestionTableView.searchController = self;
_suggestionTableView.hidden = YES;
[self.view addSubview:_suggestionTableView];

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidShow:)
name:UIKeyboardDidShowNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:)
name:UIKeyboardWillHideNotification object:nil];

return YES;
}


- (void) keyboardDidShow:(NSNotification *) notification
{
// shrink the smoke screen area and the table view because otherwise they'll receive tap events from the keyboard
CGRect screenRect = [[[notification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
CGRect windowRect = [self.view.window convertRect:screenRect fromWindow:nil];
CGRect viewRect = [self.view convertRect:windowRect fromView:nil];

[self setBottom: viewRect.origin.y];
}


- (void) keyboardWillHide:(NSNotification *) notification
{
// grow the views again
[self setBottom: self.view.frame.size.height];
}


- (void) setBottom: (CGFloat)y
{
CGRect frame = _suggestionTableView.frame;
frame.size.height = y - frame.origin.y;
_suggestionTableView.frame = frame;

frame = _smokeScreen.frame;
frame.size.height = y - frame.origin.y;
_smokeScreen.frame = frame;
}

关于ios - 防止或检测从 iOS 8 键盘传递的事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26651384/

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