Bagaimana cara mendeteksi perubahan orientasi?

148

Saya menggunakan Swift dan saya ingin dapat memuat UIViewController ketika saya memutar ke lanskap, adakah yang bisa mengarahkan saya ke arah yang benar?

Saya tidak dapat menemukan apa pun secara online dan sedikit bingung dengan dokumentasi.

David
sumber
1
Saya kira API tidak berubah sehingga harus "didRotateToOrientation" dan "willRotateToOrientation", sesuatu seperti itu, lihatlah dokumentasi Apple
David 'mArm' Ansermot
1
Hai @ mArm.ch, terima kasih atas balasan cepatnya! Jadi bagaimana saya menerapkan ini? (Ini adalah aplikasi pertama saya ... Saya sangat baru di iOS) :)
David
Saya mem-posting ulang sebagai jawaban, untuk orang lain. Bisakah Anda menerimanya jika tidak apa-apa untuk Anda?
David 'mArm' Ansermot

Jawaban:

194

Begini cara saya membuatnya bekerja:

Di AppDelegate.swiftdalam didFinishLaunchingWithOptions fungsi saya meletakkan:

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

dan kemudian di dalam kelas AppDelegate saya meletakkan fungsi berikut:

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

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

Semoga ini bisa membantu orang lain!

Terima kasih!

David
sumber
5
Saya mencoba menambahkan addObserver di AppDelegate tetapi terus mendapatkan SIGABRT di CoreFoundation dengan pemilih yang tidak dikenal. Namun, ketika saya memindahkan addObserver ke viewDidLoad di tampilan pertama saya itu berfungsi dengan baik. Sekadar informasi jika ada yang menemukan masalah yang sama.
FractalDoctor
1
Saya baru untuk pengkodean tetapi seharusnya tidak selectormemiliki format string "rotated:"??
Chameleon
4
Saya cukup yakin itu hanya jika Anda menerima argumen (yang rotated()tidak)
David
26
Berhati-hatilah karena UIDeviceOrientationada sesuatu yang berbeda dengan UIInterfaceOrientation.. Ini karena UIDeviceOrientationjuga mendeteksi orientasi menghadap ke bawah dan menghadap ke atas yang berarti bahwa kode Anda dapat melompat antara potret dan lansekap secara acak jika perangkat Anda bersandar pada permukaan yang hampir datar tetapi sedikit tidak rata (yaitu bergoyang di permukaan yang menonjol) kamera 6 / 6s)
liamnichols
4
Metode ini JANGAN BEKERJA jika ponsel menonaktifkan rotasi otomatis.
chengsam
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")
    }
}
Mirosław Święcicki
sumber
71
Ini akan disebut SEBELUM rotasi. Jika Anda perlu misalnya ukuran frame setelah rotasi, solusi ini tidak akan berfungsi.
Suara
tidak berfungsi dalam ekstensi. lanskap atau potret masih mencetak "port Lurus"
TomSawyer
4
Metode ini JANGAN BEKERJA jika ponsel menonaktifkan rotasi otomatis.
chengsam
5
di iPad, karena kelas ukuran adalah reguler yang sama untuk lansekap dan potret, metode ini tidak pernah disebut.
Jacky
Ini juga akan gagal jika perangkat mengembalikan isFlat. developer.apple.com/documentation/uikit/uideviceorientation/…
CodeBender
57

Perlu mendeteksi rotasi saat menggunakan kamera dengan AVFoundation, dan menemukan bahwa didRotate( sekarang sudah usang ) & willTransitionmetode tidak dapat diandalkan untuk kebutuhan saya. Menggunakan notifikasi yang diposting oleh David berhasil, tetapi tidak berlaku untuk Swift 3.x / 4.x.

Swift 4.2 Nama notifikasi telah diubah.

Nilai penutupan tetap sama dengan Swift 4.0:

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

Untuk mengatur notifikasi untuk Swift 4.2 :

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

