সুইফ্ট - ওরিয়েন্টেশন পরিবর্তনগুলি কীভাবে সনাক্ত করতে হয়


96

আমি একক চিত্র দর্শনে দুটি চিত্র যুক্ত করতে চাই (যেমন ল্যান্ডস্কেপের জন্য একটি চিত্র এবং অন্য চিত্রের প্রতিকৃতির জন্য) তবে কীভাবে সুইফট ভাষা ব্যবহার করে ওরিয়েন্টেশন পরিবর্তনগুলি সনাক্ত করতে হয় তা আমি জানি না।

আমি এই উত্তরটি চেষ্টা করেছিলাম তবে এটি কেবল একটি চিত্র নেয়

override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
    if UIDevice.currentDevice().orientation.isLandscape.boolValue {
        print("Landscape")
    } else {
        print("Portrait")
    }
}

আমি আইওএস বিকাশে নতুন, কোন পরামর্শ প্রশংসা হবে!


4
আপনি কি আপনার প্রশ্নটি সম্পাদনা করতে এবং আপনার কোডটি ফর্ম্যাট করতে পারেন? আপনি যখন আপনার কোড নির্বাচন করেছেন তখন আপনি এটি সেমিডি + কে দিয়ে করতে পারেন।
jbehrens94

4
এই চেক আউট stackoverflow.com/questions/25666269/...
DSAjit

এটি ল্যান্ডস্কেপ / প্রতিকৃতি সঠিকভাবে মুদ্রণ করে?
ড্যানিয়েল

হ্যাঁ এটি সঠিকভাবে @ সিম্পলবোসি প্রিন্ট করে
রঘুরাম

আপনার ডিভাইস ওরিয়েন্টেশন => স্ট্যাকওভারফ্লো.com
উইলফ্রিড জোসেট

উত্তর:


121
let const = "Background" //image name
let const2 = "GreyBackground" // image name
    @IBOutlet weak var imageView: UIImageView!
    override func viewDidLoad() {
        super.viewDidLoad()

        imageView.image = UIImage(named: const)
        // Do any additional setup after loading the view.
    }

    override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
        super.viewWillTransition(to: size, with: coordinator)
        if UIDevice.current.orientation.isLandscape {
            print("Landscape")
            imageView.image = UIImage(named: const2)
        } else {
            print("Portrait")
            imageView.image = UIImage(named: const)
        }
    }

ধন্যবাদ ইমেজভিউয়ের জন্য এটি কাজ করে, আমি যদি কনট্রোলারটিতে পটভূমি চিত্র যুক্ত করতে চাই তবে কি হবে ??
রঘুরাম

4
পটভূমিতে একটি চিত্রভিউ রাখুন। সমস্ত পটভূমি কভার করতে ভিউকন্ট্রোলার মূল দৃশ্যে অনুসরণ করে শীর্ষ, নীচের, শীর্ষস্থানীয়, চিত্রের ভিউকে সীমাবদ্ধ করুন।
utত্বিক কানবার্গি

4
আপনার ওভাররাইড পদ্ধতির মধ্যে সুপার.ভিউউইলট্রান্সটেশন টোসাইজ কল করতে ভুলবেন না
ব্রায়ান সাচেত্ত

আপনি কি জানেন যে viewWillTransitionসাবক্লাসিংয়ের সময় আমি কেন ওভাররাইড করতে পারি না UIView?
এক্সকোডার

4
অন্য অভিযোজন টাইপ হল: .isFlat। আপনি যদি কেবল ধরতে চান তবে portraitআমি আপনাকে অন্য ধারাটি পরিবর্তন করতে পরামর্শ দিই else if UIDevice.current.orientation.isPortrait। দ্রষ্টব্য: .isFlatপ্রতিকৃতি এবং ল্যান্ডস্কেপ উভয় ক্ষেত্রেই ঘটতে পারে এবং অন্য কোনও কিছু দিয়ে}। এটি সর্বদা ডিফল্ট হবে (এমনকি এটি ফ্ল্যাট লেন্সকেপ হলেও)।
পিএমটি

78

ব্যবহার NotificationCenter এবং UIDevice এরbeginGeneratingDeviceOrientationNotifications

সুইফট 4.2+ +

