Tek görüntü denetleyicisinin yönü yalnızca Swift'de portre moduna nasıl kilitlenir


102

Uygulamam tüm oryantasyon desteği aldığından beri. Yalnızca portre modunu belirli UIViewController'a kilitlemek istiyorum.

Örneğin, Sekmeli Uygulama olduğunu varsayın ve SignIn View modsal olarak göründüğünde, yalnızca SignIn Görünümünün portre moduna geçmesini istiyorum, kullanıcı cihazı nasıl döndürürse döndürsün veya mevcut cihaz yönü ne olursa olsun


Yanıtlar:


270

Birden çok gezinme denetleyicisine ve / veya sekme görünüm denetleyicisine sahip olmak gibi karmaşık bir görünüm hiyerarşisine sahip olduğunuzda işler oldukça karışık olabilir.

Bu uygulama, Uygulama Temsilcisinin alt görünümleri yineleyerek bulmasına güvenmek yerine, yönlendirmeleri ne zaman kilitlemek istediklerini ayarlamak için onu bireysel görünüm denetleyicilerine koyar.

Hızlı 3, 4, 5

AppDelegate'te:

/// set orientations you want to be allowed in this property by default
var orientationLock = UIInterfaceOrientationMask.all

func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
        return self.orientationLock
}

Başka bir global yapı veya yardımcı sınıfta, burada AppUtility'yi yarattım:

struct AppUtility {

    static func lockOrientation(_ orientation: UIInterfaceOrientationMask) {
    
        if let delegate = UIApplication.shared.delegate as? AppDelegate {
            delegate.orientationLock = orientation
        }
    }

    /// OPTIONAL Added method to adjust lock and rotate to the desired orientation
    static func lockOrientation(_ orientation: UIInterfaceOrientationMask, andRotateTo rotateOrientation:UIInterfaceOrientation) {
   
        self.lockOrientation(orientation)
    
        UIDevice.current.setValue(rotateOrientation.rawValue, forKey: "orientation")
        UINavigationController.attemptRotationToDeviceOrientation()
    }

}

Ardından istenen ViewController'da yönleri kilitlemek istiyorsunuz:

 override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    
    AppUtility.lockOrientation(.portrait)
    // Or to rotate and lock
    // AppUtility.lockOrientation(.portrait, andRotateTo: .portrait)
    
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    
    // Don't forget to reset when view is being removed
    AppUtility.lockOrientation(.all)
}

İPad veya Evrensel Uygulama ise

Hedef Ayarları -> Genel -> Dağıtım Bilgileri'nde "Tam ekran gerektirir" seçeneğinin işaretlendiğinden emin olun. supportedInterfaceOrientationsForBu işaretlenmezse delege aranmayacaktır. görüntü açıklamasını buraya girin


Görünüşe göre kod kontrolü ... kontrol etmeme izin ver, iyi bir cevap gibi görünüyor.
Thiha Aung

18
Çok sayıda delice araştırmadan sonra, bulduğum tek cevap bu benim için işe yaradı. Swift 3 - Xcode 8.2.1
Xavier Garcia Rubio

1
@pbm Uygulamanın belirli bölümlerinde kilit oryantasyonlarında çalıştığım şirketteki uygulamaların birçoğu ve hepsi uzun yıllar boyunca uygulama mağazasında birçok kez onaylandı. Bununla birlikte, Apple'ın bu yolda bir sorunu olmayacağını garanti edemem. Ancak şu ana kadar sorun yok ve pek çok uygulamanın bunu bir şekilde veya başka şekilde yaptığından oldukça eminim.
bmjohns

2
İşaretliyorsa Requires full screen, bu, uygulamanın Slide Over ve Split View için mevcut olmasını engeller. Apple'ın iPad'de Çoklu Görev Geliştirmelerini Kabul Etme bölümüne bakın . Etkinleştirmeyi gerektirmeyen bir cevabım varRequires full screen
John Pang 18

