ওরিয়েন্টেশন পরিবর্তন কীভাবে সনাক্ত করবেন?


148

আমি সুইফ্ট ব্যবহার করছি এবং আমি যখন কোনও ল্যান্ডস্কেপে ঘুরে দেখি তখন কোনও ইউআইভিউকন্ট্রোলার লোড করতে সক্ষম হতে চাই, কেউ কি আমাকে সঠিক দিকে নির্দেশ করতে পারে?

আমি অনলাইন এবং ডকুমেন্টেশন দ্বারা কিছুটা বিভ্রান্ত কিছুই খুঁজে পাচ্ছি না।


1
আমি অনুমান করি যে API পরিবর্তন হয়নি তাই এটি "didRotateToOrientation" এবং "willRotateToOrientation" হওয়া উচিত, এর মতো কিছু, অ্যাপলের নথিভুক্তিতে একবার দেখুন
ডেভিড 'এমআরএম' আনসারমোট

1
হাই @ mArm.ch, দ্রুত উত্তরের জন্য ধন্যবাদ! তাহলে আমি কীভাবে এটি বাস্তবায়ন করব? (এটা আমার প্রথম অ্যাপ্লিকেশন ... আমি চলচ্চিত্র IOS খুব নতুন আছি) :)
ডেভিড

আমি উত্তর হিসাবে পোস্ট করেছি, অন্য লোকের জন্য। আপনার পক্ষে ঠিক থাকলে আপনি কি তা গ্রহণ করতে পারবেন?
ডেভিড 'এমআরএম' আনসারমোট

উত্তর:


194

আমি কীভাবে এটি কাজ করেছিলাম তা এখানে:

ইন AppDelegate.swiftভিতরে didFinishLaunchingWithOptions ফাংশন আমি করা:

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

এবং তারপরে অ্যাপডেলিগেট শ্রেণীর ভিতরে আমি নিম্নলিখিত ফাংশনটি রেখেছি:

func rotated() {
    if UIDeviceOrientationIsLandscape(UIDevice.current.orientation) {
        print("Landscape")
    }

    if UIDeviceOrientationIsPortrait(UIDevice.current.orientation) {
        print("Portrait")
    }
}

আশা করি এটি অন্য কাউকে সাহায্য করবে!

ধন্যবাদ!


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

1
আমি কোডিংয়ে নতুন তবে এর selectorস্ট্রিং ফর্ম্যাটটি থাকা উচিত নয় "rotated:"??
চ্যামিলিয়ন

4
আমি খুব নিশ্চিত যে কেবলমাত্র যদি আপনি যুক্তিগুলি গ্রহণ করেন (যা rotated()না)
ডেভিড

26
এর থেকে UIDeviceOrientationআলাদা কিছু হ'ল সাবধানতা অবলম্বন করুন UIInterfaceOrientation.. এটি কারণ হ'ল UIDeviceOrientationমুখটি নীচু করে এবং মুখোমুখি অবস্থানগুলি সনাক্ত করে যার অর্থ আপনার কোডটি প্রতিকৃতি এবং ল্যান্ডস্কেপের মধ্যে এলোমেলোভাবে ঝাঁপিয়ে উঠতে পারে যদি আপনার ডিভাইসটি প্রায় সমতল তবে কিছুটা অসম পৃষ্ঠের উপরে বসে থাকে (অর্থাত্ প্রসারণে দোলনা) 6 / 6s এর ক্যামেরা)
লায়ামনিচল

4
এই পদ্ধতিটি যদি ফোনের স্বয়ংক্রিয় ঘূর্ণন অক্ষম করে তবে কাজ করবেন না।
চেঙ্গসাম

178
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    if UIDevice.current.orientation.isLandscape {
        print("Landscape")
    }
    if UIDevice.current.orientation.isFlat {
        print("Flat")
    } else {
        print("Portrait")
    }
}

71
এটিকে আবর্তনের আগে বলা হবে। আপনার যদি প্রয়োজন হয় যেমন ঘোরার পরে ফ্রেমের আকার এই সমাধানটি কাজ করবে না।
উপোট করুন

এক্সটেনশনে কাজ করেনি। ল্যান্ডস্কেপ বা প্রতিকৃতি এখনও "প্রতিকৃতি" মুদ্রণ করে
টমসওয়ায়ার

