Проблема с загрузкой пользовательской клавиатуры iOS

Я создаю пользовательскую клавиатуру на iOS, используя Objective-C. Чтобы увеличить высоту клавиатуры, чтобы сделать ее такой же, как высота клавиатуры по умолчанию (с панелью предложений) как для книжной, так и для альбомной ориентации, я программно добавил ограничения по высоте {я удалил ранее добавленное ограничение перед добавлением нового}.

Я обновляю высоту в методе viewWillLayoutSubviews класса, чтобы при изменении ориентации достигалась желаемая высота клавиатуры, и она работала отлично.

Но моя проблема заключается в том, что при изменении ориентации представление автоматически не отображается идеально, как на клавиатуре по умолчанию в iOS, а изменяется представление, а затем обновляет высоту, а затем расширяется вправо от экрана, чтобы покрыть всю область. (в основном рывок происходит до полной загрузки клавиатуры)

Кроме того, при инициализации клавиатуры представление загружается с высотой по умолчанию, а затем обновляет пользовательскую высоту. После этого он применяет ограничение автоматической компоновки и обновляет пользовательский интерфейс, тем самым обеспечивая полную компоновку экрана клавиатуры. Весь процесс выглядит немного дергано.

Я использую xib с автоматической компоновкой. Если я не обновлю пользовательскую высоту клавиатуры, вышеупомянутые рывки будут решены, но высота клавиатуры останется по умолчанию, разрешенной Apple.

Другое дело, что в XIB много просмотров и, следовательно, много ограничений. Если я удалю ограничения, клавиатура загружается довольно быстро, а также достигается пользовательская высота. Но как только я поворачиваю устройство, вид не раскладывается, и я застреваю с половиной клавиатуры на экране.

Любое предложение было бы здорово!


person Neelanshu    schedule 06.04.2015    source источник


Ответы (1)


 - (id)initWithCoder:(NSCoder *)aDecoder {
        self = [super initWithCoder:aDecoder];
        if (self) {
            // Perform custom initialization work here

            if (IS_IPAD) {
                self.portraitHeight = 300;
                self.landscapeHeight = 300;
            }else{
                self.portraitHeight = 257;
                self.landscapeHeight = 203;
            }
        }
        return self;
    }

    - (void)updateViewConstraints {
        [super updateViewConstraints];

        // Add custom view sizing constraints here
        if (_viewWillAppearExecuted)
            [self adjustHeight];

       }
    -(void)viewWillAppear:(BOOL)animated{
        [super viewWillAppear:YES];

        [self.view addConstraint:self.heightConstraint];
        _viewWillAppearExecuted = YES;
    }
    #pragma mark - Setters/Getters

    - (NSLayoutConstraint *)heightConstraint
    {
        if (!_heightConstraint) {
            _heightConstraint = [NSLayoutConstraint constraintWithItem:self.view attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:0.0 constant:self.portraitHeight];

            _heightConstraint.priority = UILayoutPriorityRequired - 1;
        }

        return _heightConstraint;
    }


    #pragma mark - Methods

    - (void)adjustHeight
    {
        if (self.view.frame.size.width == 0 || self.view.frame.size.height == 0)
            return;

        [self.view removeConstraint:self.heightConstraint];
    //    [self.imageView removeConstraint:self.heightConstraint];
        CGSize screenSize = [[UIScreen mainScreen] bounds].size;
        CGFloat screenH = screenSize.height;
        CGFloat screenW = screenSize.width;
        BOOL isLandscape =  !(self.view.frame.size.width ==
                              (screenW*(screenW<screenH))+(screenH*(screenW>screenH)));

        self.isLandscape = isLandscape;
        if (isLandscape) {
            self.heightConstraint.constant = self.landscapeHeight;
    //        [self.imageView addConstraint:self.heightConstraint];
            [self.view addConstraint:self.heightConstraint];
        } else {
            self.heightConstraint.constant = self.portraitHeight;
    //        [self.imageView addConstraint:self.heightConstraint];
            [self.view addConstraint:self.heightConstraint];
        }
    }

Попробуйте эти коды для вашей проблемы. Прежде всего, проведите исследования и разработки с этим кодом и дайте мне знать.

person Syed Sadrul Ullah Sahad    schedule 11.09.2017
comment
также добавьте эти свойства (неатомарные) CGFloat PortraitHeight; свойство (неатомарное) CGFloat landscapeHeight; свойство (неатомарное) BOOL isLandscape; свойство (неатомарное) NSLayoutConstraint *heightConstraint; @property (неатомарное) BOOL viewWillAppearExecuted; - person Syed Sadrul Ullah Sahad; 11.09.2017