Các định hướng được hỗ trợ không có định hướng chung với ứng dụng và nênAutorotate đang trả về CÓ '


92

Ứng dụng của tôi (iPad; iOS 6) là một ứng dụng chỉ nằm ngang, nhưng khi tôi thử sử dụng UIPopoverController để hiển thị thư viện ảnh, nó sẽ xuất hiện lỗi này: Supported orientations has no common orientation with the application, and shouldAutorotate is returning YES.Tôi đã thử thay đổi rất nhiều mã xung quanh nhưng không gặp may.


1
bạn nên chấp nhận một câu trả lời. có rất nhiều người để được giúp đỡ và đối với những người khác có cùng vấn đề, điều đó sẽ giúp ích khi bạn đánh dấu câu trả lời chính xác cho vấn đề của mình!
brush 51

1
Không! không có công việc giải pháp trên iOS 7 :( (headbang)
AsifHabib

Câu trả lời hay nhất ở đây stackoverflow.com/questions/20468335/…
Damien Romito

Câu trả lời:


94

Trong IOS6, bạn đã hỗ trợ các hướng giao diện ở ba nơi:

  1. .Plist (hoặc Màn hình Tóm tắt Mục tiêu)
  2. UIApplicationDelegate của bạn
  3. UIViewController đang được hiển thị

Nếu bạn gặp lỗi này thì rất có thể là do chế độ xem bạn đang tải trong UIPopover chỉ hỗ trợ chế độ dọc. Điều này có thể do Game Center, iAd hoặc do chính bạn gây ra.

Nếu đó là chế độ xem của riêng bạn, bạn có thể khắc phục bằng cách ghi đè các hỗ trợInterfaceOrientations trên UIViewController của bạn:

- (NSUInteger) supportedInterfaceOrientations
{
     //Because your app is only landscape, your view controller for the view in your
     // popover needs to support only landscape
     return UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight;
}

Nếu đó không phải là chế độ xem của riêng bạn (chẳng hạn như GameCenter trên iPhone), bạn cần đảm bảo rằng .plist của bạn hỗ trợ chế độ dọc. Bạn cũng cần đảm bảo UIApplicationDelegate của mình hỗ trợ các dạng xem được hiển thị ở chế độ dọc. Bạn có thể làm điều này bằng cách chỉnh sửa .plist của mình và sau đó ghi đè hỗ trợInterfaceOrientation trên UIApplicationDelegate của bạn:

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
    return UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight;
}

3
UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRightbằng UIInterfaceOrientationMaskAllButUpsideDown UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRightbằngUIInterfaceOrientationMaskLandscape
Valerii Pavlov

4
Hoặc chỉ sử dụng UIInterfaceOrientationMaskAll.
Mark Wang

Hoàn hảo. Mặc dù cửa sổ bật lên "chỉ dọc" sẽ hoạt động ở chế độ ngang, nhưng nó không thể hiển thị bộ điều khiển chế độ xem chỉ ngang theo phương thức.
Neal Ehardt

