IOS Customkeyboard在横向模式下获取错误的大小

我正在使用自定义键盘。 所有作品完美,但是当我将键盘旋转到风景模式正确的键盘加载,但它需要肖像模式keyboardview的高度。

景观键盘采取错误的大小

这是我的尝试:

@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的键盘devise中使用“自动布局”,那么就不需要添加高度限制,它会根据默认的键盘大小自动调整。我只是加载视图,而不是添加任何高度的限制,我工作正常所有设备。

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