iosobjective-ccustom-keyboard

iOS Custom keyboard increase UIInputViewController height


I just cannot get what the docs say about getting the height of my iOS custom keyboard working.

This is clean Keyboard target and added what seems to be apple docs and many SO answers as the right answer, but it does not work on XS and 6S simulators:

//
//  KeyboardViewController.m
//  keyboard
//
//  Created by hiwa on 02/04/2019.
//  Copyright © 2019 hiwa. All rights reserved.
//

#import "KeyboardViewController.h"

@interface KeyboardViewController ()
@property (nonatomic, strong) UIButton *nextKeyboardButton;
@end

@implementation KeyboardViewController

- (void)updateViewConstraints {
    [super updateViewConstraints];

    // Add custom view sizing constraints here
}

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    NSLayoutConstraint *heightConstraint =
    [NSLayoutConstraint constraintWithItem: self.view
                                 attribute: NSLayoutAttributeHeight
                                 relatedBy: NSLayoutRelationEqual
                                    toItem: nil
                                 attribute: NSLayoutAttributeNotAnAttribute
                                multiplier: 0.0
                                  constant: 300];
    [self.view addConstraint: heightConstraint];
}
- (void)viewDidLoad {
    [super viewDidLoad];

    // Perform custom UI setup here
    self.nextKeyboardButton = [UIButton buttonWithType:UIButtonTypeSystem];

    [self.nextKeyboardButton setTitle:NSLocalizedString(@"Next Keyboard", @"Title for 'Next Keyboard' button") forState:UIControlStateNormal];
    [self.nextKeyboardButton sizeToFit];

    [self.nextKeyboardButton addTarget:self action:@selector(handleInputModeListFromView:withEvent:) forControlEvents:UIControlEventAllTouchEvents];

    [self.view addSubview:self.nextKeyboardButton];

}

- (void)textWillChange:(id<UITextInput>)textInput {
    // The app is about to change the document's contents. Perform any preparation here.
}

- (void)textDidChange:(id<UITextInput>)textInput {
    // The app has just changed the document's contents, the document context has been updated.

    UIColor *textColor = nil;
    if (self.textDocumentProxy.keyboardAppearance == UIKeyboardAppearanceDark) {
        textColor = [UIColor whiteColor];
    } else {
        textColor = [UIColor blackColor];
    }
    [self.nextKeyboardButton setTitleColor:textColor forState:UIControlStateNormal];
}

@end

enter image description here

Grateful for any tips here.


Solution

  • Based on Developer Code Level ticket:

    1. add your buttons to a UIView (say keysView)
    2. add the keysView to the UIInputViewController's view.
    3. Add the constraint as in the question
    4. Make keysView.frame the same as self.view
    5. Add at least one constant to one of the buttons to keysView

    Now you should have an expanding keysView which is as high as the self.view.

    Full code:

    
    
    #import "KeyboardViewController.h"
    
    @interface KeyboardViewController ()
    
    @property (nonatomic, strong) UIButton *nextKeyboardButton;
    
    @end
    
    @implementation KeyboardViewController
    - (void)viewDidLoad {
        [super viewDidLoad];
        // (1)
        UIView *keysView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
        // (3)
        NSLayoutConstraint *keyboardHeightConstraint = [NSLayoutConstraint
                                                        constraintWithItem:self.view
                                                        attribute:NSLayoutAttributeHeight
                                                        relatedBy:NSLayoutRelationEqual
                                                        toItem:nil
                                                        attribute:NSLayoutAttributeNotAnAttribute
                                                        multiplier:0.0
                                                        constant:310];
        [keyboardHeightConstraint setPriority:UILayoutPriorityDefaultHigh];
        [self.view addConstraints:@[keyboardHeightConstraint]];
    
        self.nextKeyboardButton = [UIButton buttonWithType:UIButtonTypeSystem];
    
        [self.nextKeyboardButton setTitle:NSLocalizedString(@"Next Keyboard", @"Title for 'Next Keyboard' button") forState:UIControlStateNormal];
        [self.nextKeyboardButton sizeToFit];
        self.nextKeyboardButton.translatesAutoresizingMaskIntoConstraints = NO;
    
        [self.nextKeyboardButton addTarget:self action:@selector(advanceToNextInputMode) forControlEvents:UIControlEventTouchUpInside];
    
        [keysView addSubview:self.nextKeyboardButton];
        // (5)
        NSLayoutConstraint *nextKeyboardButtonLeftSideConstraint = [NSLayoutConstraint constraintWithItem:self.nextKeyboardButton attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:keysView attribute:NSLayoutAttributeLeft multiplier:1.0 constant:0.0];
        NSLayoutConstraint *nextKeyboardButtonBottomConstraint = [NSLayoutConstraint constraintWithItem:self.nextKeyboardButton attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:keysView attribute:NSLayoutAttributeBottom multiplier:1.0 constant:0.0];
        [keysView addConstraints:@[nextKeyboardButtonLeftSideConstraint, nextKeyboardButtonBottomConstraint]];
        // (4)
        keysView.frame = CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height);
        // (2)
        [self.view addSubview:keysView];
    }
    
    - (void)dealloc {
        self.nextKeyboardButton = nil;
    }
    
    @end