2
Çalışmıyor, ikinci viewController düzeni sadece dikeyde gösterimini güncellemedi.
iCoder

28

Swift 4

görüntü açıklamasını buraya girin AppDelegate

var orientationLock = UIInterfaceOrientationMask.all

func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
    return self.orientationLock
}
struct AppUtility {
    static func lockOrientation(_ orientation: UIInterfaceOrientationMask) {
        if let delegate = UIApplication.shared.delegate as? AppDelegate {
            delegate.orientationLock = orientation
        }
    }

    static func lockOrientation(_ orientation: UIInterfaceOrientationMask, andRotateTo rotateOrientation:UIInterfaceOrientation) {
        self.lockOrientation(orientation)
        UIDevice.current.setValue(rotateOrientation.rawValue, forKey: "orientation")
    }
}

ViewController'ınız, yalnızca dikey yönlendirmeye ihtiyacınız varsa Aşağıdaki satırı ekleyin. bunu tüm ViewController'ın portre modunu göstermesi için uygulamanız gerekir.

override func viewWillAppear(_ animated: Bool) {
AppDelegate.AppUtility.lockOrientation(UIInterfaceOrientationMask.portrait, andRotateTo: UIInterfaceOrientation.portrait)
    }

ve bu, diğer Viewcontroller için cihazın fiziksel yönüne göre ekran yönlendirmesi yapacaktır.

override func viewWillDisappear(_ animated: Bool) {
        AppDelegate.AppUtility.lockOrientation(UIInterfaceOrientationMask.all)

    }

Swift 4 için bu kesinlikle en iyi cevap. İOS kamera uygulamasının davranışını taklit ettiği için tam da ihtiyacım olan şey.
nocdib

