12

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

 myTextView.inputAccessoryView.hidden = !layoutIsPortrait;

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

 myTextView.inputAccessoryView = nil;

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

[myTextView.inputAccessoryView removefromSuperview];

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

[myIvarReference removeFromSuperview];

这行得通,但键盘的较高轮廓再次隐约可见。这一次它不干涉其他观点的接触。所以现在这是一个可行的解决方案,但在视觉上是不可接受的。我还能尝试随意显示和隐藏 inputAccessoryView 吗?

屏幕截图 - 键盘上方的微弱线条是已删除工具栏的残余

移除了工具栏的旋转键盘

4

10 回答 10

32
myTextView.inputAccessoryView = nil;
[myTextView reloadInputViews];

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

于 2013-03-30T01:18:52.093 回答
6

上面的答案都不适合我,reloadInputViews 导致了奇怪的问题。最终,我通过以下方式让它显示和隐藏并通过以下方式进行触摸:

把它藏起来:

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

展示下:

[textview.inputAccessoryView setHidden:NO];
[textview.inputAccessoryView setUserInteractionEnabled:YES];
于 2014-05-29T23:39:27.953 回答
5

对我来说,Eric 的解决方案从未真正重置框架或触摸区域。大概这是苹果处理事情的一个错误。但是,我找到了一种解决方法,可以为我解决问题。当我设置一个没有框架的新 inputAccessoryView 时,reloadInputViews 工作正常:

myTextView.inputAccessoryView = [[UIView alloc] initWithFrame: CGRectZero];
[myTextView reloadInputViews];
于 2013-06-03T21:17:40.670 回答
2

Xamarin 代码是

Control.InputAccessoryView = new UIView(CGRect.Empty);
Control.ReloadInputViews();
于 2015-01-16T15:50:28.053 回答
2

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

于 2012-10-05T10:37:29.580 回答
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 = @[];
于 2017-04-05T17:30:16.627 回答
1
mTextView.inputAccessoryView = [[UIView alloc] initWithFrame:CGRectZero];
[mTextView reloadInputViews];

对我有用,设置inputAccessoryViewnil不起作用,我只是不知道为什么。

于 2017-12-29T14:29:18.523 回答
0

根据 Eric Appel 的回答:

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

进一步修改:

- (BOOL)canBecomeFirstResponder
{
    BOOL showInputAccessoryView = YES;

    if (hideInputAccessoryView)
        showInputAccessoryView = NO;

    return showInputAccessoryView;
}

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

于 2016-05-27T05:24:20.957 回答
0

斯威夫特 5

我用这个:

view.autocorrectionType = .no
于 2020-11-10T07:58:32.463 回答
0

Xcode 11.6 和 iOS 13.6

当键盘出现时,我试图添加两个工具栏。

首先,我添加了viewDidLoad

self.textView.inputAccessoryView = self.addDefaultToolbar()

当键盘出现时,我text在 UItextView 中选择了一个并尝试添加第二个工具栏选项

这是未Toolbar在选择的text.

func textViewDidChangeSelection(_ textView: UITextView) {
    if let selectedRange = textView.selectedTextRange{
        let selectedText = textView.text(in: selectedRange)
        if selectedText != nil && selectedText!.count > 0{
            print("selectedText - \(selectedText!)")
            
            if self.defaultToolBar != nil{
                self.defaultToolBar?.removeFromSuperview()
                self.defaultToolBar = nil
            }
            
            self.textView.inputAccessoryView = self.addSelectionToolbar()
        }
        else{
            print("not selectedText - \(selectedText!)")
            
            if self.selectionToolBar != nil{
                self.selectionToolBar?.removeFromSuperview()
                self.selectionToolBar = nil
            }
            
            
            self.textView.inputAccessoryView = self.addDefaultToolbar()
            
        }
    }
}

添加后self.textView.reloadInputViews(),我可以看到更改第二个工具栏,反之亦然。

工作代码。

func textViewDidChangeSelection(_ textView: UITextView) {
    if let selectedRange = textView.selectedTextRange{
        let selectedText = textView.text(in: selectedRange)
        if selectedText != nil && selectedText!.count > 0{
            print("selectedText - \(selectedText!)")
            
            if self.defaultToolBar != nil{
                self.defaultToolBar?.removeFromSuperview()
                self.defaultToolBar = nil
            }
            
            self.textView.inputAccessoryView = self.addSelectionToolbar()
            self.textView.reloadInputViews()
        }
        else{
            print("not selectedText - \(selectedText!)")
            
            if self.selectionToolBar != nil{
                self.selectionToolBar?.removeFromSuperview()
                self.selectionToolBar = nil
            }
            
            
            self.textView.inputAccessoryView = self.addDefaultToolbar()
            self.textView.reloadInputViews()
            
        }
    }
}
于 2020-08-31T04:27:26.500 回答