2009-12-09 47 views
9

Tôi có UIView và chế độ xem UIController. Chế độ xem chuẩn của tôi là 320x460. Trong applicationDidFinishLaunching tôi làm:iPhone UIViewController nằm trong thanh trạng thái

[window addSubview:[controller view]]; 

Điều kỳ lạ là các UIView đi dưới thanh trạng thái (như có thiếu ổ cắm). Tuy nhiên, nếu tôi xoay iPhone sang một bên và sau đó quay lại, nó sẽ hiển thị ok.

Đây có phải là hành vi mong đợi (Tôi đặt cược tôi có thể khắc phục sự cố bằng cách đặt bù đắp) hoặc tôi có đang làm sai không?

+0

thử thành phần giao diện mô phỏng? –

+0

Tôi đã bật thanh trạng thái mô phỏng trên cửa sổ, bộ điều khiển và chế độ xem - không may mắn ... Bố cục bị hỏng khi ứng dụng khởi chạy trong iPhone hoặc trình mô phỏng trong XCode. Tuy nhiên, nó hoạt động tốt trong Simulator từ InterfaceBuilder – Mantas

Trả lời

8

Tôi nghĩ vấn đề của bạn là khi bạn thêm một cái nhìn đến một cửa sổ, bạn cần phải nhận thức được tình trạng của thanh trạng thái và bù đắp cho nó:

if showing the status bar : 
    [controller view].frame = CGRectMake(0, **20**, 320, 460); 
else 
    [controller view].frame = CGRectMake(0, 0, 320, **480**); 

đây là lý do tại sao IB cho bạn thấy một thanh trạng thái giả.

+0

Cảm ơn. Tôi đã sử dụng nó để khắc phục vấn đề. Tôi không chắc đó có phải là cách thông thường để sửa chữa nó hay không. – Mantas

+0

Sửa lỗi lớn, nhưng lưu ý phụ, ** 20 ** phải là tham số thứ hai đối với CGRectMake, chứ không phải là tham số đầu tiên :). – makdad

0

Bạn có tự đặt thuộc tính ẩn thanh ứng dụng SAU KHI thêm chế độ xem phụ không? Tôi không tưởng tượng đây là trường hợp, nhưng nếu nó được thiết lập để không khi bạn lần đầu tiên tải xem nó sẽ bố trí như thể không có một, và nếu bạn sau đó thiết lập thanh trạng thái để không ẩn nó sẽ bật lên trên đầu trang của chế độ xem của bạn.

Một giải pháp có thể là sử dụng [[controller view] setNeedsLayout]; sau khi thêm chế độ xem phụ hoặc có thể là [window layoutSubviews];. Tôi chưa bao giờ có nhiều thành công khi sử dụng chúng để khắc phục các vấn đề về bố cục, nhưng vì nó hoạt động sau một vòng quay, nó đáng để quay.

+0

Tôi không đặt thanh ứng dụng ẩn tại bất kỳ điểm nào. Những thứ sắp xếp lại này không giúp được ... – Mantas

18

Tôi gặp sự cố này khi hiển thị UIViewController qua hiện tạiModalViewController.

Bạn có thể khắc phục nó bằng cách thủ công thay đổi kích thước của bộ điều khiển xem sau quan điểm đã xuất hiện:

- (void) viewDidAppear: (BOOL) animated { 
    //manually adjust the frame of the main view to prevent it from appearing under the status bar. 
    UIApplication *app = [UIApplication sharedApplication]; 
    if(!app.statusBarHidden) { 
     [self.view setFrame:CGRectMake(0.0,app.statusBarFrame.size.height, self.view.bounds.size.width, self.view.bounds.size.height - app.statusBarFrame.size.height)]; 
    } 
} 
+4

Followup: giải pháp tốt nhất mà tôi đã thấy là mở file nib cho viewcontroller của bạn, chọn chế độ xem chính, và trong phần "Simulated User Interface Elements" đặt tùy chọn "Status Bar" cho bất cứ thứ gì ngoài "Unspecified". Tôi không thể giải thích những giá trị nội bộ nào đang được thay đổi, điều này đã giải quyết được vấn đề cho ứng dụng của tôi. Nếu bạn làm điều này, bạn sẽ không cần mã trong câu trả lời trước của tôi. –

+0

