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

Posted

技术标签:

【中文标题】IOS Customkeyboard在横向模式下大小错误【英文标题】:IOS Customkeyboard getting wrong size in Landscape mode 【发布时间】:2015-08-07 07:49:40 【问题描述】:

我正在开发自定义键盘。一切正常,但是当我将键盘旋转到横向模式时,键盘会正确加载,但它需要纵向模式键盘视图的高度。

这是我的尝试:

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

【问题讨论】:

您最好不要继续删除和添加高度约束。而是第一次添加它,然后使用:self.heightConstraint.constant=expandedHeight 简单地更改它的值。然后您需要使用[self.view setNeedsLayout] 将视图标记为需要布局,然后执行[self.view layoutIfNeeded] 感谢重播@RoryMcKinnel。你能详细解释一下吗?我是第一次制作自定义键盘? 【参考方案1】:

如果您在 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()

【讨论】:

pated :- 我已经按照你说的做了,但是如果我删除了程序约束,那么我的键盘将在纵向模式下被剪切。 @BadalShah 你能否分享你的代码(viewdidload 方法),你如何在你的类中加载笔尖,因为我只加载笔尖而不为布局做任何其他代码,我的键盘工作正常所有设备【参考方案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];
  

【讨论】:

我按照你说的写了,但是我的纵向键盘尺寸变小了,因为我需要更大尺寸的纵向键盘。请检查已编辑的问题。 我认为您对 isPortrait 的计算有疑问。在您的代码中,使用传递的大小来计算方向,而不是屏幕边界,在过渡发生之前可能不会改变。 我使用了不同的 .XIB 用于纵向(左侧和右侧键盘)和横向模式键盘。我总共使用了 3 个 .XIB。 更新了修正的方向方法来计算方向。我认为你原来依赖屏幕边界的可能是错误的。 ios8 版本告诉你新的size,所以代码使用它。 iOS7 版本会告诉您新的方向,因此新代码会使用它。你能出示LoadKeyboardview 的代码吗?当方向改变时,听起来你正在用刚才所说的替换键盘?只要 self.view 没有更改,代码应该仍然可以,因为这是应用约束的地方。 仍然得到相同的结果。纵向键盘大小未增加。

以上是关于IOS Customkeyboard在横向模式下大小错误的主要内容,如果未能解决你的问题,请参考以下文章

滚动条在 IOS APP 中未以横向模式显示

导航栏在横向模式下向上移动 - iOS

AS3 - 仅 iOS 强制横向模式?

iOS 13 目前的 VC 模式在横向模式下不起作用

尝试在 iOS 8 中以横向模式而不是纵向模式显示键盘

iOS 8 UIImagePickerController 在横向模式下具有黑色预览