web-dev-qa-db-ja.com

iOS 11でカスタムキーボードInputAccessoryViewが表示されない

IOS 10.3.1まで正常に動作していたカスタム入力アクセサリビューを実装しました。ただし、iOS 11ベータ版では表示されません。

誰でもこの問題を経験していますか?

16
Ruchi

あなたが尋ねる質問にはあまり詳細がありません。しかし、テキストフィールドにinputAccessoryViewとカスタムinputViewを使用する場合、同じ問題がありました。

また、カスタムinputViewのautoresizingMaskを.flexibleHeightに設定することにより、iOS11でこれを解決しました。

yourCustomInputView.autoresizingMask = .flexibleHeight

これで問題が解決することを願っています。そうでない場合は、さらに情報を提供しますか?

ここに入力アクセサリを追加する方法を示します。これは(テキストフィールドの拡張として)さらに役立つ場合です。

public extension UITextField {

public func addToolbarInputAccessoryView(barButtonItems: [UIBarButtonItem],
                                         textColour: UIColor,
                                         toolbarHeight: CGFloat = 44,
                                         backgroundColour: UIColor = .white) {

    let toolbar = UIToolbar()

    toolbar.frame = CGRect(x: 0, y: 0, width: bounds.width, height: toolbarHeight)
    toolbar.items = barButtonItems
    toolbar.isTranslucent = false
    toolbar.barTintColor = backgroundColour
    toolbar.tintColor = textColour

    inputAccessoryView = toolbar
}

}

そして、inputViewinputAccessoryViewではなく)で、たとえば日付ピッカーを使用していました-日付ピッカーの自動サイズ変更マスクが柔軟な高さに設定されていることを確認してください。

16
Jess

PSA:UIToolbarをカスタムビューとして使用する場合、現在iOS 11 GMで壊れています。修正方法について髪を失う代わりに、IViewに変更するだけ。ぼかし効果は失われますが、機能します。

8
ahbou

ベータ3がリリースされたばかりで、問題を解決したと言う人もいますが、私にとってはそうではありませんでした。

しかし、アクセサリビューを愚かな(高さ100pxls)に設定しようとしましたが、iPadの[元に戻す]/[やり直し]/[貼り付け]バーがアクセサリバーの上部に誤って座っていました。そこで、Applesバーを削除するために次のコードを追加しました(カスタムピッカーにとっては無意味でした)が、問題はなくなりました

これが誰かを助けることを願って

- (void)textFieldDidBeginEditing:(UITextField*)textField  
{  
    UITextInputAssistantItem* item = [textField inputAssistantItem];  
    item.leadingBarButtonGroups = @[];  
    item.trailingBarButtonGroups = @[];  
}  
5
user2843570

IOS 11でinputAccessoryViewおよびUITextFieldUITextViewの問題を回避するには、次のコードを使用します。

UIView *inputView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 150)];

self.monthPickerView = [[UIPickerView alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 150)];

    self.monthPickerView.backgroundColor = [UIColor whiteColor];

    self.monthPickerView.delegate = self;

    self.monthPickerView.dataSource = self;
[inputView addSubview:self.monthPickerView];

    cell.monthTextField.inputView = inputView ;

self.monthTextField.inputAccessoryView = [self doneButtonAccessoryView];


// doneButtonAccessoryView Method


-(UIToolbar*)doneButtonAccessoryView
{

    UIToolbar *kbToolbar = [[UIToolbar alloc] init];
    [kbToolbar sizeToFit];
    [kbToolbar setBarTintColor:[UIColor whiteColor]];
    UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithTitle:@"Done"
                                                                   style:UIBarButtonItemStyleDone target:self
                                                                  action:@selector(doneClicked)];

    UIBarButtonItem *cancelButton = [[UIBarButtonItem alloc] initWithTitle:@"Cancel"
                                                                     style:UIBarButtonItemStyleDone target:self
                                                                    action:@selector(cancelClicked)];
    NSDictionary *attrDict;

    attrDict = [NSDictionary dictionaryWithObjectsAndKeys:
                [UIFont fontWithName:@"Helvetica-Bold" size:16.0], NSFontAttributeName, nil];
 [doneButton setTitleTextAttributes:attrDict forState:UIControlStateNormal];
    UIBarButtonItem *flexWidth = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace
                                                                               target:self action:nil];

    [kbToolbar setItems:[NSArray arrayWithObjects:cancelButton,flexWidth, doneButton, nil]];
    return kbToolbar;
}
3
Rizwan Shaikh

私は同じ問題を抱えていましたが、bottomtopleadingtrainingleftrightが割り当てられたビューの制約は、accessoryViewで解決しました。

0
oronbz

UIToolBarはiOS 11では壊れています。しかし、UIViewを使用してinputAccessoryViewと同じことを行うことができます。サンプルコードスニペット:

CGFloat width = [[UIScreen mainScreen] bounds].size.width;
UIView* toolBar = [[UIView alloc] initWithFrame:CGRectMake(0.0f,0.0f, width, 44.0f)];
toolBar.backgroundColor = [UIColor colorWithRed:0.97f  green:0.97f blue:0.97f alpha:1.0f];

UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(20.0 , 0.0f, width, 44.0f)];
[titleLabel setFont:[UIFont fontWithName:@"Helvetica" size:13]];
[titleLabel setBackgroundColor:[UIColor clearColor]];
[titleLabel setTextColor:[UIColor redColor]];
[titleLabel setText:@"Title"];
[titleLabel setTextAlignment:NSTextAlignmentLeft];
[toolBar addSubview:titleLabel];

UIButton *doneBtn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[doneBtn setTitle:@"Done" forState:UIControlStateNormal];
doneBtn.tintColor = [UIColor colorWithRed:(float)179/255 green:(float)27/255 blue:(float)163/255 alpha:1];
[doneBtn.titleLabel setFont:[UIFont fontWithName:@"Helvetica" size:16]];
[doneBtn addTarget:self action:@selector(btnTxtDoneAction) forControlEvents:UIControlEventTouchUpInside];
[doneBtn setFrame:CGRectMake(width-70, 6, 50, 32)];
[toolBar addSubview:doneBtn];

[toolBar sizeToFit];

txtMessageView.inputAccessoryView = toolBar;

この助けを願っています.. :)

0
christijk

Swift 4ソリューション

let toolBarRect = CGRect(x: 0, y: 0, width: self.view.frame.width, height: 44)
let toolBar = UIView(frame: toolBarRect)
toolBar.backgroundColor = .lightGray

let nextButton = UIButton()
nextButton.setTitleColor(.black, for: .normal)
nextButton.setTitle("Next", for: .normal)
nextButton.addTarget(self, action: #selector(self.onNextButtonTouch), for: .touchUpInside)
nextButton.translatesAutoresizingMaskIntoConstraints = false
toolBar.addSubview(nextButton)

NSLayoutConstraint.activate(
    [
        nextButton.heightAnchor.constraint(equalToConstant: Constants.keyboardToolBarHeight),
        nextButton.trailingAnchor.constraint(equalTo: toolBar.trailingAnchor, constant: -16),
        nextButton.centerYAnchor.constraint(equalTo: toolBar.centerYAnchor, constant: 0)
    ]
)

self.yourTextField.inputAccessoryView = toolBar
0
IvanPavliuk