4
এই পদ্ধতিটি যদি ফোনের স্বয়ংক্রিয় ঘূর্ণন অক্ষম করে তবে কাজ করবেন না।
চেঙ্গসাম

5
আইপ্যাডে, যেহেতু আকার শ্রেণি ল্যান্ডস্কেপ এবং প্রতিকৃতি উভয়ের জন্য একই নিয়মিত, এই পদ্ধতিটি কখনই বলা হয় না।
জ্যাকি

ডিভাইসটি ফ্ল্যাট ফিরিয়ে দিলে এটি ব্যর্থ হবে। বিকাশকারী.অ্যাপল.
com

57

ক্যামেরাটি ব্যবহার করার সময় ঘূর্ণন শনাক্ত করতে হবে AVFoundationএবং এটি আবিষ্কার করেছে যে didRotate( এখন অবনমিত ) এবং willTransitionপদ্ধতিগুলি আমার প্রয়োজনের জন্য বিশ্বাসযোগ্য নয়। ডেভিড পোস্ট করা বিজ্ঞপ্তিটি ব্যবহার করে কাজ করেছে তবে এটি সুইফট 3.x / 4.x এর জন্য বর্তমান নয়।

সুইফট 4.2 বিজ্ঞপ্তির নাম পরিবর্তন করা হয়েছে।

সমাপনী মানটি সুইফট ৪.০-এর মতোই রয়েছে:

var didRotate: (Notification) -> Void = { notification in
        switch UIDevice.current.orientation {
        case .landscapeLeft, .landscapeRight:
            print("landscape")
        case .portrait, .portraitUpsideDown:
            print("Portrait")
        default:
            print("other")
        }
    }

সুইফট ৪.২-এর জন্য বিজ্ঞপ্তি স্থাপন করতে :

NotificationCenter.default.addObserver(forName: UIDevice.orientationDidChangeNotification,
                                       object: nil,
                                       queue: .main,
                                       using: didRotate)

সুইফট ৪.২-এর বিজ্ঞপ্তি ছিন্ন করতে :

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

অবচয় বিবৃতি সম্পর্কে , আমার প্রাথমিক মন্তব্যটি বিভ্রান্তিকর ছিল, তাই আমি এটি আপডেট করতে চেয়েছিলাম। যেমন উল্লেখ @objcকরা হয়েছে , অনুমানের ব্যবহার অবমূল্যায়ন করা হয়েছে, যার পরিবর্তে একটি ব্যবহারের প্রয়োজন ছিল #selector। পরিবর্তে একটি বন্ধ ব্যবহার করে, এটি এড়ানো যেতে পারে এবং আপনার এখন একটি সমাধান রয়েছে যা একটি অবৈধ নির্বাচনকারীকে কল করার কারণে ক্রাশ এড়ানো উচিত।

এখানে নীচের সমস্ত কিছুই এক্সকোড 10 এবং আইওএস 4.2 হিসাবে অপ্রচলিত

সুইফট ৪.০ সহ সুইফট ৪.০, অ্যাপল আমাদের এটি ব্যবহার এড়াতে উত্সাহিত করেছে #selector, সুতরাং এই পদ্ধতির এখন একটি পরিসমাপ্তি ব্লক ব্যবহার করা হয়েছে। এই পদ্ধতিরটি সুইফট 3.x এর সাথে পিছনের দিকেও সামঞ্জস্যপূর্ণ এবং এটিই এগিয়ে যাওয়ার প্রস্তাবিত পদ্ধতির হবে।

অনুমানের #selectorঅবমূল্যায়নের কারণে আপনি যদি ফাংশনটি ব্যবহার করেন তবে এটি একটি সুইফট 4.x প্রকল্পে আপনি পাবেন সংকলক সতর্কতা @objc:

এখানে চিত্র বর্ণনা লিখুন

এই পরিবর্তনের উপর দ্রুত-বিবর্তনে প্রবেশ করুন

কলব্যাক সেটআপ করুন:

// If you do not use the notification var in your callback, 
// you can safely replace it with _
    var didRotate: (Notification) -> Void = { notification in
        switch UIDevice.current.orientation {
        case .landscapeLeft, .landscapeRight:
            print("landscape")
        case .portrait, .portraitUpsideDown:
            print("Portrait")
        default:
            print("other")
        }
    }