@Nahid func application Uygulama temsilcisi içindeki orijinali bu işlevle değiştiriyor func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask { return self.orientationLock ?
muyuz

Bir veya iki saat çözüm aradıktan ve bazı girişimlerden sonra, bu mükemmel çalışan çözümdür. Görünümün yönünü ayarlar, görünüm yüklendiğinde onu zorlar, başka bir görünüme giderken kilidi açar, sekme gezinmesinde çalışır ve kod basit ve temizdir. Teşekkür ederim @Nahid
Radek Sip

13

Hızlı 3 ve 4

supportedInterfaceOrientationsBelirli UIViewControllers özelliğini şu şekilde ayarlayın :

class MyViewController: UIViewController {

    var orientations = UIInterfaceOrientationMask.portrait //or what orientation you want
    override var supportedInterfaceOrientations : UIInterfaceOrientationMask {
    get { return self.orientations }
    set { self.orientations = newValue }
    }

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    //...
}

GÜNCELLEME

Senin Bu çözüm yalnızca çalışır viewControlleredilir değil gömülü UINavigationController, ebeveyn viewController gelen oryantasyon devralır, çünkü.
Bu durumda, bir alt sınıf oluşturabilir UINavigationViewControllerve bu özellikleri üzerinde ayarlayabilirsiniz.


Teşekkürler. Bu benim için iyi çalışıyor çünkü sadece belirli bir Görünümü Portre ile sınırlamak istiyorum. Tüm uygulama değil.
user3204765

İhtiyacım olan tek şey, belirli görünüm denetleyicilerini, tasarım yönüne bakılmaksızın yönlendirmeyi kilitlemek için kontrol etmek ve bu harika çalıştı!
Ryan B.

9

Portreyi zorlamak ve kilitlemek için bu kodu ekleyin:

override func viewDidLoad() {
    super.viewDidLoad()

    // Force the device in portrait mode when the view controller gets loaded
    UIDevice.currentDevice().setValue(UIInterfaceOrientation.Portrait.rawValue, forKey: "orientation") 
}

override func shouldAutorotate() -> Bool {
    // Lock autorotate
    return false
}

override func supportedInterfaceOrientations() -> Int {

    // Only allow Portrait
    return Int(UIInterfaceOrientationMask.Portrait.rawValue)
}

override func preferredInterfaceOrientationForPresentation() -> UIInterfaceOrientation {

    // Only allow Portrait
    return UIInterfaceOrientation.Portrait
}

AppDelegate'inizde - supportedInterfaceOrientationsForWindow'u tüm uygulamanın desteklemesini istediğiniz yönlere ayarlayın:

func application(application: UIApplication, supportedInterfaceOrientationsForWindow window: UIWindow?) -> UIInterfaceOrientationMask {
    return UIInterfaceOrientationMask.All
} 

Teşekkürler Valentin, yardımlarınız için gerçekten minnettarım ama kodunuz işe yaramadı ve şimdi çözdüm, ben de soruma cevap verdim.
Thiha Aung

8

Bu, sorununuz ve diğer ilgili konular için genel bir çözümdür.

1. Auxiliar sınıfı UIHelper oluşturun ve aşağıdaki yöntemleri uygulayın:

    /**This method returns top view controller in application  */
    class func topViewController() -> UIViewController?
    {
        let helper = UIHelper()
        return helper.topViewControllerWithRootViewController(rootViewController: UIApplication.shared.keyWindow?.rootViewController)
    }

    /**This is a recursive method to select the top View Controller in a app, either with TabBarController or not */
    private func topViewControllerWithRootViewController(rootViewController:UIViewController?) -> UIViewController?
    {
        if(rootViewController != nil)
        {
            // UITabBarController
            if let tabBarController = rootViewController as? UITabBarController,
                let selectedViewController = tabBarController.selectedViewController {
                return self.topViewControllerWithRootViewController(rootViewController: selectedViewController)
            }

            // UINavigationController
            if let navigationController = rootViewController as? UINavigationController ,let visibleViewController = navigationController.visibleViewController {
                return self.topViewControllerWithRootViewController(rootViewController: visibleViewController)
            }

            if ((rootViewController!.presentedViewController) != nil) {
                let presentedViewController = rootViewController!.presentedViewController;
                return self.topViewControllerWithRootViewController(rootViewController: presentedViewController!);
            }else
            {
                return rootViewController
            }
        }

        return nil
    }

2. Özel durumunuz için portre olması için arzu davranışınızla bir Protokol oluşturun.

protocol orientationIsOnlyPortrait {}

Nota: İsterseniz, UIHelper Sınıfının en üstüne ekleyin.

3. Görünüm Denetleyicinizi genişletin

Senin durumunda:

class Any_ViewController: UIViewController,orientationIsOnlyPortrait {

   ....

}

4. Uygulamada temsilci sınıfı şu yöntemi ekleyin:

 func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
        let presentedViewController = UIHelper.topViewController()
        if presentedViewController is orientationIsOnlyPortrait {
            return .portrait
        }
        return .all
    }

Son Notlar:

  • Dikey modda daha fazla sınıf varsa, sadece bu protokolü uzatın.
  • Görüntü denetleyicilerinden başkalarının davranışlarını istiyorsanız, başka protokoller oluşturun ve aynı yapıyı izleyin.
  • Bu örnek, itme görünümü denetleyicilerinden sonra yön değişiklikleri ile ilgili sorunu çözer

Bu çözüm gibi, ancak UIHelper işlevlerini UINavigationController uzantıları olarak daha kullanışlı buldum.
Michael Long

7

Swift'in yeni bir sürümü için şunu deneyin

override var shouldAutorotate: Bool {
    return false
}

override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
    return UIInterfaceOrientationMask.portrait
}

override var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation {
    return UIInterfaceOrientation.portrait
}

Tam da ihtiyacım olan şey buydu! İPad denetleyicisi için tüm yönlendirme seçenekleri geçerlidir ve iPhone denetleyicisi için yalnızca bu üç geçersiz kılmayı yazarak yalnızca dikey modda geçerlidir - Mükemmel.
VYT

5