override func viewDidLoad() {
    super.viewDidLoad()        

    NotificationCenter.default.addObserver(self, selector: #selector(ViewController.rotated), name: UIDevice.orientationDidChangeNotification, object: nil)
}

deinit {
   NotificationCenter.default.removeObserver(self, name: UIDevice.orientationDidChangeNotification, object: nil)         
}

func rotated() {
    if UIDevice.current.orientation.isLandscape {
        print("Landscape")
    } else {
        print("Portrait")
    }
}

সুইফট 3

override func viewDidLoad() {
    super.viewDidLoad()        

    NotificationCenter.default.addObserver(self, selector: #selector(ViewController.rotated), name: NSNotification.Name.UIDeviceOrientationDidChange, object: nil)
}

deinit {
     NotificationCenter.default.removeObserver(self)
}

func rotated() {
    if UIDevice.current.orientation.isLandscape {
        print("Landscape")
    } else {
        print("Portrait")
    }
}

4
অবশ্যই - আমার পদ্ধতির জন্য কিছু অতিরিক্ত কোড দরকার। তবে এটি সত্যই "ওরিয়েন্টেশন পরিবর্তনগুলি সনাক্ত করে"।
maslovsa

4
@ মিশেল যেহেতু viewWillTransition:প্রত্যাশা করে যে পরিবর্তনটি ঘটবে তখন ব্যবহারের সময় UIDeviceOrientationDidChangeপরিবর্তনটি সম্পূর্ণ হওয়ার পরে ডাকা হবে ।
লিন্ডসে স্কট

4
@ লিন্ডসেস্কট আমি এখনও বিশ্বাস করি যে সম্ভাব্য বিপজ্জনক এনএসনিটিফিকেশন সেন্টার ব্যবহার না করে বর্ণিত আচরণ অর্জন করা যেতে পারে। দয়া করে নীচের উত্তরটি পর্যালোচনা করুন এবং আমাকে আপনার চিন্তাগুলি জানান: স্ট্যাকওভারফ্লো.com
মাইকেল

4
এই উত্তরে মজার বিষয় হ'ল ভিউ কন্ট্রোলার shouldAutorotateসেট করা থাকা সত্ত্বেও এটি বর্তমান ওরিয়েন্টেশন দেবে false। এটি ক্যামেরা অ্যাপের প্রধান পর্দার মতো পর্দার জন্য কার্যকর - ওরিয়েন্টেশনটি লক করা আছে তবে বোতামগুলি ঘোরতে পারে।
yoninja

4
আইওএস 9 হিসাবে আপনার স্পষ্টভাবে ডিনিট কল করতে হবে না। আপনি এটি সম্পর্কে এখানে আরও পড়তে পারেন: useyourloaf.com/blog/…
জেমস জর্ডান টেলর

63

উপরের কোডটি সুইফট 3 আপডেট হয়েছে:

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    super.viewWillTransition(to: size, with: coordinator)

    if UIDevice.current.orientation.isLandscape {
        print("Landscape")
    } else {
        print("Portrait")
    }
}

4
আপনি কি জানেন যে ইউআইভিউ সাবক্লাসিংয়ের সময় আমি কেন ভিউলিট ট্রানসিশনকে ওভাররাইড করতে পারি না?
এক্সকোডার

আপনি যদি নিয়ামকের কোনও মতামতকে রেফারেন্স করার চেষ্টা করেন তবে এটি ক্রাশ হবে।
জেমস জর্ডান টেলর

@ জেমস জর্দান টেলর আপনি কি দয়া করে ব্যাখ্যা করতে পারেন কেন এটি ক্র্যাশ হবে?
orium

এটি 6 মাস আগে যখন আমি মন্তব্য করেছি, তবে আমি মনে করি যে Xcode দেওয়ার চেষ্টা করার সময় যে কারণটি দিয়েছিল তা শূন্য পয়েন্টার ব্যতিক্রম ছিল কারণ ভিউ নিজেই ততক্ষণে তাত্ক্ষণিকভাবে চালু করা হয়নি, কেবল ভিউকন্ট্রোলার। আমি যদিও দুর্দশাগ্রস্থ হতে পারি।
জেমস জর্ডান টেলর

@ এক্সকোডার এটি ইউআইভিউ কনট্রোলার না ইউআইভিউতে একটি ফাংশন - এজন্য আপনি এটিকে ওভাররাইড করতে পারবেন না।
লাইটনিংস্ট্রিট

25

Ev ডিভাইস ওরিয়েন্টেশন! = ইন্টারফেস ওরিয়েন্টেশন ⚠️

সুইফট 5. * আইওএস 14 এবং নীচে

আপনার মধ্যে সত্যই পার্থক্য করা উচিত:

  • ডিভাইস ওরিয়েন্টেশন => দৈহিক ডিভাইসের ওরিয়েন্টেশন নির্দেশ করে
  • ইন্টারফেস ওরিয়েন্টেশন => স্ক্রিনে প্রদর্শিত ইন্টারফেসের ওরিয়েন্টেশন নির্দেশ করে

এমন অনেকগুলি পরিস্থিতি রয়েছে যেখানে এই 2 টি মান মিলছে না যেমন:

  • আপনি যখন আপনার স্ক্রিন ওরিয়েন্টেশন লক করবেন
  • যখন আপনার ডিভাইস সমতল হবে

বেশিরভাগ ক্ষেত্রে আপনি ইন্টারফেস অরিয়েন্টেশন ব্যবহার করতে চান এবং আপনি এটি উইন্ডো দিয়ে পেতে পারেন:

private var windowInterfaceOrientation: UIInterfaceOrientation? {
    return UIApplication.shared.windows.first?.windowScene?.interfaceOrientation
}

আপনি যদি <আইওএস 13 (যেমন আইওএস 12) সমর্থন করতে চান তবে আপনি নিম্নলিখিতগুলি করতে পারেন:

private var windowInterfaceOrientation: UIInterfaceOrientation? {
    if #available(iOS 13.0, *) {
        return UIApplication.shared.windows.first?.windowScene?.interfaceOrientation
    } else {
        return UIApplication.shared.statusBarOrientation
    }
}