Không! Giải pháp không làm việc trên iOS 7 :(. Stackoverflow.com/questions/23005351/...
AsifHabib

Hoạt động trên iOS 8. Tuy nhiên, phải thêm hỗ trợ dọc cho plist. Cảm ơn bạn.
Yaroslav

65

Sau khi dành nhiều thời gian tìm kiếm cách để tránh phân lớp và thêm hàng tấn mã, đây là giải pháp mã một dòng của tôi.

Tạo một danh mục mới của UIImagePickerController và thêm

-(BOOL)shouldAutorotate{
    return NO;
}

Đó là tất cả mọi người!


1
Làm việc cho tôi cũng vậy, chưa được kiểm tra đầy đủ nhưng dường như đã làm được điều đó.
migs647

2
Đây có vẻ là giải pháp tốt nhất.
Julian

2
Làm! Điều này thật tuyệt và nó thực sự đã giúp tôi vượt qua khó khăn. Cảm ơn Tiến sĩ Luiji !!
brack 7/12/12

1
Đẹp. Hoạt động đối với tôi trên iOS 6. Bạn cũng có thể đặt cấu hình này trong danh mục để hoàn toàn linh hoạt.
Jared Egan

3
không hoạt động trong iOS7, phương pháp danh mục không còn được gọi là (mặc dù bao gồm trong pch)
Peter Lapisu

43

Có một trường hợp khác, thông báo lỗi này có thể xuất hiện. Tôi đã tìm kiếm hàng giờ cho đến khi tôi tìm ra vấn đề. Chủ đề này rất hữu ích sau khi đọc nó một vài lần.

Nếu bộ điều khiển chế độ xem chính của bạn được xoay sang hướng ngang và bạn gọi bộ điều khiển chế độ xem phụ tùy chỉnh sẽ được hiển thị theo hướng dọc, thông báo lỗi này có thể xảy ra khi mã của bạn trông giống như sau:

- (NSUInteger)supportedInterfaceOrientations {

    return UIInterfaceOrientationPortrait;
}

Cái bẫy ở đây là intellisense của xcode đề xuất "UIInterfaceOrientationPortrait" và tôi không quan tâm đến nó. Thoạt nhìn điều này có vẻ đúng.

Mặt nạ bên phải được đặt tên

UIInterfaceOrientationMaskPortrait

Hãy lưu ý đến tiền tố nhỏ "Mặt nạ" , nếu không chế độ xem phụ của bạn sẽ kết thúc với một ngoại lệ và thông báo lỗi đã đề cập ở trên.

Các enums mới có một chút thay đổi. Các enums cũ trả về các giá trị không hợp lệ!

(trong UIApplication.h bạn có thể thấy phần khai báo mới: UIInterfaceOrientationMaskPortrait = (1 << UIInterfaceOrientationPortrait) )

Giải pháp là:

- (BOOL)shouldAutorotate {

    return YES;
}

- (NSUInteger)supportedInterfaceOrientations {

    // ATTENTION! Only return orientation MASK values
    // return UIInterfaceOrientationPortrait;

    return UIInterfaceOrientationMaskPortrait;
} 

Sử dụng nhanh chóng

override func shouldAutorotate() -> Bool {

    return true
}

override func supportedInterfaceOrientations() -> Int {

    return Int(UIInterfaceOrientationMask.Portrait.rawValue)
}

5
đã xảy ra với tôi vì lý do tương tự
ChenXin

Tôi ước apple sẽ tạo kiểu trả về UIInterfaceOrientationMask để rõ ràng hơn một chút những gì cần được trả lại.
LightningStryk

Câu trả lời của Jackpearse có vẻ đúng. Nhưng khi nhìn vào info.plist, có UISupportedInterfaceOrientations với UIInterfaceOrientationPortrait, UIInterfaceOrientationLandscapeLeft, UIInterfaceOrientationLandscapeRight. Không có MASK ở đây
onmyway133

1
@onmyway: Đúng vậy, giá trị plist không thay đổi. Trong phiên bản iOS trước đây, Apple đã sử dụng các giá trị mặt nạ "không phải" bên trong mã. Đây là một số công cụ kế thừa. Tôi giả sử rằng apple đang thay đổi một chút các giá trị plist bên trong nội bộ bây giờ.
JackPearse

Ứng dụng của tôi đã từng hoạt động mà không gặp sự cố này trên trình mô phỏng iPad của Xcode 6.2. Và nó đã bị lỗi sau khi tôi nâng cấp lên Xcode 6.3 một vài ngày trước. Bây giờ giải pháp này khắc phục sự cố của tôi. Thx rất nhiều :-)
Golden Thumb

22

Tôi gặp sự cố tương tự khi trình bày bộ chọn hình ảnh trong ứng dụng chỉ nằm ngang. Theo đề xuất của Tiến sĩ Luiji, tôi đã thêm danh mục sau vào đầu bộ điều khiển của mình.

// This category (i.e. class extension) is a workaround to get the
// Image PickerController to appear in landscape mode.
@interface UIImagePickerController(Nonrotating)
- (BOOL)shouldAutorotate;
@end

@implementation UIImagePickerController(Nonrotating)

- (BOOL)shouldAutorotate {
  return NO;
}
@end

Dễ nhất là thêm những dòng này ngay trước @implementation của tệp .m ViewController của bạn.


Tôi có một ứng dụng chỉ dành cho chân dung! và tôi muốn hiển thị Máy ảnh ở chế độ Ngang. bất kì giải pháp nào?????
AsifHabib

