কীভাবে কেবলমাত্র সুইফটে প্রতিকৃতি মোডে একটি দৃশ্যের নিয়ামককে অভিযুক্তকরণ লক করতে হয়


102

যেহেতু আমার অ্যাপ্লিকেশনটি সমস্ত দিকনির্দেশনার জন্য সমর্থন পেয়েছে। আমি নির্দিষ্ট ইউআইভিউউকন্ট্রোলারে কেবল প্রতিকৃতি মোডটি লক করতে চাই।

উদাহরণস্বরূপ ধরুন এটি ট্যাবড অ্যাপ্লিকেশন এবং যখন সাইন ইন ভিউ Modally প্রদর্শিত হবে, আমি কেবলমাত্র প্রতিকৃতি মোডে সাইন ইন ভিউটি কেবলমাত্র ব্যবহারকারী ডিভাইসটি কীভাবে ঘোরান বা বর্তমান ডিভাইসটির অবস্থান কীভাবে হবে তা বিবেচনা করেই চাই


এই হতে পারে সাহায্য করে stackoverflow.com/q/24928057/6521116
ক্রিস Roofe

উত্তর:


270

যখন আপনার কাছে একাধিক নেভিগেশন কন্ট্রোলার এবং / বা ট্যাব দেখার নিয়ন্ত্রক থাকার মতো জটিল ভিউ হায়ারার্কি থাকে তখন জিনিসগুলি বেশ অগোছালো হয়ে উঠতে পারে।

এই বাস্তবায়নটি পৃথক দর্শন নিয়ন্ত্রকদের উপর সেট করে রাখে যে তারা কখন ওরিয়েন্টেশন লক করতে চাইবে, অ্যাপ ডেলিগেটের উপর নির্ভর না করে সাবভিউগুলির মাধ্যমে পুনরাবৃত্তি করে তাদের সন্ধান করতে পারে।

সুইফট 3, 4, 5

অ্যাপডিজিটে:

/// 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
}

অন্য কয়েকটি গ্লোবাল স্ট্রাক্ট বা সহায়তা সহায়ক শ্রেণিতে, আমি এখানে অ্যাপ্লিকেশন তৈরি করেছি:

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()
    }

}

তারপরে কাঙ্ক্ষিত ভিউকন্ট্রোলারে আপনি ওরিয়েন্টেশনগুলি লক করতে চান:

 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)
}

যদি আইপ্যাড বা ইউনিভার্সাল অ্যাপ হয়

নিশ্চিত করুন যে "পূর্ণ স্ক্রিনের প্রয়োজন" টার্গেট সেটিংস -> সাধারণ -> স্থাপনার তথ্যতে পরীক্ষা করা হয়েছে। supportedInterfaceOrientationsForযদি এটি পরীক্ষা না করা হয় তবে ডেলিগেটকে ফোন করা হবে না। এখানে চিত্র বর্ণনা লিখুন


দেখে মনে হচ্ছে এটি কোড নিয়ন্ত্রণ ... আমাকে এটি পরীক্ষা করতে দিন, ভাল উত্তর বলে মনে হচ্ছে।
থিহা অং

18
অনেক নির্মম গবেষণার পরেও আমি খুঁজে পেলাম যে এই উত্তরটি আমার পক্ষে কাজ করে। সুইফট 3 - এক্সকোড 8.2.1
জাভিয়ের গার্সিয়া রুবিও

4
@pbm আমি যে অ্যাপ্লিকেশনটিতে নির্দিষ্ট অংশগুলিতে লক ওরিয়েন্টেশনে কাজ করি সে সংস্থার বেশ কয়েকটি অ্যাপ্লিকেশনগুলি বহু বছর ধরে একাধিকবার অ্যাপ স্টোরটিতে অনুমোদিত হয়েছে। এটি বলেছিল, যদিও, আমি গ্যারান্টি দিতে পারি না যে রাস্তায় নামার সাথে অ্যাপলের কোনও সমস্যা হবে না। তবে এখনও পর্যন্ত কোনও সমস্যা নেই এবং আমি মোটামুটিভাবে নিশ্চিত যে অনেকগুলি অ্যাপস কোনও না কোনও রূপে এটি করে।
বিএমজোনস