এখন আপনাকে উইন্ডো ইন্টারফেস ওরিয়েন্টেশন পরিবর্তনের ক্ষেত্রে কোথায় প্রতিক্রিয়া জানাতে হবে তা নির্ধারণ করতে হবে। এটি করার একাধিক উপায় রয়েছে তবে সর্বোত্তম সমাধানটি এর মধ্যে এটি করা willTransition(to newCollection: UITraitCollection

এই উত্তরাধিকার সূত্রে প্রাপ্ত ইউআইভিউউকন্ট্রোলার পদ্ধতিটি যা ওভাররাইড করা যায় তা প্রতিবার ইন্টারফেসের ওরিয়েন্টেশন পরিবর্তন হওয়ার সাথে সাথে ট্রিগার হবে। ফলস্বরূপ আপনি পরে সমস্ত পরিবর্তন করতে পারেন do

এখানে একটি সমাধান উদাহরণ:

class ViewController: UIViewController {
    override func willTransition(to newCollection: UITraitCollection, with coordinator: UIViewControllerTransitionCoordinator) {
        super.willTransition(to: newCollection, with: coordinator)
        
        coordinator.animate(alongsideTransition: { (context) in
            guard let windowInterfaceOrientation = self.windowInterfaceOrientation else { return }
            
            if windowInterfaceOrientation.isLandscape {
                // activate landscape changes
            } else {
                // activate portrait changes
            }
        })
    }
    
    private var windowInterfaceOrientation: UIInterfaceOrientation? {
        return UIApplication.shared.windows.first?.windowScene?.interfaceOrientation
    }
}

এই পদ্ধতিটি প্রয়োগ করে আপনি তারপরে আপনার ইন্টারফেসের দিকনির্দেশের যে কোনও পরিবর্তনের বিষয়ে প্রতিক্রিয়া জানাতে সক্ষম হবেন। তবে মনে রাখবেন অ্যাপটি খোলার সময় এটিকে ট্রিগার করা হবে না যাতে আপনার নিজের ইন্টারফেসটি ম্যানুয়ালি আপডেট করতে হবে viewWillAppear()

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

নিখরচায় নিখরচায় নিম্নলিখিত সংগ্রহস্থলটি চালনা করুন: https://github.com/wjosset/ReactToOrientation


আইওএস 13 এর আগে এটি কীভাবে করবেন?
ড্যানিয়েল স্প্রিঞ্জার

4
@ ড্যানিয়েলস্প্রিংগার আপনার মন্তব্যের জন্য আপনাকে ধন্যবাদ, আমি 12 এবং নীচে আইওএস সমর্থন করার জন্য পোস্টটি সম্পাদনা করেছি
উইলফ্রিড জোসেট

4
আমি এই উত্তরটি সবচেয়ে ভাল এবং সবচেয়ে তথ্যপূর্ণ বলে মনে করি। তবে আইপ্যাডএস 1313-এ পরীক্ষার প্রস্তাবিত ব্যবহারের func willTransition(to newCollection: UITraitCollection, with coordinator: UIViewControllerTransitionCoordinator)কাজ হয়নি। আমি এটি ব্যবহার করে কাজ করেছি func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator)
আন্দ্রেজ