Trausti không hoạt động? tôi gặp vấn đề tương tự và tôi đã thử mã của bạn nhưng vẫn xuất hiện cùng một ngoại lệ *** Chấm dứt ứng dụng do ngoại lệ không cần thiết 'UIApplicationInvalidInterfaceOrientation', lý do: 'Các hướng được hỗ trợ không có hướng chung với ứng dụng và nênAutorotate đang trả về CÓ ..... ... tôi cũng đặt một breakpoint trên UIimagePickerView phương pháp loại shouldAutorotate đạt ở đó và lợi nhuận không nhưng vẫn cung cấp ngoại lệ này .... ứng dụng của tôi là Cảnh chỉ ứng dụng ... hãy giúp tôi
Vishal16

Cũng hoạt động để buộc SKStoreProductViewController hiển thị ở chế độ dọc khi toàn bộ ứng dụng nằm ngang trong iOS 8. Cảm ơn bạn.
Yaroslav

11

Tôi đã gặp phải thông báo lỗi tương tự trong mã của mình. Tôi đã tìm thấy điều này, đó là một lỗi theo báo cáo của Apple:

https://devforums.apple.com/message/731764#731764

Giải pháp của anh ấy là sửa nó trong AppDelegate. Tôi đã thực hiện nó và nó phù hợp với tôi!


Bằng cách này, ban đầu tôi thấy điều này tại địa chỉ: stackoverflow.com/questions/12522491/...
Robby

Đây là câu trả lời đúng, trực tiếp từ Apple, và sau đó tôi chỉ cần làm theo hướng dẫn tương tự nhưng làm điều đó trong Swift cho một ứng dụng nhắm mục tiêu iOS 8. Mọi thứ đều hoạt động tốt. AppDelegate đặt hỗ trợInterfaceOrientationsForWindow thành cả Ngang và dọc, mỗi tệp nhanh riêng lẻ chỉ đặt ghi đè func hỗ trợInterfaceOrientations thành Ngang để chế độ xem sẽ không xoay, nhưng khi chế độ xem dọc (trong trường hợp của tôi là SKStoreProductViewController) cần tải, nó sẽ hoạt động!
RanLearns

Chúa ơi, có rất nhiều giải pháp được gợi ý, và giải pháp này cho đến nay không có điểm cao nhất, nhưng nó thực sự là giải pháp chính xác. Đã thử nghiệm trên iOS 10 và 9. Không có gì khác hoạt động.
Demian Turner

6

Tôi gặp vấn đề tương tự và câu trả lời này https://stackoverflow.com/a/12523916 phù hợp với tôi. Tự hỏi nếu có một giải pháp thanh lịch hơn.

Mã của tôi:

UIImagePickerController  *imagePickerController = [[NonRotatingUIImagePickerController alloc] init];
imagePickerController.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;

UIPopoverController  *popoverVC = [[UIPopoverController alloc] initWithContentViewController:imagePickerController];    

[popoverVC presentPopoverFromRect:frame   // did you forget to call this method?
                           inView:view
         permittedArrowDirections:UIPopoverArrowDirectionAny
                         animated:YES];

Tôi đã thử làm điều đó nhưng khi tôi nhấp vào nút để gọi mã nhưng không có gì hiển thị, tôi cũng đã thử thêm @interface NonRotatingUIImagePickerController : UIImagePickerController @end @implementation NonRotatingUIImagePickerController - (BOOL)shouldAutorotate { return NO; } @endvào mã nhưng mã của tôi không phát hiện ra NonRotatingUIImagePickerController.
Destiny Dawn

1
Đừng bận tâm, nó phát hiện NonRotatingUIImagePickerController ngay bây giờ nhưng không có gì hiển thị vẫn ... @poetowen
Destiny Dawn

4

iOS 8 - bạn có thể sử dụng UIModalPresentationPopover mà không cần bất kỳ hack nào để hiển thị trong cửa sổ bật lên. Không lý tưởng nhưng còn hơn không.

imagePicker.modalPresentationStyle = UIModalPresentationPopover;
imagePicker.popoverPresentationController.sourceView = self.view;
imagePicker.popoverPresentationController.sourceRect = ((UIButton *)sender).frame;