বিজ্ঞপ্তিটি সেটআপ করুন:

NotificationCenter.default.addObserver(forName: .UIDeviceOrientationDidChange,
                                       object: nil,
                                       queue: .main,
                                       using: didRotate)

এটি ধ্বংস:

NotificationCenter.default.removeObserver(self, name: .UIDeviceOrientationDidChange, object: nil)

4
আপনার কাছে যেখানে অ্যাপল সুইফট 4-তে # নির্বাচক ব্যবহারকে নিরুৎসাহিত করার বিষয়ে কথা বলার বিষয়ে উল্লেখ রয়েছে? তারা কেন এটি বলছে তা আমি পড়তে চাই।
jeffjv

@ জেফজেভিভি অবশ্যই, আমার কাছে কোনও অ্যাপল ডকুমেন্টের সাথে সরাসরি লিঙ্ক নেই, তবে আমি পূর্ববর্তী পদ্ধতির ব্যবহার করতে পারলে এক্সকোড সরবরাহকারী সংকলকটির একটি স্ক্রিনশট অন্তর্ভুক্ত করেছি।
কোডবেডার

1
আমি দ্রুত-বিবর্তনে একটি লিঙ্ক যুক্ত করেছি যা পরিবর্তনের বিষয়ে আলোচনা করে।
কোডবেণ্ডার

1
@ কোডবেেন্ডার: সংকলক সতর্কতাটির অর্থ আপনার প্রস্তাবিত মানে নয়। # নির্বাচককে অবমূল্যায়ন করা হচ্ছে না, কেবল "@objc" অনুমিতি। এর অর্থ হ'ল # সিলেক্টর হিসাবে কোনও ফাংশন ব্যবহার করার সময় আপনাকে এটিকে স্পষ্টভাবে চিহ্নিত করতে হবে, যাতে সংকলকটি অতিরিক্ত সঠিক কোড উত্পন্ন করবে কারণ সংকলকটি আর আপনার ব্যবহার থেকে এটি নির্ধারণের চেষ্টা করবে না। অতএব, আপনি যদি আপনার সুইফট 3.0 সমাধানটিতে আপনার ঘোরানো () ফানকে "@obj" যুক্ত করেন, কোডটি সতর্কতা ছাড়াই সংকলন করবে।
মিথিল্যান্ডিয়া

ধন্যবাদ @ মিথিল্যান্ডিয়া, আমি আমার প্রাথমিক বক্তব্যটি নিয়ে বিভ্রান্তি সমাধানের জন্য উত্তরটি আপডেট করেছি।
কোডবেন্ডার

19

এর -orientationসম্পত্তি ব্যবহার করা UIDeviceসঠিক নয় (এমনকি এটি বেশিরভাগ ক্ষেত্রে কাজ করতে পারে) এবং কিছু বাগ তৈরি করতে পারে, উদাহরণস্বরূপ UIDeviceOrientationডিভাইসটির মুখোমুখি বা নীচে থাকলে এটির অবস্থান সম্পর্কেও বিবেচনা করুন, তাদের জন্য UIInterfaceOrientationএনামের মধ্যে সরাসরি জুড়ি নেই is মান।
তদুপরি, আপনি যদি কিছু নির্দিষ্ট অভিযোজনে আপনার অ্যাপ্লিকেশনটিকে লক করেন তবে ইউআইডিভাইস সেটিকে অ্যাকাউন্টে না নিয়েই আপনাকে ডিভাইস ওরিয়েন্টেশন দেবে।
অন্যদিকে iOS8 শ্রেণিতে interfaceOrientationসম্পত্তি হ্রাস করেছে re ইন্টারফেস অরিয়েন্টেশন সনাক্ত করতে 2 টি বিকল্প উপলব্ধ:UIViewController

  • স্ট্যাটাস বারের ওরিয়েন্টেশন ব্যবহার করুন
  • আইফোনটিতে আকারের ক্লাসগুলি ব্যবহার করুন যদি সেগুলি ওভাররাইড না করা হয় তবে তারা আপনাকে বর্তমান ইন্টারফেসের দিকনির্দেশনা বোঝার উপায় দিতে পারে