Untuk meruntuhkan pemberitahuan untuk Swift 4.2 :

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

Mengenai pernyataan penghentian , komentar awal saya menyesatkan, jadi saya ingin memperbarui itu. Sebagaimana dicatat, penggunaan @objcinferensi telah ditinggalkan, yang pada gilirannya diperlukan untuk menggunakan a #selector. Dengan menggunakan penutupan sebagai gantinya, ini dapat dihindari dan Anda sekarang memiliki solusi yang harus menghindari kerusakan karena memanggil pemilih yang tidak valid.

Segala sesuatu di bawah sini sudah usang pada XCode 10 & iOS 4.2

Swift 4.0 Dengan Swift 4.0, Apple telah mendorong kami untuk menghindari penggunaan #selector, jadi pendekatan ini menggunakan blok penyelesaian sekarang. Pendekatan ini juga kompatibel dengan Swift 3.x & akan menjadi pendekatan yang disarankan untuk maju.

Ini adalah peringatan kompiler yang akan Anda terima dalam proyek Swift 4.x jika Anda menggunakan #selectorfungsi karena penghentian @objcinferensi:

masukkan deskripsi gambar di sini

Entri dalam evolusi cepat pada perubahan ini .

Siapkan panggilan balik:

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

Siapkan notifikasi:

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

Runtuhkan:

NotificationCenter.default.removeObserver(self, name: .UIDeviceOrientationDidChange, object: nil)
CodeBender
sumber
4
Apakah Anda memiliki referensi ke tempat Apple berbicara tentang mengecilkan penggunaan #selector di Swift 4? Saya ingin membaca mengapa mereka mengatakan ini.
jeffjv
@jeffjv Tentu saja, saya tidak memiliki tautan langsung ke dokumen Apple, tapi saya memang menyertakan tangkapan layar peringatan kompiler yang disediakan XCode jika Anda menggunakan pendekatan sebelumnya.
CodeBender
1
Saya telah menambahkan tautan ke evolusi cepat yang membahas perubahan.
CodeBender
1
@ KodeBender: Peringatan kompiler tidak berarti apa yang Anda sarankan. #selector tidak disusutkan, hanya inferensi "@objc". Ini berarti bahwa ketika menggunakan fungsi sebagai pemilih # Anda harus menandainya secara eksplisit, sehingga kompiler akan menghasilkan kode tambahan yang benar karena kompiler tidak akan lagi mencoba mengambilnya dari penggunaan Anda. Karenanya, jika Anda menambahkan "@obj" ke fungsi rotate () Anda di solusi Swift 3.0 Anda, kode akan dikompilasi tanpa peringatan.
Mythlandia
Terima kasih @Mythlandia, saya memperbarui jawaban untuk menyelesaikan kebingungan atas pernyataan awal saya.
CodeBender
19

Menggunakan -orientationproperti dari UIDevicetidak benar (bahkan jika itu bisa bekerja di sebagian besar kasus) dan dapat menyebabkan beberapa bug, misalnya UIDeviceOrientationmempertimbangkan juga orientasi perangkat jika menghadap ke atas atau ke bawah, tidak ada pasangan langsung di UIInterfaceOrientationenum untuk mereka. nilai-nilai.
Selain itu, jika Anda mengunci aplikasi Anda dalam beberapa orientasi tertentu, UIDevice akan memberi Anda orientasi perangkat tanpa memperhitungkannya.
Di sisi lain iOS8 telah mencabut interfaceOrientationproperti di UIViewControllerkelas.
Ada 2 opsi yang tersedia untuk mendeteksi orientasi antarmuka:

  • Gunakan orientasi bilah status
  • Gunakan kelas ukuran, pada iPhone jika tidak diganti, mereka dapat memberi Anda cara untuk memahami orientasi antarmuka saat ini