Chỉnh sửa: có lẽ hãy thử các kiểu UIModalPresentationStyles khác - có thể nhiều kiểu khác sẽ hoạt động theo chiều ngang.


3
- (BOOL)shouldAutorotate {
    return NO;
}

-(NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskPortrait;
}

This removes the crash.

2

Một tùy chọn khác đã giải quyết vấn đề của tôi là tạo một lớp con của UIImagePickerController và ghi đè phương thức bên dưới

@interface MyImagePickerController ()

@end

@implementation MyImagePickerController

- (NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskLandscape;
}

Sử dụng cái này thay vì UIImagePickerController và tất cả đều hoạt động tốt.


1

Tạo một danh mục thực sự hữu ích để sửa lỗi này. Và đừng quên nhập danh mục đã tạo của bạn. Thao tác này sẽ thêm phương thức còn thiếu vào UIImagePickerController và trên iOS 6, nó sẽ hạn chế nó chỉ hoạt động ở chế độ Chân dung khi tài liệu chỉ ra btw.

Các giải pháp khác có thể đã hoạt động. Nhưng với SDK cho iOS 8.x được biên dịch để triển khai trên iOS 6.1, đây có vẻ là cách để đi.

Tệp .h:

#import <UIKit/UIKit.h>

@interface UIImagePickerController (iOS6FIX)

- (BOOL) shouldAutorotate;
- (UIInterfaceOrientation) preferredInterfaceOrientationForPresentation;

@end

Tệp .m:

#import "UIImagePickerController+iOS6FIX.h"

@implementation UIImagePickerController (iOS6FIX)

- (BOOL) shouldAutorotate {
    return NO;
}

- (UIInterfaceOrientation) preferredInterfaceOrientationForPresentation {
    return UIInterfaceOrientationPortrait;
}

@end

1

Swift 3

let imagePicker = UIImagePickerController()

imagePicker.modalPresentationStyle = .popover
imagePicker.popoverPresentationController?.sourceView = sender // you can also pass any view 

present(imagePicker, animated: true)

0

Tôi gặp vấn đề tai nạn này khi chuyển đổi UIInterfaceOrientationPortraitđể UIInterfaceOrientationMaskPortraitngầm như một giá trị trả về.

Thêm nền tảng mã UIPageViewControllerDelegate, chỉ FYI cho tất cả các bạn.

 -(UIInterfaceOrientationMask)pageViewControllerSupportedInterfaceOrientations:
(UIPageViewController *)pageViewController
{
    # return UIInterfaceOrientationPortrait;    # wrong
    return UIInterfaceOrientationMaskPortrait;  # correct
}

0

Tôi vừa giải quyết sự cố cho Swift 4.x

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    configureVideoOrientation()
}

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    super.viewWillTransition(to: size, with: coordinator)
    coordinator.animate(alongsideTransition: nil, completion: { [weak self] _ in
        self?.configureVideoOrientation()
    })
}

private func configureVideoOrientation() {
    guard let previewLayer = self.previewLayer, let connection = previewLayer.connection else { return }
    if connection.isVideoOrientationSupported {
        let orientation = UIApplication.shared.statusBarOrientation
        switch (orientation) {
        case .portrait:
            previewLayer.connection?.videoOrientation = .portrait
        case .landscapeRight:
            previewLayer.connection?.videoOrientation = .landscapeRight
        case .landscapeLeft:
            previewLayer.connection?.videoOrientation = .landscapeLeft
        case .portraitUpsideDown:
            previewLayer.connection?.videoOrientation = .portraitUpsideDown
        default:
            previewLayer.connection?.videoOrientation = .portrait
        }

        previewLayer.frame = self.view.bounds
    }
}

Cảm ơn các bạn cho câu trả lời của bạn cũng Tôi vừa cắt mã đã hoạt động và đơn giản là cấu trúc lại nó.


0

Swift 4 trở lên giả sử toàn bộ ứng dụng ở chế độ ngang và bạn cần trình bày một bộ điều khiển duy nhất ở chế độ dọc. Trong bộ điều khiển chế độ xem phải nằm dọc, hãy thêm những thứ sau:

override open var supportedInterfaceOrientations: UIInterfaceOrientationMask {
    return .portrait
}

open override var shouldAutorotate: Bool {
    return false
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.