4
যদি চেক করা থাকে তবে Requires full screenএটি স্লাইড ওভার এবং স্প্লিট ভিউতে উপলব্ধ অ্যাপ্লিকেশনটিকে আটকাবে। অ্যাপল দ্বারা আইপ্যাডে মাল্টিটাস্কিং এনভান্সমেন্টগুলি গ্রহণ করার দেখুন । আমার কাছে একটি উত্তর সক্ষম করার দরকার নেইRequires full screen
জন প্যাং

4
এটি কাজ করছে না, দ্বিতীয় ভিউ নিয়ন্ত্রণকারী লেআউটটি কেবল প্রতিকৃতিতে এটি প্রদর্শিত হয়নি।
আইকোডার

28

সুইফট 4

এখানে চিত্র বর্ণনা লিখুন অ্যাপডেলিগেট

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

আপনার ভিউকন্ট্রোলারটি নিম্নলিখিত পংক্তি যুক্ত করুন যদি আপনার কেবল প্রতিকৃতি নির্দেশের প্রয়োজন হয়। আপনার এটিকে সমস্ত ভিউকন্ট্রোলারের কাছে প্রয়োগ করতে হবে প্রতিকৃতি মোড প্রদর্শন করা দরকার।

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

এবং এটি অন্যের জন্য স্ক্রিন ওরিয়েন্টেশনকে ডিভাইসের শারীরিক ওরিয়েন্টেশন অনুযায়ী ভিউকন্ট্রোলার তৈরি করবে।

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

    }

সুইফ্ট 4 এর জন্য এটি অবশ্যই শীর্ষের উত্তর। এটি আইওএস ক্যামেরা অ্যাপের আচরণের অনুকরণ করে বলে ঠিক আমার প্রয়োজন ছিল।
নোকডিব

@ নাহিদ আমরা কি func application এই ফাংশনটির মাধ্যমে অ্যাপের প্রতিনিধিদের মধ্যে মূলটি প্রতিস্থাপন করিfunc application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask { return self.orientationLock ?
মুন্দ্রা

সমাধান এবং কিছু চেষ্টা সন্ধানের ঘন্টা বা দু'বার পরে, এটি নিখুঁতভাবে কাজ করা সমাধান। এটি দৃশ্যের ওরিয়েন্টেশনটি সেট করে, ভিউ লোড করার সময় এটিকে জোর করে, অন্য দৃশ্যে যাওয়ার সময় আনলক করে, এটি ট্যাব নেভিগেশনে কাজ করে এবং কোডটি সহজ এবং পরিষ্কার। আপনাকে ধন্যবাদ @ নাহিদ
রাদেক সিপ

13

সুইফট 3 এবং 4

supportedInterfaceOrientationsএই জাতীয় নির্দিষ্ট ইউআইভিউ কনট্রোলারগুলির সম্পত্তি সেট করুন :

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()
    }

    //...
}

হালনাগাদ

এই সমাধান কেবলমাত্র তখনই কাজ যখন আপনার viewControllerকরা হয় না এমবেড UINavigationController, কারণ পিতা বা মাতা viewController থেকে অভিযোজন অধিকারী হয়।
এই ক্ষেত্রে, আপনি একটি সাবক্লাস তৈরি করতে UINavigationViewControllerএবং এটিতে এই বৈশিষ্ট্যগুলি সেট করতে পারেন ।


ধন্যবাদ এটি আমার পক্ষে ভাল কাজ করে কারণ আমি কেবল প্রতিকৃতিতে নির্দিষ্ট ভিউ সীমাবদ্ধ রাখতে চাই। পুরো অ্যাপটি নয় Not
ব্যবহারকারী3204765