12

সুইফট 4+: আমি সফট কীবোর্ড ডিজাইনের জন্য এটি ব্যবহার করছিলাম এবং কোনও কারণে UIDevice.current.orientation.isLandscapeপদ্ধতিটি আমাকে তা বলে চলেছে Portrait, সুতরাং আমি পরিবর্তে যা ব্যবহার করেছি তা এখানে:

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    super.viewWillTransition(to: size, with: coordinator)

    if(size.width > self.view.frame.size.width){
        //Landscape
    }
    else{
        //Portrait
    }
}

ভাল, আমার আইমেসেজ অ্যাপ্লিকেশনটিতে আমারও একই সমস্যা রয়েছে। আসলেই কি অদ্ভুত নয়? এবং, এমনকি আপনার সমাধান বিপরীতে কাজ করে !! ¯_ (ツ) _ / ¯
শ্যাম

ইউআইএস স্ক্রিন.মাইন.বাউন্ডগুলি ব্যবহার করবেন না, কারণ এটি আপনাকে রূপান্তরের আগে পর্দার সীমানা দিতে পারে (পদ্ধতিটিতে 'উইল' মনে রাখবেন), বিশেষত একাধিক দ্রুত ঘোরাঘুরিতে। আপনার 'আকার' প্যারামিটারটি ব্যবহার করা উচিত ...
ড্যান বোদনার

@ ড্যান-বোদনার আপনি কী দেশীয় বাউন্ডের প্যারামিটার বলতে চান?
सेटনিপ

4
@ এ্যাসটনিওপ, না sizeপরামিতি যে viewWillTransitionToSize মধ্যে ইনজেকশনের হয়: withCoordinator: পদ্ধতি আপনি উপরের লিখিত। এটি রূপান্তরিত হওয়ার পরে আপনার দর্শনটির সঠিক আকারটি প্রতিফলিত করবে।
ড্যান বোদনার

আপনি চাইল্ড ভিউ কন্ট্রোলার ব্যবহার করে থাকলে এটি কোনও ভাল সমাধান নয়, ধারকতা নির্বিশেষে ধারকটির আকার সর্বদা বর্গক্ষেত্র হতে পারে।
বুজান

8

সুইফট 4.2, আরএক্সসুইফ্ট

আমাদের যদি সংগ্রহ ভিউ পুনরায় লোড করার দরকার হয়।

NotificationCenter.default.rx.notification(UIDevice.orientationDidChangeNotification)
    .observeOn(MainScheduler.instance)
    .map { _ in }            
    .bind(to: collectionView.rx.reloadData)
    .disposed(by: bag)

সুইফট 4, আরএক্সসুইফ্ট

আমাদের যদি সংগ্রহ ভিউ পুনরায় লোড করার দরকার হয়।

NotificationCenter.default.rx.notification(NSNotification.Name.UIDeviceOrientationDidChange)
    .observeOn(MainScheduler.instance)
    .map { _ in }            
    .bind(to: collectionView.rx.reloadData)
    .disposed(by: bag)

5

আমি বিশ্বাস করি সঠিক উত্তরটি আসলে উভয় পদ্ধতির সংমিশ্রণ: viewWIllTransition(toSize:)এবং NotificationCenterএর UIDeviceOrientationDidChange

viewWillTransition(toSize:)স্থানান্তরের আগে আপনাকে অবহিত করে ।

NotificationCenter UIDeviceOrientationDidChangeপরে আপনাকে অবহিত ।

