Custom Keyboard Extensionでは、使用できません
`didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation`
およびsharedApplication
。
回転するときにキーボードでポートレートまたはランドスケープを検出する必要があります。
カスタムキーボード拡張機能で方向が変化したことを検出するにはどうすればよいですか?
向きが変わったときにカスタムキーボードを更新するには、viewDidLayoutSubviews
のUIInputViewController
をオーバーライドします。私が知る限り、回転が発生すると、このメソッドは常に呼び出されます。
さらに、従来の[UIApplication sharedApplication] statusBarOrientation]
は機能しません。現在の方向を判断するには、次のスニペットを使用します。
if([UIScreen mainScreen].bounds.size.width < [UIScreen mainScreen].bounds.size.height){
//Keyboard is in Portrait
}
else{
//Keyboard is in Landscape
}
これがお役に立てば幸いです!
非推奨ではなく、どのデバイス画面サイズでも機能します(将来の画面サイズを含む Appleは今年リリース予定 )。
CustomKeyboardViewController.m
:
-(void)viewDidLayoutSubviews {
NSLog(@"%@", (self.view.frame.size.width == ([[UIScreen mainScreen] bounds].size.width*([[UIScreen mainScreen] bounds].size.width<[[UIScreen mainScreen] bounds].size.height))+([[UIScreen mainScreen] bounds].size.height*([[UIScreen mainScreen] bounds].size.width>[[UIScreen mainScreen] bounds].size.height))) ? @"Portrait" : @"Landscape");
}
できた。
または..................
このコードのより読みやすいバージョンの場合:
-(void)viewDidLayoutSubviews {
int appExtensionWidth = (int)round(self.view.frame.size.width);
int possibleScreenWidthValue1 = (int)round([[UIScreen mainScreen] bounds].size.width);
int possibleScreenWidthValue2 = (int)round([[UIScreen mainScreen] bounds].size.height);
int screenWidthValue;
if (possibleScreenWidthValue1 < possibleScreenWidthValue2) {
screenWidthValue = possibleScreenWidthValue1;
} else {
screenWidthValue = possibleScreenWidthValue2;
}
if (appExtensionWidth == screenWidthValue) {
NSLog(@"portrait");
} else {
NSLog(@"landscape");
}
}
画面の幅を見るだけの簡単な方法があります。
double width = [[UIScreen mainScreen] bounds].size.width;
double interfaceWidth = MIN([[UIScreen mainScreen] bounds].size.width, [[UIScreen mainScreen] bounds].size.height);
BOOL isPortrait = (width == interfaceWidth) ? YES : NO;
viewController内でviewWillTransitionToSize:(CGSize)size withTransitionCoordinator:
を使用します
場合によっては、[UIScreen mainscreen] .boundsが機能しないことがあります。 viewWillTransitionToSizeの後に更新される場合があります。
これを試して
- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator{
CGSize screenSize = [[UIScreen mainScreen] bounds].size;
CGFloat realScreenHeight = MAX(screenSize.height, screenSize.width);
if(size.width == realScreenHeight)
NSLog(@"Landscape");
else
NSLog(@"Portrait");
}
- (void)updateViewConstraints {
[super updateViewConstraints];
// Add custom view sizing constraints here
if (self.view.frame.size.width == 0 || self.view.frame.size.height == 0)
return;
[self.inputView removeConstraint:self.heightConstraint];
CGSize screenSize = [[UIScreen mainScreen] bounds].size;
CGFloat screenH = screenSize.height;
CGFloat screenW = screenSize.width;
BOOL isLandscape = !(self.view.frame.size.width ==
(screenW*(screenW<screenH))+(screenH*(screenW>screenH)));
NSLog(isLandscape ? @"Screen: Landscape" : @"Screen: Potriaint");
self.isLandscape = isLandscape;
if (isLandscape) {
self.heightConstraint.constant = self.landscapeHeight;
[self.inputView addConstraint:self.heightConstraint];
} else {
self.heightConstraint.constant = self.portraitHeight;
[self.inputView addConstraint:self.heightConstraint];
}
//trigger default first view
[btn_gif sendActionsForControlEvents: UIControlEventTouchUpInside];
}
willRotateToInterfaceOrientation
とdidRotateFromInterfaceOrientation
を使用できます。iOS8.1でキーボードを実行しているiPadでこれを試しました。これらはiOS 8では非推奨ですが、代わりにwillTransitionToTraitCollection
は呼び出されませんが、回転してもキーボードの特性コレクションが変更されない可能性が高いことに注意してください。
IOS 8.3より前では、使用する必要があります
-(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
duration:(NSTimeInterval)duration
これは機能しません(バグのはずです):
-(void)viewWillTransitionToSize:(CGSize)size
withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
IOS 8.3以降では、使用した方が良いでしょう
-(void)viewWillTransitionToSize:(CGSize)size
withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
なぜなら
-(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
duration:(NSTimeInterval)duration
非推奨です。