যা এখনও অনুপস্থিত তা হ'ল ইন্টারফেস অভিমুখীকরণের পরিবর্তনের দিক বোঝার উপায়, যা অ্যানিমেশনগুলির সময় খুব গুরুত্বপূর্ণ।
ডাব্লুডাব্লুডিসি 2014 এর অধিবেশনে "আইওএস 8-তে নিয়ামক অগ্রগতি দেখুন" এর স্পিকার প্রতিস্থাপন পদ্ধতিটি ব্যবহার করে সেই সমস্যারও একটি সমাধান সরবরাহ করে -will/DidRotateToInterfaceOrientation

এখানে প্রস্তাবিত সমাধানটি আংশিকভাবে প্রয়োগ করা হয়েছে, আরও তথ্য এখানে :

func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
        let orientation = orientationFromTransform(coordinator.targetTransform())
        let oldOrientation = UIApplication.sharedApplication().statusBarOrientation
        myWillRotateToInterfaceOrientation(orientation,duration: duration)
        coordinator.animateAlongsideTransition({ (ctx) in
            self.myWillAnimateRotationToInterfaceOrientation(orientation,
            duration:duration)
            }) { (ctx) in
                self.myDidAnimateFromInterfaceOrientation(oldOrientation)
        }
    }

11

আমি জানি এই প্রশ্নটির জন্য Swift, তবে যেহেতু এটি গুগল অনুসন্ধানের জন্য শীর্ষ লিঙ্কগুলির মধ্যে একটি এবং যদি আপনি একই কোডটি সন্ধান করছেন Objective-C:

// add the observer
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(rotated:) name:UIDeviceOrientationDidChangeNotification object:nil];

// remove the observer
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIDeviceOrientationDidChangeNotification object:nil];

// method signature
- (void)rotated:(NSNotification *)notification {
    // do stuff here
}

11

সহজ, এটি আইওএস 8 এবং 9 / সুইফট 2 / এক্সকোড 7 এ কাজ করে, এই কোডটি কেবল আপনার ভিউকন্ট্রোলআর সুইফ্টের মধ্যে রাখুন। এটি প্রতিটি ওরিয়েন্টেশন পরিবর্তনের সাথে স্ক্রিনের মাত্রাগুলি মুদ্রণ করবে, আপনি তার পরিবর্তে আপনার নিজের কোড রাখতে পারেন:

override func didRotateFromInterfaceOrientation(fromInterfaceOrientation: UIInterfaceOrientation) {
        getScreenSize()
    }
    var screenWidth:CGFloat=0
    var screenHeight:CGFloat=0
    func getScreenSize(){
        screenWidth=UIScreen.mainScreen().bounds.width
        screenHeight=UIScreen.mainScreen().bounds.height
        print("SCREEN RESOLUTION: "+screenWidth.description+" x "+screenHeight.description)
    }

5
এই ফাংশনটি অবহেলা করা হয়েছে, "ভিউউইলট্রানিশনটিসাইজ: ট্রান্সিশনকর্ডিনেটর সহ:" ব্যবহার করুন
মাসা এস-আইআইয়া

অবহেলিত হওয়ার পাশাপাশি, didRotateFromInterfaceOrientation()নির্ভরযোগ্যভাবে কাজ করে না। এটি কিছু আবর্তন মিস করে। iewWillTransitionToSize:withTransitionCoordinator:ঠিক আছে কাজ করে।
আন্দ্রেজ

@ আন্ড্রেজ এখন প্রচুর জিনিসগুলি এখন সুইফট 3
জোশ


9

আমি ওরিয়েন্টেশন বিজ্ঞপ্তিটি পরীক্ষা করতে পছন্দ করি কারণ আপনি যে কোনও ক্লাসে এই বৈশিষ্ট্যটি যুক্ত করতে পারেন, ভিউ বা ভিউ কন্ট্রোলার হওয়ার দরকার নেই। এমনকি আপনার অ্যাপের প্রতিনিধিতেও।

সুইফট 5:

    //ask the system to start notifying when interface change
    UIDevice.current.beginGeneratingDeviceOrientationNotifications()
    //add the observer
    NotificationCenter.default.addObserver(
        self,
        selector: #selector(orientationChanged(notification:)),
        name: UIDevice.orientationDidChangeNotification,
        object: nil)