আপনাকে খুব সাবধান হতে হবে। উদাহরণস্বরূপ, UISplitViewControllerযখন ডিভাইসটি কিছু নির্দিষ্ট অরিয়েন্টেশনগুলিতে ঘোরানো হয়, তখন DetailViewControllerthe UISplitViewController'র viewcontrollersঅ্যারেটি পপআপ হয়ে যায় এবং মাস্টারের দিকে ধাক্কা দেয় UINavigationController। ঘূর্ণন শেষ হওয়ার আগে আপনি যদি বিশদ ভিউ কন্ট্রোলারের জন্য অনুসন্ধান করতে যান তবে এটি উপস্থিত না থাকলে এবং ক্রাশ নাও হতে পারে।


5

যদি আপনি সুইফ্ট সংস্করণ> = 3.0 ব্যবহার করেন তবে অন্যদের ইতিমধ্যে যেমনটি বলেছে তেমন কিছু কোড আপডেটের জন্য আপনাকে প্রয়োগ করতে হবে। শুধু সুপার কল করতে ভুলবেন না:

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {

   super.viewWillTransition(to: size, with: coordinator)

   // YOUR CODE OR FUNCTIONS CALL HERE

}

আপনি যদি নিজের চিত্রগুলির জন্য স্ট্যাকভিউ ব্যবহার করার কথা ভাবছেন তবে সচেতন হন আপনি নীচের মতো কিছু করতে পারেন:

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {

   super.viewWillTransition(to: size, with: coordinator)

   if UIDevice.current.orientation.isLandscape {

      stackView.axis = .horizontal

   } else {

      stackView.axis = .vertical

   } // else

}

যদি আপনি ইন্টারফেস বিল্ডার ব্যবহার করছেন তবে ডান প্যানেলে আইডেন্টিটি ইন্সপেক্টর বিভাগে এই ইউআইএসট্যাকভিউ অবজেক্টের জন্য কাস্টম ক্লাসটি নির্বাচন করতে ভুলবেন না। তারপরে কেবল কাস্টম ইউআইএসট্যাকভিউ দৃষ্টান্তের আইবিআউটলেট রেফারেন্সটি (ইন্টারফেস বিল্ডারের মাধ্যমেও) তৈরি করুন:

@IBOutlet weak var stackView: MyStackView!

ধারণাটি নিন এবং এটি আপনার প্রয়োজনের সাথে খাপ খাইয়ে নিন। আশা করি এটি আপনাকে সহায়তা করতে পারে!


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

আপনি কি জানেন যে ইউআইভিউ সাবক্লাসিংয়ের সময় আমি কেন ভিউলিট ট্রানসিশনকে ওভাররাইড করতে পারি না?
এক্সকোডার

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

5

সুইফট 4

UIDevice.current.orientationঘুরানোর সময় বা সাবভিউয়ের অ্যানিমেশনের সময় টেবিলভিউ সেলগুলির সীমাবদ্ধতাগুলি আপডেট করার মতো ব্যবহার করে ভিউকন্ট্রোলার্স ভিউ আপডেট করার সময় আমার কিছু ছোটখাটো সমস্যা ছিল ।

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

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    super.viewWillTransition(to: size, with: coordinator)
    print("Will Transition to size \(size) from super view size \(self.view.frame.size)")

    if (size.width > self.view.frame.size.width) {
        print("Landscape")
    } else {
        print("Portrait")
    }

    if (size.width != self.view.frame.size.width) {
        // Reload TableView to update cell's constraints.
    // Ensuring no dequeued cells have old constraints.
        DispatchQueue.main.async {
            self.tableView.reloadData()
        }
    }


}

একটি আইফোন 6 এ আউটপুট:

Will Transition to size (667.0, 375.0) from super view size (375.0, 667.0) 
Will Transition to size (375.0, 667.0) from super view size (667.0, 375.0)

প্রকল্পের স্তর থেকে আমাকে ওরিয়েন্টেশন সহায়তা চালু করতে হবে?
এরিকপুন

3

পূর্ববর্তী সমস্ত অবদানগুলি ঠিক আছে তবে একটি সামান্য নোট:

ক) ওরিয়েন্টেশনটি যদি প্লিস্টে সেট করা থাকে তবে কেবল প্রতিকৃতি বা উদাহরণ হিসাবে আপনাকে ভিউউইল ট্রান্সশিশনের মাধ্যমে জানানো হবে না

