How to detect Orientation Change in Custom Keyboard Extension in iOS 8?

后端 未结 10 1874

In Custom Keyboard Extension , we can\'t use

`didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation` 

and

相关标签:
10条回答
  • 2020-12-04 18:15

    willRotateToInterfaceOrientation and didRotateFromInterfaceOrientation can be used, I just tried this on my iPad running a keyboard on iOS 8.1. Note that those are deprecated in iOS 8, but their replacement, willTransitionToTraitCollection, isn't called though likely because the trait collection doesn't change for the keyboard upon rotation.

    0 讨论(0)
  • 2020-12-04 18:15

    Before iOS 8.3, you have to use

    -(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
                                   duration:(NSTimeInterval)duration
    

    This one does not work (it should be a bug):

    -(void)viewWillTransitionToSize:(CGSize)size
          withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
    

    On iOS 8.3 and later, you'd better use

    -(void)viewWillTransitionToSize:(CGSize)size
          withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
    

    because

    -(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
                                   duration:(NSTimeInterval)duration
    

    is deprecated.

    0 讨论(0)
  • 2020-12-04 18:21
    - (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];
    }
    
    0 讨论(0)
  • 2020-12-04 18:22

    for those who are searching for the answer in Swift 5.

    by override func didRotate(from fromInterfaceOrientation: UIInterfaceOrientation) method. you can detect device orientation.

    here is the code for my custom keyboard.

    override func didRotate(from fromInterfaceOrientation: UIInterfaceOrientation) {
            let screen = UIScreen.main.bounds
            if screen.width < screen.height {
                print("!!! portrait")
                let constraintForHeight:NSLayoutConstraint = NSLayoutConstraint(item: mainView!, attribute: NSLayoutConstraint.Attribute.height, relatedBy: NSLayoutConstraint.Relation.equal, toItem: nil, attribute: NSLayoutConstraint.Attribute.notAnAttribute, multiplier: 0, constant: 325)
                constraintForHeight.isActive = true
                constraintForHeight.priority = UILayoutPriority.defaultHigh
                self.inputView?.addConstraint(constraintForHeight)
            } else {
                print("!!! landspace")
                let constraintForHeight:NSLayoutConstraint = NSLayoutConstraint(item: mainView!, attribute: NSLayoutConstraint.Attribute.height, relatedBy: NSLayoutConstraint.Relation.equal, toItem: nil, attribute: NSLayoutConstraint.Attribute.notAnAttribute, multiplier: 0, constant: 210)
                constraintForHeight.isActive = true
                constraintForHeight.priority = UILayoutPriority.defaultHigh
                self.inputView?.addConstraint(constraintForHeight)
            }
        }
    
    0 讨论(0)
  • 2020-12-04 18:27

    Non-deprecated and will work on any device screen size (including future screen sizes Apple will be releasing this year).



    In 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");
    }
    

    done.










    Or..................

    For a more easy to read version of this code:

    -(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");
        }
    }
    
    0 讨论(0)
  • 2020-12-04 18:27

    In somecase [UIScreen mainscreen].bounds may not work. Sometimes it will update after viewWillTransitionToSize:

    Try this

    - (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");
    }
    
    0 讨论(0)
提交回复
热议问题