Bu ileti dizisindeki bir sürü harika yanıt, ancak hiçbiri ihtiyaçlarımı tam olarak karşılamadı. Her sekmede gezinme denetleyicileri olan sekmeli bir uygulamam var ve bir görünümün döndürülmesi gerekirken diğerlerinin dikey konumda kilitlenmesi gerekiyordu. Gezinme denetleyicisi bazı nedenlerden dolayı alt görünümlerini düzgün şekilde yeniden boyutlandırmıyordu. Bu cevapla birleştirerek (Swift 3'te) bir çözüm buldu ve düzen sorunları ortadan kalktı. Yapıyı @bmjohns tarafından önerildiği gibi oluşturun:

import UIKit

struct OrientationLock {

    static func lock(to orientation: UIInterfaceOrientationMask) {
        if let delegate = UIApplication.shared.delegate as? AppDelegate {
            delegate.orientationLock = orientation
        }
    }

    static func lock(to orientation: UIInterfaceOrientationMask, andRotateTo rotateOrientation: UIInterfaceOrientation) {
        self.lock(to: orientation)
        UIDevice.current.setValue(rotateOrientation.rawValue, forKey: "orientation")
    }
} 

Ardından UITabBarController alt sınıfı:

    import UIKit

class TabBarController: UITabBarController, UITabBarControllerDelegate {
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        self.delegate = self
    }

    func tabBarControllerSupportedInterfaceOrientations(_ tabBarController: UITabBarController) -> UIInterfaceOrientationMask {
        if tabBarController.selectedViewController is MyViewControllerNotInANavigationControllerThatShouldRotate {
            return .allButUpsideDown
        } else if let navController = tabBarController.selectedViewController as? UINavigationController, navController.topViewController is MyViewControllerInANavControllerThatShouldRotate {
            return .allButUpsideDown
        } else {
            //Lock view that should not be able to rotate
            return .portrait
        }
    }

    func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {
        if viewController is MyViewControllerNotInANavigationControllerThatShouldRotate {
            OrientationLock.lock(to: .allButUpsideDown)
        } else if let navController = viewController as? UINavigationController, navController.topViewController is MyViewControllerInANavigationControllerThatShouldRotate {
            OrientationLock.lock(to: .allButUpsideDown)
        } else {
            //Lock orientation and rotate to desired orientation
            OrientationLock.lock(to: .portrait, andRotateTo: .portrait)
        }
        return true
    }
}

Film şeridindeki TabBarController sınıfını yeni oluşturulan alt sınıfa değiştirmeyi unutmayın.


4

İşte Swift 4.2 (iOS 12.2) ile benim için işe yarayan basit bir yol, bunu bir UIViewController shouldAutorotate'i devre dışı bırakmak istediğiniz bir yere koyun:

override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
    return .portrait
}

.portraitKısmı yönelim (ler) kalması halinde, size benzerleri gibi değiştirebilirsiniz söyler. Seçimler şunlardır: .portrait, .all, .allButUpsideDown, .landscape, .landscapeLeft, .landscapeRight, .portraitUpsideDown.


2

Yatay yönlendirmeyi uygulamanızın tüm görünümüne ayarlamak ve Tüm yönler için yalnızca bir görünüme izin vermek için (örneğin film rulosu ekleyebilmek için):

AppDelegate.swift'te:

var adaptOrientation = false

İçinde: didFinishLaunchingWithOptions

NSNotificationCenter.defaultCenter().addObserver(self, selector: "adaptOrientationAction:", name:"adaptOrientationAction", object: nil)

AppDelegate.swift'in başka bir yerinde:

func application(application: UIApplication, supportedInterfaceOrientationsForWindow window: UIWindow?) -> Int {
    return checkOrientation(self.window?.rootViewController)
}

func checkOrientation(viewController:UIViewController?)-> Int{
    if (adaptOrientation == false){
        return Int(UIInterfaceOrientationMask.Landscape.rawValue)
    }else {
        return Int(UIInterfaceOrientationMask.All.rawValue)
    }
}

