我在textView的inputAccessoryView属性中使用工具栏。当键盘显示时,它会按预期显示工具栏。旋转设备时,我想删除工具栏。我试过了:
myTextView.inputAccessoryView.hidden = !layoutIsPortrait;
这确实隐藏了工具栏,但留下了较高键盘的轮廓。键盘显然仍然适合工具栏。它看起来很糟糕并且会干扰潜在响应者的触摸事件。
myTextView.inputAccessoryView = nil;
仅当我resignFirstResponder,然后再次成为FirstResponder时才有效。这是不可接受的。我丢失了光标位置和textView的内容,键盘闪烁了。
[myTextView.inputAccessoryView removefromSuperview];
什么都不做。我在iVar中保存了对工具栏的引用并将其解决了,
[myIvarReference removeFromSuperview];
这有效,但键盘的较高轮廓再次隐约可见。这次它不会干扰其他视图的触摸。所以现在这是一个有效的解决方案,但在视觉上是不可接受的。我还可以尝试显示和隐藏inputAccessoryView吗?
屏幕截图 - 键盘上方的模糊线条是已删除工具栏的残余部分
myTextView.inputAccessoryView = nil;
[myTextView reloadInputViews];
这将从视图中删除工具栏并重新加载视图。这样您就不需要调用resignFirstResponder和becomeFirstResponder。此外,这仍将保留您的光标位置和内容。
对我来说,Eric的解决方案从未实际重置帧或触摸区域。据推测,这是Apple如何处理事情的错误。但是,我找到了解决这个问题的解决方法。当我设置一个没有框架的新inputAccessoryView时,reloadInputViews工作正常:
myTextView.inputAccessoryView = [[UIView alloc] initWithFrame: CGRectZero];
[myTextView reloadInputViews];
上面的答案都没有为我工作,reloadInputViews导致了奇怪的问题。最终,我得到它来显示和隐藏,并通过做:触摸直通:
把它藏起来:
[textview.inputAccessoryView setHidden:YES];
[textview.inputAccessoryView setUserInteractionEnabled:NO];
展示下:
[textview.inputAccessoryView setHidden:NO];
[textview.inputAccessoryView setUserInteractionEnabled:YES];
从未找到改变键盘框架的方法。最终决定放弃inputAccessoryView,将我的工具栏作为子视图直接添加到视图中,并直接将其与键盘一起动画。这使两者保持独立,因此不再有线。
代码是
Control.InputAccessoryView = new UIView(CGRect.Empty);
Control.ReloadInputViews();
奇怪的是,这些方法都不适合我的情况。
我有一个搜索控制器,如果选择了特定的搜索范围,它会弹出标准的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 = @[];
根据Eric Appel的回答:
myTextView.inputAccessoryView = nil;
[myTextView reloadInputViews];
hideInputAccessoryView = YES;
进一步修改:
- (BOOL)canBecomeFirstResponder
{
BOOL showInputAccessoryView = YES;
if (hideInputAccessoryView)
showInputAccessoryView = NO;
return showInputAccessoryView;
}
即使键盘被重新签名,这也应该隐藏InputAccessoryView。
mTextView.inputAccessoryView = [[UIView alloc] initWithFrame:CGRectZero];
[mTextView reloadInputViews];
适合我,将inputAccessoryView
设置为nil
将无法正常工作,我只是不知道为什么。