Orientation trong iOS

Hôm nay mình tiếp tục trình bày với các bạn những tìm hiểu của mình về orientation trong iOS.
Trước tới giờ mình không phải làm app với landscape bao giờ và thế là mình chẳng phải cần quan tâm tới orientatino của nó nữa. Một hôm đùng một cái khách hàng yêu cầu support landscape cho một màn hình coi video. WTF?? nó là cái gì thế, thế là mình phải lọ mọ đi tìm hiểu xem làm nó thế nào. Bắt đầu thôi :D

Làm thế nào để app có thể support multi-orientation

Có 2 cách để app có thể support chuyện này:

  • Cách 1: Setting trên giao diện project
    alt
    lúc này file Plist sẽ có:
    alt

    • Cách 2: Dùng code. Các bạn vào AppDelegate implement function support Orientation Swift
  func  application(application: UIApplication, supportedInterfaceOrientationsForWindow window: UIWindow?) -> Int {
        return Int(UIInterfaceOrientationMask.All.rawValue)
    }

Objective-C

    - (NSUInteger)application:(UIApplication *)application    supportedInterfaceOrientationsForWindow:(UIWindow *)window {
      return UIInterfaceOrientationMaskAll;
}

Lưu ý: nếu các bạn set ở 2 chỗ thì iOS sẽ ưu tiên hàm ở AppDelegate hơn.

Handle orientation trong ViewController

Nếu các bạn ko muốn màn hình xoay các bạn có thể hiện thực 2 hàm:

  • Hàm 1:

Swift

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

Objective-C

- (BOOL)shouldAutorotate {
    return NO;
}

Sử dụng hàm này để xác định có cho phép view xoay hay không. Mặc định nó là YES(true)
*Hàm 2:
Swift

override func supportedInterfaceOrientations() -> Int {
        return Int(UIInterfaceOrientationMask.Landscape.rawValue)
    }

Objective-C

- (NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskAll;
}

Hàm thứ 2 này sẽ force Viewcontroller đó support những kiểu màn hình nào portraint hay landscape.
Lưu ý:

  • 2 Hàm này các bạn muốn hiện thực hay không thì tuỳ. Nhưng có 1 lưu ý chỗ này: Khi các bạn present một view lên, nếu các bạn ko hiện thực hàm số 2 thì orientation của nó phụ thuộc orientation của thằng present ra nhé.

  • Khi ở landscpae thì ở iOS 8 mặc định statusbar sẽ ẩn đi, do đó nếu ko muốn vậy các bạn các bạn phải handle nó. Về statusBar các bạn có thể tham khảo Link

Để Hanlde việc View xoay các bạn cần hiện thực hàm này:
Swift

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

    coordinator.animateAlongsideTransition({ (UIViewControllerTransitionCoordinatorContext) -> Void in

        let orient = UIApplication.sharedApplication().statusBarOrientation

        switch orient {
        case .Portrait:
            println("Portrait")
            // Do something
        default:
            println("Anything But Portrait")
            // Do something else
        }

        }, completion: { (UIViewControllerTransitionCoordinatorContext) -> Void in
            println("rotation completed")
    })

    super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator)
}

Objective-C

- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
{
    [coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> context)
     {
         UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];
         switch (orientation) {
             case UIInterfaceOrientationPortrait:
                 //do anything
                 break;
            case UIInterfaceOrientationLandscapeLeft:
                 //do anything
                 break;

             default:
                 break;
         }
     } completion:^(id<UIViewControllerTransitionCoordinatorContext> context)
     {

     }];

    [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
}

Support 1 view in landscape trong project portrait:

Quay trở lại vấn đề mình gặp phải ban đầu, app của mình trước giờ chỉ support portrait mà giờ set project support landscape nữa, mà vấn đề như trên mặc định shouldAutoRotate return YES. Chẳng lẽ giờ đi sửa toàn bộ ViewController thêm hàm đó vô và return NO. WTF??? Change nhiều quá. :D
May quá, mình có cái BaseViewController tất cả các viewcontroller khác đều thừa kế từ nó và giờ mình chỉ việc hiện thực 2 hàm phía trên trả về portraint hết và thằng support landscape mình sẽ cho nó xoay :D
Chi tiết các bạn có thể tham kháo: Github

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

Viên Vũ

3 bài viết.
3 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
8 4
Có bao giờ bạn gặp phải trường hợp muốn làm 2 app giống nhau gần như hoàn toàn chỉ khác nhau ở chỗ thay màu sắc thay một số tên hay thay đổi data c...
Viên Vũ viết hơn 3 năm trước
8 4
White
3 1
Nhân một dịp làm với status bar iOS, mình muốn điên lên với nó. Không hiểu cơ chế nó chạy thế nào và hàm nào để set. Và sau khi search tìm hiểu mãi...
Viên Vũ viết hơn 3 năm trước
3 1
Bài viết liên quan
White
11 4
(Link) (Link) (Link) Ở 2 phần tut trước, mình đã hướng dẫn khá chi tiết cách viết một ứng dụng camera có tích hợp chức năng nhận diện khuôn mặ...
HoangPH viết hơn 3 năm trước
11 4
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
3 bài viết.
3 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!