func adaptOrientationAction(notification: NSNotification){
    if adaptOrientation == false {
        adaptOrientation = true
    }else {
        adaptOrientation = false
    }
}

Ardından, Tüm yönlere sahip olmasını istediğinize giden görünümde:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
    if (segue.identifier == "YOURSEGUE") {
        NSNotificationCenter.defaultCenter().postNotificationName("adaptOrientationAction", object: nil)
    }
}

override func viewWillAppear(animated: Bool) {
    if adaptOrientation == true {
        NSNotificationCenter.defaultCenter().postNotificationName("adaptOrientationAction", object: nil)
    }
}

Son olarak, Cihaz yönünü işaretlemek: - Dikey - Yatay Sol - Yatay Sağ


2

İle yeni uzantı oluştur

import UIKit

extension UINavigationController {
    override open var supportedInterfaceOrientations: UIInterfaceOrientationMask {
        return .portrait
    }
}

extension UITabBarController {
    override open var supportedInterfaceOrientations: UIInterfaceOrientationMask {
        return .portrait
    }
}

1

bmjohns -> Sen benim hayat kurtarıcımsın. Çalışan tek çözüm budur (AppUtility yapısı ile)

Bu sınıfı oluşturdum:

class Helper{
    struct AppUtility {

        static func lockOrientation(_ orientation: UIInterfaceOrientationMask) {

            if let delegate = UIApplication.shared.delegate as? AppDelegate {
                delegate.orientationLock = orientation
            }
        }

        /// OPTIONAL Added method to adjust lock and rotate to the desired orientation
        static func lockOrientation(_ orientation: UIInterfaceOrientationMask, andRotateTo rotateOrientation:UIInterfaceOrientation) {

            self.lockOrientation(orientation)

            UIDevice.current.setValue(rotateOrientation.rawValue, forKey: "orientation")
        }

    }
}

talimatlarınızı takip ettiniz ve Swift 3 -> xcode sürüm 8.2.1 için her şey mükemmel çalışıyor


1

İOS 10 ve 11'den itibaren iPad, Slide Over ve Split View'i destekler. Slide Over ve Split View'da bir uygulamayı etkinleştirmek için işaretinin kaldırılması Requires full screen gerekir . Araçlarla O kabul cevap kullanılamaz eğer uygulama desteği Slayt Üzeri ve bölünmüş görünüm istiyor. Apple'ın iPad'de Çoklu Görev Geliştirmelerini Benimseme hakkında daha fazlasını buradan görün .

(1) işaretini Requires full screenkaldırmaya, (2) yalnızca bir işlevin uygulanmasına appDelegate(özellikle hedef görünüm denetleyicilerini değiştirmek istemiyorsanız / değiştiremiyorsanız) ve (3) özyinelemeli aramalardan kaçınmanıza izin veren bir çözümüm var . Yardımcı sınıfa veya uzantılara gerek yok.

appDelegate.swift (Swift 4)

func application(_ application: UIApplication,
                 supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
    // Search for the visible view controller
    var vc = window?.rootViewController
    // Dig through tab bar and navigation, regardless their order 
    while (vc is UITabBarController) || (vc is UINavigationController) {
        if let c = vc as? UINavigationController {
            vc = c.topViewController
        } else if let c = vc as? UITabBarController {
            vc = c.selectedViewController
        }
    }
    // Look for model view controller
    while (vc?.presentedViewController) != nil {
        vc = vc!.presentedViewController
    }
    print("vc = " + (vc != nil ? String(describing: type(of: vc!)) : "nil"))
    // Final check if it's our target class.  Also make sure it isn't exiting.
    // Otherwise, system will mistakenly rotate the presentingViewController.
    if (vc is TargetViewController) && !(vc!.isBeingDismissed) {
        return [.portrait]
    }
    return [.all]
}

Düzenle

