2012-05-23 29 views
6

Trong ViewController.m, trên iPad, nếu chúng ta in ra chiều cao khung của view trong một xử lý sự kiện tap:Trên iOS, tại sao chiều cao của khung của khung nhìn vẫn gần như giống nhau sau khi xoay?

NSLog(@"Height of main view is %f", self.view.frame.size.height); 

sau đó trong chế độ chân dung, giá trị là 1004 (20 pixel camera cho dòng trạng thái thiết bị, vì vậy 1024 - 20 = 1004) và nếu thiết bị được xoay sang chế độ ngang, tôi dự kiến ​​là khoảng 768 hoặc 748 nhưng giá trị được in thực tế là 1024. (cập nhật: nếu ứng dụng được khởi động ở chế độ ngang, sau đó không có xoay vòng, nó cũng được in dưới dạng 1024). Tại sao điều đó có thể xảy ra và có quy tắc nào để mong đợi nhận được giá trị 748 hoặc 768 không? (Có nhiều cách để có được điều đó không?)

+0

Chỉ cần chắc chắn, là bạn [ 'autoresizingMask'] (http://developer.apple.com/library/ios/#documentation/uikit/reference/uiview_class/uiview/uiview. Thuộc tính html # // apple_ref/occ/instp/UIView/autoresizingMask) được đặt đúng với cờ 'UIViewAutoresizingFlexibleHeight'? – psycho

+0

Tôi đã sử dụng cửa sổ 'UIWindow * = [[[[UIApplication sharedApplication] delegate] window]; window.autoresizingMask | = UIViewAutoresizingFlexibleHeight; self.view.autoresizingMask | = UIViewAutoresizingFlexibleHeight; 'trong phương thức' viewDidLoad' và được biên dịch và xoay vài lần và chiều cao vẫn xuất hiện là 1024 –

+0

Hmm .. Nếu bạn đính kèm nhãn hoặc thứ gì đó trong tầm nhìn của bạn, ở chính dưới cùng của chế độ xem ở chế độ dọc, nó vẫn có thể xem được ở chế độ ngang không? (Nếu có, không có ý tưởng nào khác: /) – psycho

Trả lời

4

Trong tài liệu của Apple, về khung UIView của:

Cảnh báo: Nếu chuyển đổi sở hữu không phải là bản sắc biến đổi, giá trị bộ khách sạn này là undefined và do đó nên bỏ qua.

Vì vậy, bạn nên sử dụng thuộc tính giới hạn.

+0

vì một khung nhìn có thể được khởi tạo bởi 'initWithFrame', nếu chúng ta bỏ qua thuộc tính' frame', nó có thể là lạ khi được thiết lập với một cái gì đó để bắt đầu với –

+0

Khi một khung nhìn được khởi tạo biến đổi của nó là biến đổi nhận dạng, không có vấn đề ở đây. Bạn đã thử sử dụng giới hạn thay vì khung? – jrturton

+0

có, giới hạn hoạt động ... nếu ứng dụng được khởi động khi thiết bị ở chế độ ngang, thì chế độ xem vẫn được khởi tạo với biến đổi nhận dạng? Bởi vì ngay cả khi không có bất kỳ xoay vòng nữa, chiều cao vẫn là 1024 –

0

Lý do đằng sau điều này là khi bạn xoay thiết bị, khung của khung nhìn sẽ thay đổi để phù hợp với thanh trạng thái, nhưng không thực sự xoay khung của chế độ xem. Thiết bị chỉ hiển thị chế độ xem ở trạng thái được xoay, trong khi chế độ xem thực sự không được xoay. Tôi tin rằng các cuộc phỏng vấn bị ảnh hưởng bởi sự thay đổi này, nhưng quan điểm chung thì không.

+0

và làm cách nào để chúng tôi nhận được giá trị 768 hoặc 748 ...? –

+0

bạn cần phải phát hiện khi trong cảnh xử lý chiều rộng là chiều cao trong trường hợp này – CStreel

+0

vì vậy mã của chúng tôi sẽ được xếp chồng lên nhau với 'if() {} else {}' để xử lý điều này? Nó có thể hoạt động nhưng không có vẻ như mã quá mạnh. –

1

Bạn có thể quản lý định hướng theo chương trình thay thế và ghi đè phương thức willRotateToInterfaceOrientation. Xem đường đi:

#define IPAD_SIZE_PORTRAIT   CGSizeMake(768, 960) 
#define IPAD_SIZE_LANDSCAPE   CGSizeMake(1024, 704) 

-(void)relayoutSubviews:(UIInterfaceOrientation)orientation 
{ 
CGSize scrSize; 

if ((orientation == UIInterfaceOrientationLandscapeLeft) || (orientation == UIInterfaceOrientationLandscapeRight)) 
{ 
    scrSize = IPAD_SIZE_LANDSCAPE; 
} 
else 
{ 
    scrSize = IPAD_SIZE_PORTRAIT; 
} 

self.view.bounds = CGRectMake(0, 0, scrSize.width, scrSize.height); 
self.view.frame = CGRectMake(0, 0, scrSize.width, scrSize.height); 
} 

-(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration 
{ 
[self relayoutSubviews:toInterfaceOrientation]; 
} 
Các vấn đề liên quan