停止 MCBrowserViewController 旋转。忽略 plist 并且不会子类化

Stop MCBrowserViewController rotating. Ignores plist & won't subclass

我希望多人连接点选择器视图像应用程序中的其他所有内容一样启动并保持横向。

plist 具有“支持的界面方向”,仅包含“横向(右主页按钮)”,但MCBrowserViewController 忽略它。

我试图子类化到 override supportedInterfaceOrientations,但是根据这个 link,它不支持这个。 presentViewController,适用于 MCBrowserViewController,给出:

uncaughtExceptionHandler; NSInternalInconsistencyException: Could not load NIB in bundle:
            'NSBundle </var/containers/Bundle/Application/B2B62F00-15A1-4063-89B0-52EB7F3E464C/
            Parsec.app> (loaded)' with name 'MCBrowserViewController'

感谢您的帮助。

我编写了一个非常基本的示例应用程序并使用 iOS 11.2 对其进行了测试。看来,对我来说,MCBrowserViewController 遵守应用程序级别的方向限制。

您应该通过提供 application(_:supportedInterfaceOrientationsFor:). Or, if you have a custom subclass of UIApplication, make sure it is not overriding supportedInterfaceOrientations(for:).

的实现来检查您的应用委托是否没有覆盖 plist 方向值

我在此处提供了完整的来源:

ViewController.swift:

import UIKit
import MultipeerConnectivity

class ViewController: UIViewController {

    var textField: UITextField?
    let id = MCPeerID(displayName: "testpeer")
    lazy var session = MCSession(peer: id)

    override func viewDidLoad() {
        super.viewDidLoad()

        let button = UIButton(frame: CGRect(x: 100, y: 100, width: 0, height: 0))
        button.setTitle("Browse", for: .normal)
        button.backgroundColor = .red
        button.addTarget(self, action: #selector(showBrowser), for: .touchUpInside)
        button.sizeToFit()
        view.addSubview(button)
    }

    @objc func showBrowser() {
        let controller = MCBrowserViewController(serviceType: "test", session: session)
        present(controller, animated: true)
        controller.delegate = self
    }
}

extension ViewController: MCBrowserViewControllerDelegate {

    func browserViewControllerDidFinish(_ browserViewController: MCBrowserViewController) {
        self.presentedViewController?.dismiss(animated: true)
    }

    func browserViewControllerWasCancelled(_ browserViewController: MCBrowserViewController) {
        self.presentedViewController?.dismiss(animated: true)
    }
}

AppDelegate.swift:

import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

        return true
    }
}

Info.plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>CFBundleDevelopmentRegion</key>
    <string>$(DEVELOPMENT_LANGUAGE)</string>
    <key>CFBundleExecutable</key>
    <string>$(EXECUTABLE_NAME)</string>
    <key>CFBundleIdentifier</key>
    <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
    <key>CFBundleInfoDictionaryVersion</key>
    <string>6.0</string>
    <key>CFBundleName</key>
    <string>$(PRODUCT_NAME)</string>
    <key>CFBundlePackageType</key>
    <string>APPL</string>
    <key>CFBundleShortVersionString</key>
    <string>1.0</string>
    <key>CFBundleVersion</key>
    <string>1</string>
    <key>LSRequiresIPhoneOS</key>
    <true/>
    <key>UILaunchStoryboardName</key>
    <string>LaunchScreen</string>
    <key>UIMainStoryboardFile</key>
    <string>Main</string>
    <key>UIRequiredDeviceCapabilities</key>
    <array>
        <string>armv7</string>
    </array>
    <key>UISupportedInterfaceOrientations</key>
    <array>
        <string>UIInterfaceOrientationLandscapeRight</string>
    </array>
    <key>UISupportedInterfaceOrientations~ipad</key>
    <array>
        <string>UIInterfaceOrientationPortrait</string>
        <string>UIInterfaceOrientationPortraitUpsideDown</string>
        <string>UIInterfaceOrientationLandscapeLeft</string>
        <string>UIInterfaceOrientationLandscapeRight</string>
    </array>
</dict>
</plist>