@bmjohns, bu işlevin iPad'de çağrılmadığına dikkat çekti. Doğruladım ve evet çağrılmadı. Bu yüzden biraz daha test yaptım ve bazı gerçekleri öğrendim:

  1. İPad'de Requires full screenSlide Over ve Slide View özelliğini etkinleştirmek istediğim için işaretimi kaldırdım. Bu, uygulamanın Info.plist: içinde iPad için 4 yönünü de desteklemesini gerektirir Supported interface orientations (iPad).

Uygulamam Facebook ile aynı şekilde çalışıyor: iPhone'da çoğu zaman portreye kilitleniyor. Görüntüyü tam ekranda görüntülerken, kullanıcıların daha iyi görüntü için manzarayı döndürmesine olanak tanır. İPad'de, kullanıcılar herhangi bir görünüm denetleyicisindeki herhangi bir yöne döndürebilir. Bu nedenle, iPad Smart Cover üzerinde durduğunda (yatay solda) uygulama güzel görünüyor.

  1. application(_:supportedInterfaceOrientationsFor)İPad'in araması için Info.plist içinde, yalnızca iPad için portreyi koruyun. Uygulama Slide Over + Split View yeteneğini kaybedecek. Ancak, ViewController sınıfını değiştirmenize gerek kalmadan, herhangi bir görünüm denetleyicisinin yönünü tek bir yerde kilitleyebilir veya kilidini açabilirsiniz.

  2. Son olarak, görünüm görüntülendiğinde / kaldırıldığında bu işlev, görüntü denetleyicisinin yaşam döngüsünde çağrılır. Uygulamanızın başka bir zamanda yönünü kilitlemesi / kilidini açması / değiştirmesi gerekirse, çalışmayabilir


İPhone için çalışıyor mu? ViewController'ımdan birini yalnızca yatay durumda göstermek istiyorum.
iCoder

Evet. iPhone için çalışın. Görünüm denetleyicimden birini hem dikey hem de yatayda istiyorum ve onu kapattıktan sonra portreye dönüyorum.
John Pang

1

Bunun için gerçek test edilmiş Çözüm Örneğimde tüm uygulamamın dikey modda olmasına ihtiyacım var, ancak yalnızca bir ekranın yönü yatay modda olmalıdır. Yalnızca dikey modu kontrol ederek uygulama için Dikey yönlendirme yapın

AppDelegate'teki kod, yukarıda açıklanan cevaplar.

var orientationLock = UIInterfaceOrientationMask.all

func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask 
{
  return self.orientationLock
}
struct AppUtility {  

static func lockOrientation(_ orientation: UIInterfaceOrientationMask) {
    if let delegate = UIApplication.shared.delegate as? AppDelegate {
        delegate.orientationLock = orientation
    }
}
static func lockOrientation(_ orientation: UIInterfaceOrientationMask, andRotateTo rotateOrientation:UIInterfaceOrientation) {
self.lockOrientation(orientation)     
UIDevice.current.setValue(rotateOrientation.rawValue, forKey: "orientation")
}  
}

Ardından, yatay yönlendirme görüntü denetleyiciniz sunulmadan / basılmadan önce bu kodu not edin.

override func viewWillAppear(_ animated: Bool) {  
super.viewWillAppear(animated)
AppDelegate.AppUtility.lockOrientation(UIInterfaceOrientationMask.portrait, andRotateTo: UIInterfaceOrientation.portrait)
}  

Ardından bu kodu gerçek görüntü denetleyicisine yazın (Yatay görünüm için)

override func viewWillAppear(_ animated: Bool) {  
super.viewWillAppear(animated)
AppDelegate.AppUtility.lockOrientation(UIInterfaceOrientationMask.landscape, andRotateTo: UIInterfaceOrientation.landscape)
}  

0

@ Bmjohn'un yukarıdaki cevabına teşekkürler. İşte bir çalışmaBaşkalarının transkripsiyon zamanından tasarruf etmek için bu yanıtlayıcının kodunun Xamarin / C # sürümü:

AppDelegate.cs

 public UIInterfaceOrientationMask OrientationLock = UIInterfaceOrientationMask.All;
 public override UIInterfaceOrientationMask GetSupportedInterfaceOrientations(UIApplication application, UIWindow forWindow)
 {
     return this.OrientationLock;
 }

Static OrientationUtility.cs sınıfı:

public static class OrientationUtility
{
    public static void LockOrientation(UIInterfaceOrientationMask orientation)
    {
        var appdelegate = (AppDelegate) UIApplication.SharedApplication.Delegate;
        if(appdelegate != null)
        {
            appdelegate.OrientationLock = orientation;
        }
    }

    public static void LockOrientation(UIInterfaceOrientationMask orientation, UIInterfaceOrientation RotateToOrientation)
    {
        LockOrientation(orientation);

        UIDevice.CurrentDevice.SetValueForKey(new NSNumber((int)RotateToOrientation), new NSString("orientation"));
    }
}

Denetleyiciyi Görüntüle:

    public override void ViewDidAppear(bool animated)
    {
       base.ViewWillAppear(animated);
       OrientationUtility.LockOrientation(UIInterfaceOrientationMask.Portrait, UIInterfaceOrientation.Portrait);
    }

    public override void ViewWillDisappear(bool animated)
    {
        base.ViewWillDisappear(animated);
        OrientationUtility.LockOrientation(UIInterfaceOrientationMask.All);
    }

Bu cevabın ne kadar alakalı olduğunu anlamıyorum. O kişi hızlıca sordu ve siz Xamarin'de verdiniz.
Mihir Oza

0

Biraz deney yaptım ve bu soruna temiz bir çözüm bulmayı başardım. Yaklaşım, view-> etiketi aracılığıyla görünüm etiketlemeye dayanır

Hedef ViewController'da, aşağıdaki kod örneğinde olduğu gibi etiketi kök görünüme atamanız yeterlidir:

class MyViewController: BaseViewController {

  // declare unique view tag identifier
  static let ViewTag = 2105981;

  override func viewDidLoad()
  {
    super.viewDidLoad();
    // assign the value to the current root view
    self.view.tag = MyViewController.ViewTag;
  }

Ve son olarak AppDelegate.swift'te şu anda gösterilen görünümün etiketlediğimiz görünüm olup olmadığını kontrol edin:

func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask
{
    if (window?.viewWithTag(DesignerController.ViewTag)) != nil {
        return .portrait;
    }
    return .all;
}

Bu yaklaşım simülatörümle test edildi ve iyi çalışıyor gibi görünüyor.

Not: İşaretli görünüm, geçerli MVC gezinme yığınındaki bazı alt ViewController ile çakışırsa da bulunacaktır.


0

Dikey ve yatayda kilitlemek ve yönü değiştirmek için En İyi Çözüm:

Bu videoyu YouTube'da izleyin:

https://m.youtube.com/watch?v=4vRrHdBowyo

Bu eğitim en iyi ve basittir.

veya aşağıdaki kodu kullanın:

Bu resme bakın

// 1- ikinci viewcontroller'de landscapeleft'i ve birinci viewcontroller'de portrat'ı ayarlıyoruz:

// 2- NavigationController kullanıyorsanız, uzantı eklemelisiniz

import UIKit

class SecondViewController: UIViewController {


    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        UIDevice.current.setValue(UIInterfaceOrientation.landscapeLeft.rawValue, forKey: "orientation")
    }

    override open var shouldAutorotate: Bool {
        return false
    }

    override open var supportedInterfaceOrientations: UIInterfaceOrientationMask {
        return .landscapeLeft
    }

    override var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation {
        return .landscapeLeft
    }
    
    

    override func viewDidLoad() {
        super.viewDidLoad()
    }

//write The rest of your code in here


}

//if you use NavigationController, you should add this extension

extension UINavigationController {
    override open var supportedInterfaceOrientations: UIInterfaceOrientationMask {
        return topViewController?.supportedInterfaceOrientations ?? .allButUpsideDown
    
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.