Apa yang masih hilang adalah cara untuk memahami arah perubahan orientasi antarmuka, yang sangat penting selama animasi.
Dalam sesi WWDC 2014 "Lihat kemajuan pengontrol di iOS8" pembicara juga memberikan solusi untuk masalah itu, menggunakan metode yang menggantikan -will/DidRotateToInterfaceOrientation.

Di sini solusi yang diusulkan sebagian dilaksanakan, info lebih lanjut di sini :

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)
        }
    }
Andrea
sumber
11

Saya tahu pertanyaan ini untuk Swift, tetapi karena ini adalah salah satu tautan teratas untuk pencarian Google dan jika Anda mencari kode yang sama di 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
}
mikeho
sumber
11

Mudah, ini berfungsi di iOS8 dan 9 / Swift 2 / Xcode7, cukup masukkan kode ini di dalam viewcontroller.swift Anda. Ini akan mencetak dimensi layar dengan setiap perubahan orientasi, Anda dapat menempatkan kode Anda sendiri sebagai gantinya:

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)
    }
Josh
sumber
5
Fungsi ini tidak digunakan lagi, gunakan "viewWillTransitionToSize: withTransitionCoordinator:" sebagai gantinya
Masa S-AiYa
Selain menjadi usang, didRotateFromInterfaceOrientation()tidak berfungsi dengan baik. Itu melewatkan beberapa rotasi. iewWillTransitionToSize:withTransitionCoordinator:berfungsi ok.
Andrej
@Andrej Banyak hal sekarang sudah usang berkat Swift 3
Josh
9

Saya suka memeriksa pemberitahuan orientasi karena Anda dapat menambahkan fitur ini di kelas mana pun, tidak perlu tampilan atau pengontrol tampilan. Bahkan dalam delegasi aplikasi Anda.

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

dari caching notifikasi

    @objc func orientationChanged(notification : NSNotification) {
        //your code there
    }
Alberto Scampini
sumber
8

Dalam Tujuan C

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

Dengan cepat

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

Ganti metode ini untuk mendeteksi perubahan orientasi.

Mahendra
sumber
8

Swift 3 | UIDeviceOrientationDidChange Notification Diamati Terlalu Sering

Kode berikut mencetak "deviceDidRotate" setiap kali perangkat Anda mengubah orientasi dalam ruang 3D - terlepas dari perubahan dari orientasi potret ke lanskap. Misalnya, jika Anda memegang telepon dalam orientasi potret dan memiringkannya ke depan dan ke belakang - deviceDidRotate () dipanggil berulang kali.

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

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

Untuk mengatasinya, Anda dapat memegang orientasi perangkat sebelumnya dan memeriksa perubahan 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")
}

Atau Anda dapat menggunakan notifikasi berbeda yang hanya dipanggil ketika perangkat berubah dari landscape ke portrait. Dalam hal ini Anda ingin menggunakan UIApplicationDidChangeStatusBarOrientationnotifikasi.

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

func deviceDidRotate() {
    print("deviceDidRotate")
}
Derek Soike
sumber
6

Implementasi kerja penuh bagaimana mendeteksi perubahan orientasi di Swift 3.0.

Saya memilih untuk menggunakan implementasi ini karena orientasi telepon face updan face downpenting bagi saya, dan saya ingin pandangan berubah hanya setelah saya tahu orientasi berada di posisi yang ditentukan.

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

}

Bagian penting yang perlu diperhatikan adalah:

  1. Anda mendengarkan aliran pemberitahuan DeviceOrientationDidChange dan mengikatnya ke fungsi deviceOrientationDidChange
  2. Anda kemudian menghidupkan orientasi perangkat, pastikan untuk memperhatikan bahwa ada unknownorientasi di kali.
  3. Seperti halnya notifikasi apa pun, sebelum viewController dideinisialisasi, pastikan untuk berhenti mengamati aliran notifikasi.

Semoga seseorang menemukan ini bermanfaat.

