web-dev-qa-db-ja.com

iOS 8のカスタムキーボードエクステンションで方向の変更を検出する方法は?

Custom Keyboard Extensionでは、使用できません

`didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation` 

およびsharedApplication

回転するときにキーボードでポートレートまたはランドスケープを検出する必要があります。

カスタムキーボード拡張機能で方向が変化したことを検出するにはどうすればよいですか?

39
Fire Fist

向きが変わったときにカスタムキーボードを更新するには、viewDidLayoutSubviewsUIInputViewControllerをオーバーライドします。私が知る限り、回転が発生すると、このメソッドは常に呼び出されます。

さらに、従来の[UIApplication sharedApplication] statusBarOrientation]は機能しません。現在の方向を判断するには、次のスニペットを使用します。

if([UIScreen mainScreen].bounds.size.width < [UIScreen mainScreen].bounds.size.height){
    //Keyboard is in Portrait
}
else{
    //Keyboard is in Landscape
}

これがお役に立てば幸いです!

40
Matt

非推奨ではなく、どのデバイス画面サイズでも機能します(将来の画面サイズを含む 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");
    }
}
25
Albert Renshaw

画面の幅を見るだけの簡単な方法があります。

 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;
4
Sam Mithani

viewController内でviewWillTransitionToSize:(CGSize)size withTransitionCoordinator:を使用します

2
taffarel

場合によっては、[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");
}
1
Wanpaya
- (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];
}
1
Lu Hai Tu

willRotateToInterfaceOrientationdidRotateFromInterfaceOrientationを使用できます。iOS8.1でキーボードを実行しているiPadでこれを試しました。これらはiOS 8では非推奨ですが、代わりにwillTransitionToTraitCollectionは呼び出されませんが、回転してもキーボードの特性コレクションが変更されない可能性が高いことに注意してください。

1
Jordan H

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

非推奨です。

1
Vince Yuan