খ) যদি আমাদের যাইহোক ব্যবহারকারীদের ডিভাইস ঘোরানো হয়েছে কিনা তা জানতে হবে, (উদাহরণস্বরূপ একটি খেলা বা অনুরূপ ..) আমরা কেবল ব্যবহার করতে পারি:

NotificationCenter.default.addObserver(self, selector: #selector(ViewController.rotated), name: NSNotification.Name.UIDeviceOrientationDidChange, object: nil)

Xcode8, iOS11 এ পরীক্ষিত tested


2

রূপান্তরটি সম্পূর্ণ হওয়ার পরে আপনি ইন্টারফেস ওরিয়েন্টেশন পেতে ব্যবহার করতে viewWillTransition(to:with:)এবং এটিতে আলতো চাপতে পারেন animate(alongsideTransition:completion:)। ইভেন্টটিতে আলতো চাপার জন্য আপনাকে ঠিক এটির মতো একটি প্রোটোকল সংজ্ঞায়িত করতে এবং প্রয়োগ করতে হবে। নোট করুন যে এই কোডটি একটি স্প্রিটকিট গেমের জন্য ব্যবহৃত হয়েছিল এবং আপনার নির্দিষ্ট প্রয়োগটি পৃথক হতে পারে।

protocol CanReceiveTransitionEvents {
    func viewWillTransition(to size: CGSize)
    func interfaceOrientationChanged(to orientation: UIInterfaceOrientation)
}
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
        super.viewWillTransition(to: size, with: coordinator)

        guard
            let skView = self.view as? SKView,
            let canReceiveRotationEvents = skView.scene as? CanReceiveTransitionEvents else { return }

        coordinator.animate(alongsideTransition: nil) { _ in
            if let interfaceOrientation = UIApplication.shared.windows.first?.windowScene?.interfaceOrientation {
                canReceiveRotationEvents.interfaceOrientationChanged(to: interfaceOrientation)
            }
        }

        canReceiveRotationEvents.viewWillTransition(to: size)
    }

আপনি এই ফাংশনগুলিতে ব্রেকপয়েন্টগুলি সেট করতে পারেন এবং পর্যবেক্ষণ করতে পারেন interfaceOrientationChanged(to orientation: UIInterfaceOrientation)যা সর্বদা viewWillTransition(to size: CGSize)আপডেট অভিযোজন সহ ডাকা হয় ।


1

অ্যাপ্লিকেশন শুরু করার সঠিক দিকনির্দেশ পেতে আপনাকে এটি পরীক্ষা করে দেখতে হবে viewDidLayoutSubviews()। এখানে বর্ণিত অন্যান্য পদ্ধতিগুলি কাজ করবে না।

এটি কীভাবে করবেন তা এখানে একটি উদাহরণ:

var mFirstStart = true

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    if (mFirstStart) {
        mFirstStart = false
        detectOrientation()
    }
}

func detectOrientation() {
    if UIDevice.current.orientation.isLandscape {
        print("Landscape")
        // do your stuff here for landscape
    } else {
        print("Portrait")
        // do your stuff here for portrait
    }
}

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    detectOrientation()
}

এটি সর্বদা কার্যকর হবে অ্যাপ্লিকেশন শুরু করার আগে এবং অ্যাপটি চলাকালীন ঘুরছে ।


0

ডিভাইস ওরিয়েন্টেশন সনাক্তকরণের আরেকটি উপায় হ'ল ফাংশন ট্রিটক্লাকশনডিডচ্যাঞ্জ (_ :) with আইওএস ইন্টারফেসের পরিবেশ পরিবর্তিত হলে সিস্টেমটি এই পদ্ধতিটি কল করে।

override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?)
{
    super.traitCollectionDidChange(previousTraitCollection)
    //...
}

তদ্ব্যতীত, আপনি ওরিয়েন্টেশন প্রয়োগের ঠিক আগে তথ্য পেতে, ফাংশন উইল ট্রান্সনিশন (এর সাথে: :) (যা ট্রাইটক্লিকেশনডিডচেনজ (_ :)) এর আগে ডাকা হয়) ব্যবহার করতে পারেন।

 override func willTransition(to newCollection: UITraitCollection, with coordinator: UIViewControllerTransitionCoordinator)
{
    super.willTransition(to: newCollection, with: coordinator)
    //...
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.