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在横向模式下大小错误的主要内容,如果未能解决你的问题,请参考以下文章