如何在不关闭键盘的情况下隐藏inputAccessoryView

问题描述 投票:12回答:8

我在textView的inputAccessoryView属性中使用工具栏。当键盘显示时,它会按预期显示工具栏。旋转设备时,我想删除工具栏。我试过了:

 myTextView.inputAccessoryView.hidden = !layoutIsPortrait;

这确实隐藏了工具栏,但留下了较高键盘的轮廓。键盘显然仍然适合工具栏。它看起来很糟糕并且会干扰潜在响应者的触摸事件。

 myTextView.inputAccessoryView = nil;

仅当我resignFirstResponder,然后再次成为FirstResponder时才有效。这是不可接受的。我丢失了光标位置和textView的内容,键盘闪烁了。

[myTextView.inputAccessoryView removefromSuperview];

什么都不做。我在iVar中保存了对工具栏的引用并将其解决了,

[myIvarReference removeFromSuperview];

这有效,但键盘的较高轮廓再次隐约可见。这次它不会干扰其他视图的触摸。所以现在这是一个有效的解决方案,但在视觉上是不可接受的。我还可以尝试显示和隐藏inputAccessoryView吗?

屏幕截图 - 键盘上方的模糊线条是已删除工具栏的残余部分

iphone ios uitoolbar uikeyboard
8个回答
27
投票
myTextView.inputAccessoryView = nil;
[myTextView reloadInputViews];

这将从视图中删除工具栏并重新加载视图。这样您就不需要调用resignFirstResponder和becomeFirstResponder。此外,这仍将保留您的光标位置和内容。


5
投票

对我来说,Eric的解决方案从未实际重置帧或触摸区域。据推测,这是Apple如何处理事情的错误。但是,我找到了解决这个问题的解决方法。当我设置一个没有框架的新inputAccessoryView时,reloadInputViews工作正常:

myTextView.inputAccessoryView = [[UIView alloc] initWithFrame: CGRectZero];
[myTextView reloadInputViews];

5
投票

上面的答案都没有为我工作,reloadInputViews导致了奇怪的问题。最终,我得到它来显示和隐藏,并通过做:触摸直通:

把它藏起来:

[textview.inputAccessoryView setHidden:YES];
[textview.inputAccessoryView setUserInteractionEnabled:NO];

展示下:

[textview.inputAccessoryView setHidden:NO];
[textview.inputAccessoryView setUserInteractionEnabled:YES];

2
投票

从未找到改变键盘框架的方法。最终决定放弃inputAccessoryView,将我的工具栏作为子视图直接添加到视图中,并直接将其与键盘一起动画。这使两者保持独立,因此不再有线。


1
投票

代码是

Control.InputAccessoryView = new UIView(CGRect.Empty);
Control.ReloadInputViews();

1
投票

奇怪的是,这些方法都不适合我的情况。

我有一个搜索控制器,如果选择了特定的搜索范围,它会弹出标准的Apple iOS键盘,以及一个自定义键盘视图,如果选择了其他范围,则会将集合视图作为输入字段。在这两种情况下,当显示输入视图时,在屏幕上绘制了不需要的附件视图。

所以,

self.mySearch.searchbar.inputAccessoryView = nil // did not work

[self.mySearch.searhbar.inputAccessoryView setHidden:YES] // did not work

self.mySearch.inputAccessoryView = nil  // did not work

self.mySearch.searchbar.inputAccessoryView.frame = CGRectZero //did not work

[self.mySearch reloadInputViews]

及其各种组合等

从附件视图中删除各个附件的工作是什么:

 // insert after assignments of mySearch delegates
UITextInputAssistantItem *junk = [self.mySearch inputAssistantItem];
junk.leadingBarButtonGroups = @[];
junk.trailingBarButtonGroups = @[];

0
投票

根据Eric Appel的回答:

myTextView.inputAccessoryView = nil;
[myTextView reloadInputViews];
hideInputAccessoryView = YES;

进一步修改:

- (BOOL)canBecomeFirstResponder
{
    BOOL showInputAccessoryView = YES;

    if (hideInputAccessoryView)
        showInputAccessoryView = NO;

    return showInputAccessoryView;
}

即使键盘被重新签名,这也应该隐藏InputAccessoryView。


0
投票
mTextView.inputAccessoryView = [[UIView alloc] initWithFrame:CGRectZero];
[mTextView reloadInputViews];

适合我,将inputAccessoryView设置为nil将无法正常工作,我只是不知道为什么。

© www.soinside.com 2019 - 2024. All rights reserved.