如何隐藏inputAccessoryView而不closures键盘

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

myTextView.inputAccessoryView.hidden = !layoutIsPortrait; 

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

  myTextView.inputAccessoryView = nil; 

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

 [myTextView.inputAccessoryView removefromSuperview]; 

什么也没做。 我保存了一个iVar中的工具栏的引用,并解决这个问题,

 [myIvarReference removeFromSuperview]; 

这有效,但键盘的高度轮廓再次隐约可见。 这一次它不会影响其他观点的触动。 所以现在这是一个工作的解决scheme,但在视觉上不能接受。 还有什么我可以尝试显示和隐藏inputAccessoryView随意?

屏幕截图 – 键盘上方模糊的线条是被删除的工具栏的剩余部分

删除了工具栏的旋转键盘

 myTextView.inputAccessoryView = nil; [myTextView reloadInputViews]; 

这将从视图中移除工具栏并重新加载视图。 这样你就不需要调用resignFirstResponder并成为FirstResponder。 另外,这仍然会保持你的光标位置和内容。

对我来说,Eric的解决scheme从来没有真正重置框架或触摸区域。 据推测,这是苹果如何处理事情的一个错误。 但是,我发现一个解决方法,为我解决了这个问题。 当我设置一个新的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]; 

从来没有find一种方法来改变键盘的框架。 最终决定放弃inputAccessoryView,将我的工具栏直接添加到视图作为子视图,并直接与键盘一起自己animation。 这保持了两个独立,所以,没有更多的线。

Xamarin代码是

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

基于Eric Appel的回答:

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

进一步修改:

 - (BOOL)canBecomeFirstResponder { BOOL showInputAccessoryView = YES; if (hideInputAccessoryView) showInputAccessoryView = NO; return showInputAccessoryView; } 

这应该隐藏InputAccessoryView,即使在键盘退出时也是如此。

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

我有一个searchcontroller,如果select了一个特定的search范围,popup一个标准的Apple iOS键盘,而在其他范围被选中的情况下,一个带有集合视图的自定义键盘视图作为input字段。 在这两种情况下,当显示input视图时,在屏幕上绘制不希望的附件视图。

所以,

 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 = @[]; 
 mTextView.inputAccessoryView = [[UIView alloc] initWithFrame:CGRectZero]; [mTextView reloadInputViews]; 

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