বিজ্ঞপ্তিটি ক্যাশে করার চেয়ে

    @objc func orientationChanged(notification : NSNotification) {
        //your code there
    }

8

উদ্দেশ্য সি

-(void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator

দ্রুত

func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator)

ওরিয়েন্টেশন পরিবর্তন সনাক্ত করতে এই পদ্ধতিটি ওভাররাইড করুন।


8

সুইফট 3 | ইউআইডিভাইস ওরিয়েন্টেশনডিড চেঞ্জ বিজ্ঞপ্তি খুব ঘন ঘন পর্যবেক্ষণ করা হয়

প্রতিকৃতি থেকে ল্যান্ডস্কেপ অভিমুখীকরণের পরিবর্তন নির্বিশেষে আপনার কোডটি 3 ডি স্পেসে ওরিয়েন্টেশন পরিবর্তন করার সময় নিম্নলিখিত কোডটি "ডিভাইসড্রিটেট" মুদ্রণ করে। উদাহরণস্বরূপ, আপনি যদি নিজের ফোনকে প্রতিকৃতি নির্দেশে ধরে রাখেন এবং এটিকে সামনের দিকে এবং পিছনে কাত করে থাকেন - ডিভাইসডিড্রোটেট () বারবার বলা হয়।

override func viewDidLoad() {
    super.viewDidLoad()
    NotificationCenter.default.addObserver(
        self, 
        selector:  #selector(deviceDidRotate), 
        name: .UIDeviceOrientationDidChange, 
        object: nil
    )
}

func deviceDidRotate() {
    print("deviceDidRotate")
}

এটির চারপাশে কাজ করার জন্য আপনি পূর্ববর্তী ডিভাইস ওরিয়েন্টেশন ধরে রাখতে পারেন এবং ডিভাইসডিডোটেট () পরিবর্তন করার জন্য পরীক্ষা করতে পারেন।

var previousDeviceOrientation: UIDeviceOrientation = UIDevice.current.orientation

override func viewDidLoad() {
    super.viewDidLoad()
    NotificationCenter.default.addObserver(
        self, 
        selector:  #selector(deviceDidRotate), 
        name: .UIDeviceOrientationDidChange, 
        object: nil
    )
}

func deviceDidRotate() {
    if UIDevice.current.orientation == previousDeviceOrientation { return }
    previousDeviceOrientation = UIDevice.current.orientation
    print("deviceDidRotate")
}

অথবা আপনি একটি পৃথক বিজ্ঞপ্তি ব্যবহার করতে পারেন যা কেবল তখনই ডাকা হয় যখন ডিভাইসটি ল্যান্ডস্কেপ থেকে প্রতিকৃতিতে পরিবর্তিত হয়। এই ক্ষেত্রে আপনি UIApplicationDidChangeStatusBarOrientationবিজ্ঞপ্তিটি ব্যবহার করতে চান ।

override func viewDidLoad() {
    super.viewDidLoad()
    NotificationCenter.default.addObserver(
        self, 
        selector:  #selector(deviceDidRotate), 
        name: .UIApplicationDidChangeStatusBarOrientation, 
        object: nil
    )
}

func deviceDidRotate() {
    print("deviceDidRotate")
}

6

সুইফট ৩.০ এ ওরিয়েন্টেশন পরিবর্তন কীভাবে সনাক্ত করা যায় তার সম্পূর্ণ কার্যকারিতা বাস্তবায়ন।

আমি ফোন ওরিয়েন্টেশন এই বাস্তবায়ন ব্যবহার করতে face upএবং face downআমার কাছে গুরুত্বপূর্ণ ছিল, এবং আমি শুধুমাত্র একবার আমি জানতাম স্থিতিবিন্যাস নির্দিষ্ট অবস্থানে ছিল পরিবর্তন করতে দৃশ্য চেয়েছিলেন।

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        //1
        NotificationCenter.default.addObserver(self, selector: #selector(deviceOrientationDidChange), name: NSNotification.Name.UIDeviceOrientationDidChange, object: nil)

    }

    deinit {
        //3
        NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIDeviceOrientationDidChange, object: nil)
    }

    func deviceOrientationDidChange() {
        //2
        switch UIDevice.current.orientation {
        case .faceDown:
            print("Face down")
        case .faceUp:
            print("Face up")
        case .unknown:
            print("Unknown")
        case .landscapeLeft:
            print("Landscape left")
        case .landscapeRight:
            print("Landscape right")
        case .portrait:
            print("Portrait")
        case .portraitUpsideDown:
            print("Portrait upside down")
        }
    }

}