app.statusBarFrame.size.height trả về 0. :( – Gik

+0

Correction (trên nhận xét của tôi): [[UIApplication sharedApplication] statusBarFrame] .size.height trả về 0 nếu nó được thực thi trước một cái gì đó như: [[UIApplication sharedApplication] setStatusBarHidden: NO withAnimation: NO], nhưng sau đó, nó trả về 20. statusbarHeight = [[UIApplication sharedApplication] statusBarFrame] .size.height; // statusbarHeight == 20 – Gik

1

Nếu bạn đang sử dụng "tài Simulated Interface Elements" Interface Builder, sau đó bạn cũng cần phải đảm bảo rằng bạn đã đặt cờ cho "Thay đổi kích thước chế độ xem từ NIB" trong ngòi MainWindow của bạn.

3

Cuối cùng, tôi đã nhận được giải pháp này. Hoạt động tốt cho cả iPhone & iPad:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 

    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease]; 

    // Allocate view controller and load nib file 
    if (isIPhone) { 
     self.mainViewController = [[[tfdMainViewController_iPhone alloc] initWithNibName:@"tfdMainViewController_iPhone" bundle:nil] autorelease]; 
    } else { 
     self.mainViewController = [[[tfdMainViewController_iPad alloc] initWithNibName:@"tfdMainViewController_iPad" bundle:nil] autorelease]; 
    } 

    // Offset correction (iPhone bug?) 
    CGRect r = self.mainViewController.view.frame; 
    r = CGRectOffset(r, 0, [UIApplication sharedApplication].statusBarFrame.size.height); 
    [self.mainViewController.view setFrame:r]; 

    [window addSubview: self.mainViewController.view]; 
    [self.window makeKeyAndVisible]; 
    return YES; 
} 

T.B. Đối với một số lý do xem có chiều cao chính xác: 480 (chiều cao màn hình ở chế độ Chân dung iPhone) - 20 (thanh trạng thái) = 460, nhưng không đặt được độ lệch dọc. Đó là hành vi khá lạ, trông giống như lỗi.

3

Bản sửa lỗi cho cửa sổ không hoạt động đối với tôi khi tôi có chế độ xem phương thức. Chế độ xem phương thức UIModalPresentationCurrentContext. OK, đây là những gì làm việc cho tôi. Tôi đã tìm kiếm trên web lên xuống trước khi làm việc này. Tôi không thể di chuyển khung nhìn.trình gốc từ cha mẹ. Tuy nhiên trong viewWillAppear Tôi có thể di chuyển nó xuống:

- (void)viewWillAppear:(BOOL)animated 
{ 
    // Move down to compensate for statusbar 
    CGRect frame = parentView.navCon.view.frame; 
    frame.origin.y = [UIApplication sharedApplication].statusBarFrame.size.height; 
    parentView.navCon.view.frame = frame; 
} 
+1

Đó là "gian lận"! ;-) Bạn nên "tìm" chiều cao của statusBar và không phải "hardcode" nó đến 20. Nếu Apple quyết định thay đổi nó thành 25? Sau đó, bạn sẽ được giảm 5px! – Gik

+1

OK, đã cập nhật câu trả lời của tôi. –

5

tôi thêm vấn đề này ngày hôm nay. Hóa ra là tôi đã chọn "Wants Full Screen" trong thanh tra Attribute của ViewController.

Tắt "Wants Full Screen" đã giải quyết được sự cố.

0

Ngay cả tôi cũng thế có cùng một vấn đề. Khi chúng tôi đang sử dụng một số mã hóa cho định hướng thiết bị, chúng tôi đã viết một số mã hóa trong ứng dụng đại biểu hoặc trong bộ điều khiển xem của chúng tôi. Ở đó chúng ta cần phải thay đổi điều kiện để sử dụng phương hướng trả về YES hoặc NO. Điều đó đã giải quyết được vấn đề của chúng tôi.

0

Tôi thích sử dụng UINavigationController để bọc UIViewController bạn, sau đó, đặt NavigationBarHidden thành UINavigationController. Đó là giải pháp hoàn hảo khiến UINavigationController xử lý chiều cao của thanh trạng thái trong iOS 7.

Đây là mã của tôi và ảnh chụp màn hình của tôi.

UINavigationController *wrapNavController = [[UINavigationController alloc] initWithRootViewController:yourViewController] ; 

[wrapNavController setNavigationBarHidden:YES] ; 
0

Các Xcode 6, iOS7/8 giải pháp là để bỏ chọn "Dưới Lên trên Bars" dấu kiểm trong "Mở rộng Edges" của phần View Controller của Attributes Inspector.

0

Đối Xamarin.iOS nó sẽ là:

if (UIApplication.SharedApplication.StatusBarHidden == false) 
{ 
    var statusBarHeight = UIApplication.SharedApplication.StatusBarFrame.Height; 
    View.Frame = new CoreGraphics.CGRect(0, statusBarHeight, View.Frame.Width, View.Frame.Height - statusBarHeight); 
} 
Các vấn đề liên quan