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を呼び出してFirstResponderになる必要はありません。さらに、これによりカーソルの配置とコンテンツが保持されます。

于 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のソリューションは、フレームやタッチ領域を実際にリセットすることはありません。おそらく、それはAppleが物事を処理する方法のバグです。ただし、問題を解決する回避策を見つけました。フレームなしで新しいinputAccessoryViewを設定すると、reloadInputViewsは正常に機能しました。

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

キーボードのフレームを変更する方法を見つけたことはありません。最終的には、inputAccessoryViewを放棄し、ツールバーをサブビューとしてビューに直接追加し、キーボードと一緒に直接アニメーション化することにしました。これにより、2つが独立した状態に保たれるため、これ以上の行はなくなります。

于 2012-10-05T10:37:29.580 に答える
2

Xamarinコードは

Control.InputAccessoryView = new UIView(CGRect.Empty);
Control.ReloadInputViews();
于 2015-01-16T15:50:28.053 に答える
1

奇妙なことに、私の場合、これらのアプローチはどれもうまくいきませんでした。

特定の検索スコープが選択された場合に標準のAppleiOSキーボードをポップアップする検索コントローラーと、他のスコープが選択された場合に入力フィールドとしてコレクションビューを備えたカスタムキーボードビューがあります。どちらの場合も、入力ビューが表示されたときに、不要なアクセサリビューが画面に描画されました。

それで、

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

エリック・アッペルの回答に基づく:

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

Xcode11.6およびiOS13.6

キーボードが表示されたときに2つのツールバーを追加しようとしていました。

まず、追加しましたviewDidLoad

self.textView.inputAccessoryView = self.addDefaultToolbar()

キーボードが表示さtextれたら、UItextViewでを選択し、2番目のツールバーオプションを追加しようとしました

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()2番目のツールバーの変更とその逆を確認できました。

動作するコード。

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 に答える
0

スウィフト5

私はこれを使用します:

view.autocorrectionType = .no
于 2020-11-10T07:58:32.463 に答える