গুরুত্বপূর্ণ টুকরোগুলি হ'ল:

  1. আপনি ডিভাইস ওরিয়েন্টেশনডিডচেন্জ বিজ্ঞপ্তি স্ট্রিমটি শোনেন এবং এটি ফাংশন ডিভাইসে ওরিয়েন্টেশনডিডচ্যাঞ্জের সাথে টাই করুন
  2. তারপরে আপনি ডিভাইস ওরিয়েন্টেশনটি স্যুইচ করুন, unknownমাঝে মাঝে একটি ওরিয়েন্টেশন রয়েছে কিনা তা খেয়াল করে নিশ্চিত হন ।
  3. যে কোনও নোটিফিকেশনের মতোই, ভিউকন্ট্রোলারটি ডিজিটালাইজড হওয়ার আগে, নোটিফিকেশন স্ট্রিমটি পর্যবেক্ষণ করা বন্ধ করে দিতে ভুলবেন না।

আশা করি কেউ এটিকে সহায়ক বলে মনে করেছেন।


আপনাকে ধন্যবাদ, দুর্দান্ত
মোহাম্মদ রাজীপৌর

সুতরাং আমি বিভ্রান্ত হয়েছি, বর্তমানে আমার সমস্ত দৃষ্টিভঙ্গি ল্যান্ডস্কেপের প্রতিকৃতির উপর ভিত্তি করে সামঞ্জস্য করছে, তবে ডিভাইসটি মুখোমুখি হলে তা কী পরিবর্তন হয় না? আমি যখন আপনার মুখোমুখি হই তখন একই প্রভাবটি অর্জন করতে আপনার উপরের কোডটি কীভাবে ব্যবহার করব !?
ফ্যামিক টেক

আপনি কি আরও কিছু প্রসঙ্গ দিতে পারেন? আপনি কী প্রভাবটি উল্লেখ করছেন তা আমি নিশ্চিত নই। এই কোডটি কেবল ওরিয়েন্টেশন সনাক্ত করতে কাজ করে। ওরিয়েন্টেশন সনাক্তকরণের জন্য আপনি যদি একাধিক পদ্ধতি ব্যবহার করেন তবে আপনি সমস্যার মধ্যে পড়তে পারেন।
রব নরব্যাক

6
override func didRotate(from fromInterfaceOrientation: UIInterfaceOrientation) {
    //swift 3
    getScreenSize()
}


func getScreenSize(){
   let screenWidth = UIScreen.main.bounds.width
   let  screenHeight = UIScreen.main.bounds.height
    print("SCREEN RESOLUTION: \(screenWidth.description) x \(screenHeight.description)")
}

পরিষ্কার উত্তর। আমার জন্য কাজ করেছেন।
দোরাদ

এটি এখন
আজিজ জাভেদ

5

ঘূর্ণনটি সম্পূর্ণ হওয়ার পরে যদি আপনি কিছু করতে চান তবে আপনি সম্পূর্ণরূপে UIViewControllerTransitionCoordinatorহ্যান্ডলারটি এটির মতো ব্যবহার করতে পারেন

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

    // Hook in to the rotation animation completion handler
    coordinator.animate(alongsideTransition: nil) { (_) in
        // Updates to your UI...
        self.tableView.reloadData()
    }
}

5

আইওএস 8 যেহেতু এটি করার সঠিক উপায় এটি।

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

    coordinator.animate(alongsideTransition: { context in
        // This is called during the animation
    }, completion: { context in
        // This is called after the rotation is finished. Equal to deprecated `didRotate`
    })
}

4

এর সাথে ঘোরানো পরিবর্তন হয়েছে কিনা তা পরীক্ষা করুন: viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator)

