IOS Customkeyboard получает неправильный размер в ландшафтном режиме

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

Горизонтальная клавиатура имеет неправильный размер

Вот моя попытка:

  @interface KeyboardViewController ()
{
CGFloat expandedHeight ;
BOOL isPortrait;
}
@property(strong,nonatomic)keyboardLayout *ObjKeyLayout;
 - (void)updateViewConstraints {
[super updateViewConstraints];
[self updateCustomHeight];
}
 -(void)updateCustomHeight
{


if (self.heightConstraint != nil) {
    [self.view removeConstraint:self.heightConstraint];
    [self.view layoutIfNeeded];
}
if(isPortrait)
{
    expandedHeight = 258;
}
else
{

    expandedHeight = 156;
}
self.heightConstraint = [NSLayoutConstraint constraintWithItem:self.view      attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:0.0 constant: expandedHeight];
[self.view addConstraint:self.heightConstraint];
[self.view layoutIfNeeded];
}
- (void)deviceOrientationDidChange:(NSNotification *)notification
{
NSLog(@"key");
if([UIScreen mainScreen].bounds.size.width < [UIScreen mainScreen].bounds.size.height){
    //Keyboard is in Portrait
    isPortrait=YES;
    isp=YES;
    [self LoadKeyboardview];
    [self updateCustomHeight];

}
else{

    isPortrait=NO;

    [self LoadKeyboardview];
    [self updateCustomHeight];

    //Keyboard is in Landscape
  }
  -(void)initiateOrientation
{
CGSize screenSize = [[UIScreen mainScreen] bounds].size;
 if([UIScreen mainScreen].bounds.size.width < [UIScreen mainScreen].bounds.size.height){
    //Keyboard is in Portrait
    isPortrait=YES;
    [self LoadKeyboardview];
}
else{
     isPortrait=NO;
    [self LoadKeyboardview];
  //Keyboard is in Landscape
}
 - (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
{
if([UIScreen mainScreen].bounds.size.width < [UIScreen mainScreen].bounds.size.height){
    //Keyboard is in Portrait
    isPortrait=YES;
    [self LoadKeyboardview];
    [self updateCustomHeight];
    }
else{
     isPortrait=NO;
    [self LoadKeyboardview];
    [self updateCustomHeight];
     //Keyboard is in Landscape
 }
}
-(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
if([UIScreen mainScreen].bounds.size.width < [UIScreen mainScreen].bounds.size.height){
    //Keyboard is in Portrait
    isPortrait=YES;
     [self LoadKeyboardview];
    [self updateCustomHeight];
    }
else{
    isPortrait=NO;
     [self LoadKeyboardview];
    [self updateCustomHeight];
    }
   }
  - (NSLayoutConstraint*)findViewHeightConstraint {
NSArray *constraints = self.view.superview.constraints;
for ( NSLayoutConstraint *constraint in constraints ) {
    if ( constraint.firstItem == self.view
        && constraint.firstAttribute == NSLayoutAttributeHeight )
        return constraint;
}
[self updateCustomHeight];
return nil;
 }
 - (void)viewWillLayoutSubviews {
[super viewWillLayoutSubviews];
// Update height when rotating
  [self updateCustomHeight];
   }

РЕДАКТИРОВАТЬ: портретный режим

введите здесь описание изображения

РЕДАКТИРОВАТЬ:-

     @implementation KeyboardViewController
      - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
    // Perform custom initialization work here
    self.portraitHeight = 256;
    self.landscapeHeight = 162;
  }
  return self;
    }

 - (void)viewDidLoad {
   [super viewDidLoad];

    // [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];

[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(deviceOrientationDidChange:) name: UIDeviceOrientationDidChangeNotification object: nil];



[self copyDatabaseIfNeeded];

NumKey=[[NSArray alloc]initWithObjects:@"1", @"2", @"3", @"4", @"5", @"6", @"7", @"8", @"9", @"0", @"-", @"/", @":", @";", @"(", @")", @"$", @"&", @"@", @"\"", @".", @",", @"?", @"!",@"'",@"^", nil];

arrAlphabet=[[NSArray alloc]initWithObjects:@"q", @"w", @"e", @"r", @"t", @"y", @"u", @"i", @"o", @"p", @"a", @"s", @"d", @"f", @"g", @"h", @"j", @"k", @"l", @"z", @"x", @"c", @"v", @"b",@"n",@"m", nil];

arrKeyImages=[[NSArray alloc]initWithObjects:@"Q_key.png", @"W_key.png", @"E_key.png", @"R_key.png", @"T_key.png", @"Y_key.png", @"U_key.png", @"I_key.png", @"O_key.png", @"P_key.png", @"A_key.png", @"S_key.png", @"D_key.png", @"F_key.png", @"G_key.png", @"H_key.png", @"J_key.png", @"K_key.png", @"L_key.png", @"Z_key.png", @"X_key.png", @"C_key.png", @"V_key.png", @"B_key.png",@"N_key.png",@"M_key.png", nil];



keyIpad=[[NSArray alloc]initWithObjects:@"Q_Land_key.png", @"W_Land_key.png", @"E_Land_key.png", @"R_Land_key.png", @"T_Land_key.png", @"Y_Land_key.png", @"U_Land_key.png", @"I_Land_key.png", @"O_Land_key.png", @"P_Land_key.png", @"A_Land_key.png", @"S_Land_key.png", @"D_Land_key.png", @"F_Land_key.png", @"G_Land_key.png", @"H_Land_key.png", @"J_Land_key.png", @"K_Land_key.png", @"L_Land_key.png", @"Z_Land_key.png", @"X_Land_key.png", @"C_Land_key.png", @"V_Land_key.png", @"B_Land_key.png",@"N_Land_key.png",@"M_Land_key.png", nil];


  arrspecialImageKey=[[NSArray alloc]initWithObjects:@"1_key.png", @"2_key.png", @"3_key.png", @"4_key.png", @"5_key.png", @"6_key.png", @"7_key.png", @"8_key.png", @"9_key.png", @"0_key.png", @"desh_key.png", @"slash.png", @"shift_shemi.png", @"semi.png", @"left_brecket.png", @"right_breacket.png", @"doller_key.png", @"and_key.png", @"AtTherate.png", @"dobleComma.png", @"dot.png",@"singel_comma.png",@"question_mark.png", @"exemlaration.png", @"single_uppar_comma.png",@"upparArrow.png", nil];


  arrSpecialIpad=[[NSArray alloc]initWithObjects:@"1_Land_key.png", @"2_Land_key.png", @"3_Land_key.png", @"4_Land_key.png", @"5_Land_key.png", @"6_Land_key.png", @"7_Land_key.png", @"8_Land_key.png", @"9_Land_key.png", @"0_Land_key.png", @"Dash_Land_key.png", @"slash_Land_key.png", @"shif_semi_Land_key", @"semi_Land_key", @"left_brecket_Land_key.png", @"right_Land_key.png", @"doller_Land_key.png", @"and_Land_key.png", @"attherate_Land_key.png", @"dobblecomma_Land_key", @"dot_Land_key.png",@"comma.png",@"question.png", @"exemeleter.png", @"uppar_comma.png",@"upArrow.png", nil];

 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];

 [self.view addSubview:self.nextKeyboardButton];
 self.nextKeyboardButton.hidden=YES;

   NSLayoutConstraint *nextKeyboardButtonLeftSideConstraint = [NSLayoutConstraint constraintWithItem:self.nextKeyboardButton attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeLeft multiplier:1.0 constant:0.0];
   NSLayoutConstraint *nextKeyboardButtonBottomConstraint = [NSLayoutConstraint constraintWithItem:self.nextKeyboardButton attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeBottom multiplier:1.0 constant:0.0];
   [self.view addConstraints:@[nextKeyboardButtonLeftSideConstraint, nextKeyboardButtonBottomConstraint]];


  self.heightConstraint = [NSLayoutConstraint constraintWithItem:self.view attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:0.0 constant:self.portraitHeight];


    // Perform custom UI setup here

    }
    - (void)deviceOrientationDidChange:(NSNotification *)notification
 {
self.heightConstraint.constant=expandedHeight;
   NSLog(@"key");
   if([UIScreen mainScreen].bounds.size.width < [UIScreen mainScreen].bounds.size.height){
    //Keyboard is in Portrait
    isPortrait=YES;
    isp=YES;
    [self LoadKeyboardview];
    [self updateCustomHeight];

}
else{

    isPortrait=NO;

    [self LoadKeyboardview];
    [self updateCustomHeight];
 }
  - (NSLayoutConstraint*)findViewHeightConstraint {
NSArray *constraints = self.view.superview.constraints;
for ( NSLayoutConstraint *constraint in constraints ) {
    if ( constraint.firstItem == self.view
        && constraint.firstAttribute == NSLayoutAttributeHeight )
        return constraint;
   }
 //  [self updateCustomHeight];
   return nil;
 }

person Badal Shah    schedule 07.08.2015    source источник
comment
Вам было бы лучше не удалять и не добавлять ограничение по высоте. Вместо этого добавьте его в первый раз, а затем просто измените его значение, используя: self.heightConstraint.constant=expandedHeight. Затем вам нужно пометить вид как нуждающийся в макете, используя [self.view setNeedsLayout], затем выполните [self.view layoutIfNeeded].   -  person Rory McKinnel    schedule 07.08.2015
comment
спасибо за повтор @RoryMcKinnel. можете ли вы объяснить это подробно. я впервые делаю клавиатуру на заказ?   -  person Badal Shah    schedule 07.08.2015


Ответы (2)


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

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

Обновлены ваши методы следующим образом:

- (void)viewWillTransitionToSize:(CGSize)size 
       withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator{
  if (size.width < size.height){
    //Keyboard is in Portrait
    isPortrait=YES;
    [self LoadKeyboardview];
    [self updateCustomHeight];
  }
  else{
    // New orientation is landscape
    isPortrait=NO;
    [self LoadKeyboardview];
    [self updateCustomHeight];
 }
}


-(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation 
                               duration:(NSTimeInterval)duration{
  if (toInterfaceOrientation == UIInterfaceOrientationPortrait ||
      toInterfaceOrientation == UIInterfaceOrientationPortraitUpsideDown){
    //Keyboard will be Portrait
    isPortrait=YES;
    [self LoadKeyboardview];
    [self updateCustomHeight];
  }
  else{
    //Keyboard will be Landscape
    isPortrait=NO;
     [self LoadKeyboardview];
    [self updateCustomHeight];
  }
}

-(void)updateCustomHeight
{
  if(isPortrait){
    expandedHeight = 258;
  }
  else{
    expandedHeight = 156;
  }

  // If no constraint add one, or if one exists update it only
  // if the height needs to change.
  if (self.heightConstraint == nil) {
    self.heightConstraint = 
      [NSLayoutConstraint constraintWithItem:self.view      
                                   attribute:NSLayoutAttributeHeight 
                                   relatedBy:NSLayoutRelationEqual toItem:nil 
                                   attribute:NSLayoutAttributeNotAnAttribute 
                                  multiplier:0.0 
                                    constant:expandedHeight];
    [self.view addConstraint:self.heightConstraint];
    [self.view setNeedsLayout];
    [self.view layoutIfNeeded];
  }
  else if (self.heightConstraint.constant != expandedHeight){
    self.heightConstraint.constant = expandedHeight;
    [self.view setNeedsLayout];
    [self.view layoutIfNeeded];
  }
}
person Rory McKinnel    schedule 07.08.2015
comment
я написал, как вы сказали, но тогда я получаю меньший размер на своей портретной клавиатуре, где мне нужно больше размера для портретной клавиатуры. пожалуйста, проверьте отредактированный вопрос. - person Badal Shah; 07.08.2015
comment
Я думаю, у вас проблема с вычислением isPortrait. В вашем коде используйте размер, переданный для определения ориентации, а не границы экрана, которые могут не измениться до тех пор, пока не произойдет переход. - person Rory McKinnel; 07.08.2015
comment
Я использовал разные .XIB для портретной (левая и правая боковая клавиатура) и клавиатуры в ландшафтном режиме. Всего я использовал 3 .XIB. - person Badal Shah; 07.08.2015
comment
Обновлен с пересмотренными методами ориентации для определения ориентации. Я думаю, что ваши оригинальные, полагающиеся на границы экрана, возможно, были неправильными. Версия iOS8 сообщает вам новый size, поэтому код использует его. Версия iOS7 сообщает вам новую ориентацию, поэтому новый код использует ее. Можете ли вы показать свой код для LoadKeyboardview? Похоже, вы заменяете клавиатуру из того, что вы только что сказали, когда меняется ориентация? Код по-прежнему должен быть в порядке, пока self.view не изменяется, поскольку именно здесь применяется ограничение. - person Rory McKinnel; 07.08.2015
comment
Все еще получаю тот же результат. Размер портретной клавиатуры не увеличен. - person Badal Shah; 07.08.2015
comment
Это неправильная высота при запуске в портретном режиме или также при повороте по горизонтали, а затем повернуть назад? Высота вообще меняется? Если только при запуске на портрете, это может быть потому, что isPortrait не инициализируется как YES. - person Rory McKinnel; 07.08.2015
comment
портретный и ландшафтный режимы имеют одинаковый размер при просмотре с клавиатуры. если я изменю размер портретного режима, то ландшафтный размер клавиатуры также изменится. - person Badal Shah; 07.08.2015
comment
@BadalShah Я бы поставил точки разрыва в строках, где установлена ​​константа ограничения или где ограничение добавлено и установлено, и посмотрел бы на устанавливаемые значения, чтобы увидеть, используются ли правильные высоты. Тогда вы узнаете, работает ли этот код или нет. Скажите, пожалуйста, так это или нет. Если нет, то это ваша проблема, в противном случае хорошая новость заключается в том, что код кажется правильным, а что-то еще мешает изменению размера. Проверьте консоль отладки на наличие ошибок неудовлетворенных ограничений. Возможно, у вас есть другое ограничение, которое конфликтует. - person Rory McKinnel; 07.08.2015
comment
@BadalShah Как вы справились со своей проблемой? - person Rory McKinnel; 11.08.2015
comment
Спасибо за помощь. я установил ограничение для увеличения высоты в методе viewdidappear. - person Badal Shah; 11.08.2015

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

 override func viewDidLoad() {
        super.viewDidLoad()
        let nib = UINib(nibName: "VSPKeyboardViewController", bundle: nil)
        let objects = nib.instantiateWithOwner(self, options: nil)
        view = objects[0] as! UIView

}

override func updateViewConstraints() {
        super.updateViewConstraints()
}
person VSP    schedule 07.08.2015
comment
pated: - Я сделал, как вы сказали, но если я удалю программные ограничения, моя клавиатура будет обрезана в портретном режиме. - person Badal Shah; 07.08.2015
comment
@BadalShah Не могли бы вы поделиться своим кодом (метод viewdidload), как вы загружаете перо в свой класс, потому что я загружаю только перо и не делаю никакого другого кода для макета, и моя клавиатура отлично работает на всех устройствах. - person VSP; 07.08.2015