Rob Norback
sumber
Terima kasih, bagus
Mohammad Razipour
Jadi saya bingung, saat ini semua pandangan saya menyesuaikan berdasarkan potret ke lanskap, tetapi tidak berubah jika perangkat menghadap ke atas? Bagaimana saya menggunakan kode Anda di atas untuk mencapai efek yang sama ketika menghadap ke atas !?
Famic Tech
Bisakah Anda memberi sedikit lebih banyak konteks? Saya tidak yakin apa efek yang Anda maksudkan. Kode ini berfungsi hanya untuk mendeteksi orientasi. Jika Anda menggunakan banyak metode untuk mendeteksi orientasi, Anda mungkin mengalami masalah.
Rob Norback
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)")
}
Jeet Gandhi
sumber
Jawaban terbersih. Bekerja untukku.
Dorad
Ini sekarang sudah tidak digunakan lagi
Aziz Javed
5

Jika Anda ingin melakukan sesuatu SETELAH rotasi selesai, Anda dapat menggunakan UIViewControllerTransitionCoordinatorpenangan selesai seperti ini

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()
    }
}
David Pettigrew
sumber
5

Sejak iOS 8 ini adalah cara yang benar untuk melakukannya.

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`
    })
}
PatrickDotStar
sumber
4

Periksa apakah rotasi telah berubah dengan: viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator)

Dengan coordinator.animateAlongsideTransition(nil) { (UIViewControllerTransitionCoordinatorContext)Anda dapat memeriksa apakah transisi selesai.

Lihat kode di bawah ini:

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

}
SDW
sumber
4

Berikut cara mudah mendeteksi orientasi perangkat: ( Swift 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
        }
    }
Ram Madhavan
sumber
2
willRotatesudah ditinggalkan sekarang, lebih baik digunakan viewWillTransition.
pra
4

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

Banyak jawaban yang tidak membantu ketika perlu mendeteksi berbagai pengontrol tampilan. Yang ini berhasil.

Joel
sumber
Anda juga perlu memeriksa apakah perangkat diputar saat pengontrol tampilan menghilang (jika pengontrol tampilan lain dibuka di atas arus). Bahkan, Anda dapat melewatkan viewWillDisappeardan menambahkan addObserverdi viewDidLoad. iOS berhenti berlangganan controller tampilan secara otomatis.
Alexander Volkov
Anda lupaUIDevice.current.orientation.isFlat
user924
3

Pendekatan saya mirip dengan apa yang ditampilkan bpedit di atas, tetapi dengan fokus iOS 9+. Saya ingin mengubah ruang lingkup FSCalendar ketika tampilan berputar.

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

Ini di bawah ini bekerja, tetapi saya merasa malu tentang hal itu :)

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
            }
    }
Curtis Forrester
sumber
2

Saya gunakan UIUserInterfaceSizeClassuntuk mendeteksi orientasi yang berubah di UIViewControllerkelas begitu saja:

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...
     }
}
pableiros
sumber
1

Untuk Swift 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
    }
}
Mamta
sumber
Anda lupaUIDevice.current.orientation.isFlat
user924
1

Cepat 5

Atur kelas untuk menerima pemberitahuan perubahan orientasi perangkat:

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)

        ...

    }

    ...

}

Kode penangan pengaturan:

@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
        }
    }
}
Jacob Barnard
sumber
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");
  }
}

CATATAN: Cukup gunakan kode ini untuk mengidentifikasi UIViewController di mana orientasi

Mannam Brahmam
sumber
Kode Anda tidak berfungsi dalam proyek. apakah saya perlu melakukan hal lain juga?
Syed Ali Salman
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... 

}
yoAlex5
sumber
0

Dengan iOS 13.1.2, orientasi selalu kembali 0 hingga perangkat diputar. Saya perlu menghubungi UIDevice.current.beginGeneratingDeviceOrientationNotifications () untuk mendapatkan rotasi aktual sebelum terjadi peristiwa rotasi.

Ozgur Sahin
sumber