IPhone / IPad: Làm thế nào để có được chiều rộng màn hình theo lập trình?


83

Xin chào, tôi đang tự hỏi nếu có cách nào để lấy chiều rộng theo chương trình.

Tôi đang tìm một cái gì đó chung chung đủ để chứa iphone 3gs, iphone 4, ipad. Ngoài ra, chiều rộng sẽ thay đổi dựa trên việc thiết bị là dọc hay ngang (đối với ipad).

Có ai biết cái này làm thế nào không?? Tôi đã tìm kiếm một thời gian ... cảm ơn!


Chiều rộng của màn hình, chiều rộng của không gian ứng dụng khả dụng (không có thanh hệ thống) hay chiều rộng của một dạng xem cụ thể mà bạn đang tìm kiếm?
VdesmedT

hrmm tôi không chắc. Tôi đoán tôi chỉ muốn chiều rộng của thiết bị (tức là trong ipad 768 cho chiều rộng dọc và 1024 cho chiều ngang) nhưng self.view.bounds dường như đáp ứng điều này. xem bình luận của tôi bên dưới
foreyez

Xem câu trả lời toàn diện hơn này có tính đến hướng của thiết bị.
Drew Stephens

@DrewStephens Xem câu trả lời của tôi dưới đây có tính đến định hướng chỉ có 3 dòng mã: D.
memmons

Câu trả lời:


204

Hãy xem UIScreen .

ví dụ.

CGFloat width = [UIScreen mainScreen].bounds.size.width;

Hãy xem thuộc tính applicationFrame nếu bạn không muốn bao gồm thanh trạng thái (sẽ không ảnh hưởng đến chiều rộng).

CẬP NHẬT: Hóa ra UIScreen (-bounds hoặc -applicationFrame) không tính đến hướng giao diện hiện tại. Một cách tiếp cận đúng hơn sẽ là hỏi UIView của bạn về giới hạn của nó - giả sử UIView này đã được tự động xoay bởi bộ điều khiển View của nó.

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
{
    CGFloat width = CGRectGetWidth(self.view.bounds);
}

Nếu chế độ xem không được Bộ điều khiển chế độ xem tự động xoay thì bạn sẽ cần kiểm tra hướng giao diện để xác định phần nào của giới hạn chế độ xem đại diện cho 'chiều rộng' và 'chiều cao'. Lưu ý rằng thuộc tính khung sẽ cung cấp cho bạn trực quan của chế độ xem trong không gian tọa độ của UIWindow mà (theo mặc định) sẽ không tính đến hướng giao diện.


3
thực sự, điều này không hoạt động khi ipad được định hướng ngang .. tức là, nếu trình mô phỏng của tôi đang chạy ngang thì nó vẫn trả về 768 (thay vì 1024). bạn có nghĩ rằng tôi nên có một câu lệnh if để kiểm tra định hướng trong trường hợp đó hay có cách nào tốt hơn để lấy chiều rộng không?
foreyez

Chết tiệt - có vẻ như bạn đúng; Tôi đã cập nhật câu trả lời của mình với một số ý tưởng khác.
Alan Rogers

Tôi đã kết thúc bằng cách sử dụng "CGFloat width = CGRectGetWidth (self.view.bounds);" trong phương pháp của tôi (không cần didRotateFromInterfaceOrientation) ... nên ít nhất self.view.bounds có tính đến định hướng. cảm ơn!!
foreyez

5
đối với những người khác có thể đã tình cờ gặp bài đăng cũ hơn này, tôi thấy rằng self.view.bounds chỉ hoàn toàn chính xác bắt đầu trong didRotateFromInterfaceOrientation. Nó cũng sẽ chính xác trong viewDidLoad và viewWillAppear nếu chế độ xem được hiển thị theo hướng mục tiêu ban đầu của nó (như được chỉ định trong IB). Nếu quan điểm được trình bày trong một định hướng khác nhau sau đó nhắm mục tiêu, viewDidLoad (và viewWillAppear) được gọi trước khi didRotateFromInterfaceOrientation và view.bounds sẽ không chính xác
Rimsky

Trong trường hợp của iOS 6, và khi chúng ta sử dụng bộ điều khiển Modal, các didRotateFromInterfaceOrientation sẽ không được gọi là
Krishnan

12
CGRect screen = [[UIScreen mainScreen] bounds];
CGFloat width = CGRectGetWidth(screen);
//Bonus height.
CGFloat height = CGRectGetHeight(screen);

10
không tính đến định hướng
Rimsky

6

Điều này có thể được thực hiện trong 3 dòng mã :

// grab the window frame and adjust it for orientation
UIView *rootView = [[[UIApplication sharedApplication] keyWindow] 
                                   rootViewController].view;
CGRect originalFrame = [[UIScreen mainScreen] bounds];
CGRect adjustedFrame = [rootView convertRect:originalFrame fromView:nil];

3
này gần, nhưng nếu một UIAlertView đang được hiển thị nó sẽ là cửa sổ chính và tài sản rootViewController của nó sẽ là con số không
mờ bezark

@mattbezark Đúng. Tôi coi đó là một trường hợp góc. Có một giải pháp thay thế để có được chế độ xem gốc - không sạch bằng cách này, nhưng tôi sẽ đăng thay thế trong trường hợp có ai quan tâm.
memmons

@memmons một chút muộn để đảng nhưng tôi muốn được quan tâm đến giải pháp thay thế của bạn :)
alexgophermix

0

Kể từ iOS 9.0, không có cách nào để có được định hướng một cách đáng tin cậy. Đây là mã tôi đã sử dụng cho một ứng dụng mà tôi thiết kế chỉ cho chế độ dọc, vì vậy nếu ứng dụng được mở ở chế độ ngang, nó vẫn chính xác:

screenHeight = [[UIScreen mainScreen] bounds].size.height;
screenWidth = [[UIScreen mainScreen] bounds].size.width;
if (screenWidth > screenHeight) {
    float tempHeight = screenWidth;
    screenWidth = screenHeight;
    screenHeight = tempHeight;
}

0

Sử dụng mã này nó sẽ hữu ích

[[UIScreen mainScreen] bounds].size.height
[[UIScreen mainScreen] bounds].size.width

0

sử dụng:

NSLog(@"%f",[[UIScreen mainScreen] bounds].size.width) ;

-2

Đây là một cách Swift để lấy kích thước màn hình, điều này cũng tính đến hướng giao diện hiện tại:

var screenWidth: CGFloat {
    if UIInterfaceOrientationIsPortrait(screenOrientation) {
        return UIScreen.mainScreen().bounds.size.width
    } else {
        return UIScreen.mainScreen().bounds.size.height
    }
}
var screenHeight: CGFloat {
    if UIInterfaceOrientationIsPortrait(screenOrientation) {
        return UIScreen.mainScreen().bounds.size.height
    } else {
        return UIScreen.mainScreen().bounds.size.width
    }
}
var screenOrientation: UIInterfaceOrientation {
    return UIApplication.sharedApplication().statusBarOrientation
}

Chúng được bao gồm như một chức năng tiêu chuẩn trong:

https://github.com/goktugyil/EZSwiftExtensions

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.