IOS 自定义键盘在横向模式下尺寸错误

IOS Customkeyboard getting wrong size in Landscape mode

我正在开发自定义键盘。一切都很完美,但是当我将键盘旋转到横向模式时,键盘加载正确,但它占用了纵向模式键盘视图的高度。

这是我的尝试:

  @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;
 }

你最好不要一直删除和添加高度限制。而是第一次添加它,然后简单地更改它的值并将视图设置为需要布局,然后进行布局。

还认为您可能在转换发生之前使用边界计算出错误的方向。

更新您的方法如下:

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

如果你在 xib 的键盘设计中使用 "auto layout" 则无需添加高度约束,它会根据默认键盘自动调整 size.I 只需加载视图而不添加任何高度constraint 和 i 在所有设备上对我来说都很好。

 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()
}