আমার কেবলমাত্র নির্দিষ্ট ভিউ কন্ট্রোলারগুলিকে নিয়ন্ত্রন করা নিয়ামক ওরিয়েন্টেশন নির্বিশেষে লক করার জন্য এবং এটি দুর্দান্ত কাজ করেছে!
রায়ান বি

9

প্রতিকৃতি জোর করতে এবং এটি লক করতে এই কোডটি যুক্ত করুন:

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
}

আপনার অ্যাপলিজেটে - সমর্থিত ইন্টারফেস ওরিয়েন্টেশন ফরওয়ার্ড সেট করুন যা আপনি পুরো অ্যাপ্লিকেশনটিকে সমর্থন করতে চান তার যে দিকেই যেতে চান:

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

ধন্যবাদ ভ্যালেন্টিন, আমি সত্যিই আপনার সাহায্যের প্রশংসা করেছি B তবে, আপনার কোডটি কার্যকর হয়নি nd এবং আমি এখনই সমাধান করেছি I
থিহা অং

8

এটি আপনার সমস্যা এবং সম্পর্কিত অন্যান্যদের জন্য জেনেরিক সমাধান।

1. সহায়ক শ্রেণি ইউআইহেল্পার তৈরি করুন এবং নিম্নলিখিত পদ্ধতিগুলি প্রয়োগ করুন:

    /**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
    }

২. আপনার ইচ্ছা আচরণের সাথে একটি প্রোটোকল তৈরি করুন, কারণ আপনার নির্দিষ্ট ক্ষেত্রে প্রতিকৃতি হবে।

প্রোটোকল ওরিয়েন্টেশনএকটি পোর্ট্রেট {}

নোটা: আপনি চাইলে এটি ইউআইহেল্পার ক্লাসের শীর্ষে যুক্ত করুন।

৩. আপনার ভিউ কন্ট্রোলার প্রসারিত করুন

আপনার ক্ষেত্রে:

class Any_ViewController: UIViewController,orientationIsOnlyPortrait {

   ....

}

৪. অ্যাপের প্রতিনিধি শ্রেণিতে এই পদ্ধতিটি যুক্ত করুন:

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

চূড়ান্ত নোট:

  • আপনি যদি আরও ক্লাস প্রতিকৃতি মোডে থাকেন তবে কেবল সেই প্রোটোকলটি প্রসারিত করুন।
  • আপনি যদি অন্যদের নিয়ন্ত্রকদের থেকে আচরণ চান তবে অন্যান্য প্রোটোকল তৈরি করুন এবং একই কাঠামোটি অনুসরণ করুন।
  • এই উদাহরণটি পুশ ভিউ কন্ট্রোলারগুলির পরে ওরিয়েন্টেশন পরিবর্তনের সাথে সমস্যার সমাধান করে

এই সমাধানটির মতো, তবে আমি ইউআইএনএভিগেশন কন্ট্রোলারের এক্সটেনশন হিসাবে ইউআইহেল্পার ফাংশনগুলিকে আরও দরকারী বলে খুঁজে পেয়েছি।
মাইকেল লং

7

সুইফ্টের নতুন সংস্করণের জন্য এটি ব্যবহার করে দেখুন

override var shouldAutorotate: Bool {
    return false
}

override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
    return UIInterfaceOrientationMask.portrait
}

override var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation {
    return UIInterfaceOrientation.portrait
}

আমার যা প্রয়োজন ছিল ঠিক তা-ই! আইপ্যাড কন্ট্রোলারের জন্য সমস্ত ওরিয়েন্টেশন বিকল্প বৈধ এবং আইফোন নিয়ামক কেবলমাত্র এই তিনটি ওভাররাইড - পারফেক্ট লিখে এটির মাধ্যমে প্রতিকৃতি মোডে।
ভিওয়াইটি

5

এই থ্রেডে দুর্দান্ত উত্তরগুলির একটি গোছা, তবে কোনওটিই আমার প্রয়োজনের সাথে মেলে না। আমার কাছে প্রতিটি ট্যাবে নেভিগেশন কন্ট্রোলার সহ একটি ট্যাবড অ্যাপ রয়েছে এবং একটি দর্শন ঘোরানোর জন্য প্রয়োজন, অন্যদের প্রতিকৃতিতে লক করা দরকার। নেভিগেশন কন্ট্রোলার কোনও কারণে এটির সাবভিউগুলি যথাযথ আকারে পরিবর্তন করছিল না। এই উত্তরের সাথে একত্রিত করে একটি সমাধান (সুইফ্ট 3 এ) পাওয়া গেছে এবং বিন্যাসের সমস্যাগুলি অদৃশ্য হয়ে গেল। @ বিএমজোনস দ্বারা প্রস্তাবিত কাঠামো তৈরি করুন:

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

তারপরে সাবক্লাস ইউআইটিববারকন্ট্রোলার:

    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
    }
}

স্টোরিবোর্ডে ট্যাববারকন্ট্রোলারের ক্লাসটি সদ্য নির্মিত সাবক্লাসে পরিবর্তন করতে ভুলবেন না।


4

এখানে একটি সহজ উপায় যা আমার জন্য সুইফট 4.2 (আইওএস 12.2) এর সাথে কাজ করে, এটি এমন একটি স্থানে রাখুন UIViewControllerযার জন্য আপনি কাঁধে অক্ষম রাখতে চান অটোরিওটেট:

override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
    return .portrait
}

.portraitঅংশ বলা হয়েছে যে সব যা অভিযোজন (গুলি) থাকা, আপনি আপনার মত যেমন পরিবর্তন করতে পারেন। গ্রেপ্তার আছেন: .portrait, .all, .allButUpsideDown, .landscape, .landscapeLeft, .landscapeRight, .portraitUpsideDown


2

আপনার অ্যাপ্লিকেশনটির সমস্ত দৃশ্যে ল্যান্ডস্কেপ ওরিয়েন্টেশন সেট করতে এবং সমস্ত অরিয়েন্টেশনগুলিতে কেবলমাত্র একটি দর্শনকে অনুমতি দিন (উদাহরণস্বরূপ ক্যামেরা রোল যুক্ত করতে সক্ষম হতে):

AppDelegate.swift এ:

var adaptOrientation = false

ইন: didFinishLaunchingWithOptions

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

AppDelegate.swift এর অন্য কোথাও:

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
    }
}

তারপরে যে দৃশ্যে আপনি সমস্ত অভিযোজন করতে সক্ষম হতে চান তার সাথে এই দৃষ্টিভঙ্গি করুন:

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)
    }
}

সর্বশেষ জিনিসটি ডিভাইস অরিয়েন্টেশনকে টিকিয়ে রাখা: - প্রতিকৃতি - ল্যান্ডস্কেপ বাম - ল্যান্ডস্কেপ ডানদিকে


2

এর সাথে নতুন এক্সটেনশন তৈরি করুন

import UIKit

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

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

1

bmjohns -> আপনি আমার জীবন রক্ষাকারী। এটিই একমাত্র কার্যকরী সমাধান (অ্যাপ্লিকেশন স্ট্রাক্ট সহ)

আমি এই ক্লাসটি তৈরি করেছি:

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

    }
}

এবং আপনার নির্দেশাবলী অনুসরণ করে, এবং সবকিছু সুইফট 3 -> এক্সকোড সংস্করণ 8.2.1 এর জন্য পুরোপুরি কাজ করে


1

আইওএস 10 এবং 11 হিসাবে, আইপ্যাড স্লাইড ওভার এবং স্প্লিট ভিউ সমর্থন করে। স্লাইড ওভার এবং স্প্লিট ভিউতে কোনও অ্যাপ্লিকেশন সক্ষম করতে Requires full screen অবশ্যই চেক করা উচিত । এর অর্থ যদি অ্যাপ্লিকেশন স্লাইড ওভার এবং স্প্লিট ভিউটিকে সমর্থন করতে চায় তবে গৃহীত উত্তরটি ব্যবহার করা যাবে না । অ্যাপলের থেকে আরো দেখুন iPad এ দত্তক একাধিক উন্নত বৈশিষ্ট্য এখানে

আমার কাছে একটি সমাধান রয়েছে যা (1) আনচেকিং Requires full screen, (2) কেবলমাত্র একটি ফাংশন কার্যকর করতে হবে appDelegate(বিশেষত যদি আপনি লক্ষ্য ভিউ নিয়ন্ত্রণকারীদের / পরিবর্তন করতে না চান) এবং (3) পুনরাবৃত্তি কলগুলি এড়াতে চান। সহায়ক শ্রেণি বা এক্সটেনশনের দরকার নেই।

appDelegate.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]
}

সম্পাদনা করুন

@ বিএমজোনস উল্লেখ করেছেন যে এই ফাংশনটি আইপ্যাডে ডাকা হয়নি। আমি যাচাই করেছি এবং হ্যাঁ এটি কল করা হয়নি। সুতরাং, আমি কিছুটা আরও পরীক্ষা করেছি এবং কিছু তথ্য খুঁজে পেয়েছি:

  1. আমি চেক করা হয়নি Requires full screenকারণ আমি আইপ্যাডে স্লাইড ওভার এবং স্লাইড ভিউ সক্ষম করতে চাই। যে Info.plist এ, iPad এর জন্য সমস্ত 4 স্থিতিবিন্যাস সমর্থন করার জন্য অ্যাপ্লিকেশন প্রয়োজন: Supported interface orientations (iPad)

আমার অ্যাপ্লিকেশনটি ফেসবুকের মতোই কাজ করে: আইফোনে, বেশিরভাগ সময় এটি প্রতিকৃতিতে লক থাকে। পূর্ণ স্ক্রিনে চিত্র দেখার সময়, ব্যবহারকারীদের আরও ভাল দেখার জন্য ল্যান্ডস্কেপ ঘোরানোর মঞ্জুরি দেয়। আইপ্যাডে, ব্যবহারকারীরা যে কোনও দৃশ্যের নিয়ামকগুলিতে যেকোন অভিমুখে যেতে পারেন। সুতরাং, আইপ্যাড স্মার্ট কভারের (ল্যান্ডস্কেপ বাম) উপর দাঁড়িয়ে থাকলে অ্যাপটি দেখতে দুর্দান্ত লাগবে।

  1. আইপ্যাড কল করার জন্য application(_:supportedInterfaceOrientationsFor), তথ্য.পল্লিস্টে কেবল আইপ্যাডের জন্য প্রতিকৃতি রাখুন। অ্যাপ্লিকেশনটি স্লাইড ওভার + স্প্লিট ভিউয়ের ক্ষমতা হারাবে। তবে আপনি যে কোনও ভিউ কন্ট্রোলারের জন্য ওরিয়েন্টেশনটি লক বা আনলক করতে পারেন, কেবলমাত্র এক জায়গায় এবং ভিউকন্ট্রোলার শ্রেণিতে কোনও পরিবর্তন করার দরকার নেই।

  2. অবশেষে, এই ফাংশনটি ভিউ কন্ট্রোলারের জীবনচক্রটিতে কল করা হয়, যখন ভিউ প্রদর্শিত হয় / সরানো হয়। যদি আপনার অ্যাপ্লিকেশনটিকে অন্য সময়ে লক / আনলক / ওরিয়েন্টেশন পরিবর্তন করার প্রয়োজন হয় তবে এটি কার্যকর নাও হতে পারে


এটি কি আইফোনের জন্য কাজ করছে? আমি কেবলমাত্র ল্যান্ডস্কেপে আমার একটি ভিউকন্ট্রোলার প্রদর্শন করতে চাই।
আইকোডার

হ্যাঁ. আইফোন জন্য কাজ। আমি আমার প্রতিকৃতি এবং ল্যান্ডস্কেপ উভয়ইতে আমার দৃশ্যের নিয়ামক চাই এবং এটিকে বরখাস্ত করার পরে প্রতিকৃতিতে ফিরতে চাই।
জন পাং

1

এর জন্য প্রকৃত পরীক্ষিত সমাধান .আমার উদাহরণে আমার প্রয়োজন আমার সম্পূর্ণ অ্যাপ্লিকেশনটি প্রতিকৃতি মোডে হওয়া উচিত, তবে কেবলমাত্র একটি পর্দার ওরিয়েন্টেশন ল্যান্ডস্কেপ মোডে থাকা উচিত। কেবল প্রতিকৃতি মোডে চেক করে অ্যাপ্লিকেশনটির জন্য একটি প্রতিকৃতি নির্দেশ করুন

উপরে বর্ণিত উত্তর হিসাবে 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")
}  
}

আপনার ল্যান্ডস্কেপ ওরিয়েন্টেশন ভিউকন্ট্রোলার উপস্থাপন / ধাক্কা দেওয়ার আগে এই কোডটি লিখুন।

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

তারপরে এই কোডটি প্রকৃত ভিউকন্ট্রোলারে লিখুন (ভূদৃশ্য দেখার জন্য)

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

0

উপরে @ বিএমজোহনের উত্তরের জন্য ধন্যবাদ অন্যদের প্রতিলিপি দেওয়ার সময় বাঁচানোর জন্য এখানে উত্তরটির কোডটির একটি কার্যকরী জামারিন / সি # সংস্করণ রয়েছে:

AppDelegate.cs

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

স্ট্যাটিক ওরিয়েন্টেশন ইউটিলিটি.সি ক্লাস:

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

নিয়ামক দেখুন:

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

আমি বুঝতে পারি না এই উত্তরটি কীভাবে প্রাসঙ্গিক? এই ব্যক্তিটি দ্রুত জিজ্ঞাসা করেছিল এবং আপনি জামারিনে দিয়েছেন।
মিহির ওজা

0

আমি কিছুটা পরীক্ষা-নিরীক্ষা করেছি এবং আমি এই সমস্যার পরিষ্কার সমাধান খুঁজতে সক্ষম হয়েছি। পদ্ধতির ভিউ-> ট্যাগের মাধ্যমে ভিউ ট্যাগিংয়ের উপর ভিত্তি করে

টার্গেটে ভিউকন্ট্রোলার নীচের কোড উদাহরণের মতোই মূল ভিউতে ট্যাগ বরাদ্দ করুন:

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;
  }

এবং অবশেষে AppDelegate.swift চেকটিতে বর্তমানে দেখানো ভিউটি আমাদের ট্যাগ করা হয়েছে কিনা তা পরীক্ষা করে দেখুন:

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

এই পদ্ধতির আমার সিমুলেটার দিয়ে পরীক্ষা করা হয়েছে এবং মনে হয় এটি ঠিক আছে।

দ্রষ্টব্য: বর্তমান এমভিসি নেভিগেশন স্ট্যাকের কিছু শিশু ViewController এর সাথে ওভারল্যাপ করা থাকলে চিহ্নিত দর্শনটিও পাওয়া যাবে।


0

প্রতিকৃতি এবং ল্যান্ডস্কেপ লক এবং পরিবর্তন ওরিয়েন্টেশন জন্য সেরা সমাধান:

এই ভিডিওটি ইউটিউবে দেখুন:

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

এই টিউটোরিয়ালটি সেরা এবং সহজ।

অথবা নীচে কোড ব্যবহার করুন:

এই ছবিটি দেখুন

// 1- দ্বিতীয় ভিউকন্ট্রোলারে আমরা ল্যান্ডস্কেপফিট সেট করি এবং প্রথম ভিউকন্ট্রোলারে আমরা প্রতিকৃতি সেট করি:

// 2- আপনি যদি নেভিগেশনকন্ট্রোলার ব্যবহার করেন তবে আপনার এক্সটেনশন যুক্ত করা উচিত

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
    
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.