সাথে coordinator.animateAlongsideTransition(nil) { (UIViewControllerTransitionCoordinatorContext)রূপান্তরটি শেষ হয়েছে কিনা তা আপনি যাচাই করতে পারেন।

নীচে কোড দেখুন:

override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {

    super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator)

    coordinator.animateAlongsideTransition(nil) { (UIViewControllerTransitionCoordinatorContext) in
        // if you want to execute code after transition finished
        print("Transition finished")
    }

    if size.height < size.width {
        // Landscape
        print("Landscape")
    } else {
        // Portrait
        print("Portrait")
    }

}

4

ডিভাইস অরিয়েন্টেশন সনাক্তকরণের জন্য এখানে একটি সহজ উপায়: ( সুইফট 3 )

override func willRotate(to toInterfaceOrientation: UIInterfaceOrientation, duration: TimeInterval) {
            handleViewRotaion(orientation: toInterfaceOrientation)
        }

    //MARK: - Rotation controls
    func handleViewRotaion(orientation:UIInterfaceOrientation) -> Void {
        switch orientation {
        case .portrait :
            print("portrait view")
            break
        case .portraitUpsideDown :
            print("portraitUpsideDown view")
            break
        case .landscapeLeft :
            print("landscapeLeft view")
            break
        case .landscapeRight :
            print("landscapeRight view")
            break
        case .unknown :
            break
        }
    }

2
willRotateএখন হ্রাস করা হয়েছে, আরও ভাল ব্যবহার viewWillTransition
প্রাক

4

সুইফট 4:

override func viewWillAppear(_ animated: Bool) {
    NotificationCenter.default.addObserver(self, selector: #selector(deviceRotated), name: UIDevice.orientationDidChangeNotification, object: nil)
}

override func viewWillDisappear(_ animated: Bool) {
    NotificationCenter.default.removeObserver(self, name: UIDevice.orientationDidChangeNotification, object: nil)
}

@objc func deviceRotated(){
    if UIDevice.current.orientation.isLandscape {
        //Code here
    } else {
        //Code here
    }
}

বিভিন্ন দর্শনীয় নিয়ামকগুলি জুড়ে সনাক্ত করার প্রয়োজন হলে অনেক উত্তর সাহায্য করতে পারে না। এই এক কৌশল করে।


ভিউ কন্ট্রোলার অদৃশ্য হওয়ার সময় ডিভাইসটি ঘোরানো হয়েছিল কিনা তাও আপনাকে পরীক্ষা করতে হবে (অন্যান্য ভিউ কন্ট্রোলারের ক্ষেত্রে বর্তমানের উপরে খোলা আছে)। আসলে, আপনি এড়িয়ে যেতে পারেন viewWillDisappearযোগ addObserverমধ্যে viewDidLoad। আইওএস স্বয়ংক্রিয়ভাবে কন্ট্রোলার দেখতে সদস্যতা বাতিল করে।
আলেকজান্ডার ভোলকভ

আপনি ভুলে গেছেনUIDevice.current.orientation.isFlat
user924

3

আমার পদ্ধতির উপরে বিপিডিট শোয়ের অনুরূপ , তবে আইওএস 9+ ফোকাসের সাথে। আমি ভিউটি ঘোরার সময় এফএসসিএলেন্ডারের স্কোপ পরিবর্তন করতে চেয়েছিলাম ।

override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
    super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator)

    coordinator.animateAlongsideTransition({ (context) in
        if size.height < size.width {
            self.calendar.setScope(.Week, animated: true)
            self.calendar.appearance.cellShape = .Rectangle
        }
        else {
            self.calendar.appearance.cellShape = .Circle
            self.calendar.setScope(.Month, animated: true)

        }

        }, completion: nil)
}

এটি নীচে কাজ করেছে, তবে আমি এটি সম্পর্কে মেষশাবক অনুভব করেছি :)

coordinator.animateAlongsideTransition({ (context) in
        if size.height < size.width {
            self.calendar.scope = .Week
            self.calendar.appearance.cellShape = .Rectangle
        }
        }) { (context) in
            if size.height > size.width {
                self.calendar.scope = .Month
                self.calendar.appearance.cellShape = .Circle
            }
    }

2

আমি ঠিক যেমন ক্লাসে UIUserInterfaceSizeClassপরিবর্তিত একটি ওরিয়েন্টেশন সনাক্ত করতে ব্যবহার UIViewControllerকরি:

override func willTransition(to newCollection: UITraitCollection, with coordinator: UIViewControllerTransitionCoordinator) {

    let isiPadLandscapePortrait = newCollection.horizontalSizeClass == .regular && newCollection.verticalSizeClass == .regular
    let isiPhonePlustLandscape = newCollection.horizontalSizeClass == .regular && newCollection.verticalSizeClass == .compact
    let isiPhonePortrait = newCollection.horizontalSizeClass == .compact && newCollection.verticalSizeClass == .regular
    let isiPhoneLandscape = newCollection.horizontalSizeClass == .compact && newCollection.verticalSizeClass == .compact

     if isiPhonePortrait {
         // do something...
     }
}

1

সুইফট 3 এর জন্য

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    if UIDevice.current.orientation.isLandscape {
        //Landscape
    }
    else if UIDevice.current.orientation.isFlat {
        //isFlat
    }
    else {
        //Portrait
    }
}

আপনি ভুলে গেছেনUIDevice.current.orientation.isFlat
user924

1

সুইফট 5

ডিভাইস ওরিয়েন্টেশন পরিবর্তনের বিজ্ঞপ্তিগুলি পেতে সেটআপ ক্লাস:

class MyClass {

    ...

    init (...) {

        ...

        super.init(...)

        // subscribe to device orientation change notifications
        UIDevice.current.beginGeneratingDeviceOrientationNotifications()
        NotificationCenter.default.addObserver(self, selector: #selector(orientationChanged), name: UIDevice.orientationDidChangeNotification, object: nil)

        ...

    }

    ...

}

হ্যান্ডলার কোড সেটআপ করুন:

@objc extension MyClass {
    func orientationChanged(_ notification: NSNotification) {
        let device = notification.object as! UIDevice
        let deviceOrientation = device.orientation

        switch deviceOrientation {
        case .landscapeLeft:   //do something for landscape left
        case .landscapeRight:  //do something for landscape right
        case .portrait:        //do something for portrait
        case .portraitUpsideDown: //do something for portrait upside-down 
        case .faceDown:        //do something for face down
        case .faceUp:          //do something for face up
        case .unknown:         //handle unknown
        @unknown default:      //handle unknown default
        }
    }
}

0
- (void)viewDidLoad {
  [super viewDidLoad];
  [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(OrientationDidChange:) name:UIDeviceOrientationDidChangeNotification object:nil];
}

-(void)OrientationDidChange:(NSNotification*)notification {
  UIDeviceOrientation Orientation=[[UIDevice currentDevice]orientation];

  if(Orientation==UIDeviceOrientationLandscapeLeft || Orientation==UIDeviceOrientationLandscapeRight) {
    NSLog(@"Landscape");
  } else if(Orientation==UIDeviceOrientationPortrait) {
    NSLog(@"Potrait Mode");
  }
}

দ্রষ্টব্য: কেবলমাত্র এই কোডটি ইউআইভিউউকন্ট্রোলারটি চিহ্নিত করার জন্য ব্যবহার করুন যা কোন দিকে রয়েছে


আপনার কোড প্রকল্পে কাজ করছে না। আমারও কি আর কিছু করা দরকার?
সৈয়দ আলী সালমান

0
override func viewDidLoad() {
    NotificationCenter.default.addObserver(self, selector: #selector(MyController.rotated), name: UIDevice.orientationDidChangeNotification, object: nil)
//...
}

@objc
private func rotated() {
    if UIDevice.current.orientation.isLandscape {

    } else if UIDevice.current.orientation.isPortrait {

    }

    //or you can check orientation separately UIDevice.current.orientation
    //portrait, portraitUpsideDown, landscapeLeft, landscapeRight... 

}

0

আইওএস 13.1.2 এর সাহায্যে ডিভাইসটি ঘোরানো না হওয়া পর্যন্ত অরিয়েন্টেশন সর্বদা 0 ফিরে আসে যে কোনও ঘূর্ণনের ইভেন্ট হওয়ার আগে আসল ঘূর্ণন পেতে আমাকে ইউআইডিওয়াইস.কন্টেনার.বেগিনগ্রিনেটিং ডিভাইস ওরিয়েন্টেশননোটিকেশনগুলি () কল করতে হবে।

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