2010-10-16 29 views
14

Tôi đang tạo một ứng dụng dành cho iPhone với một số yếu tố bên trong bộ điều khiển (ví dụ: thanh tab, uiview, uitoolbar, v.v.). Tất cả mọi thứ hoạt động tốt cho đến khi tôi gặp phải vấn đề này. Trong khi ứng dụng của tôi được khởi động, tôi nhận được một cuộc gọi và nó cho thấy "Call Status Bar" đã hủy hoại ui. Một số yếu tố được đẩy xuống vì "Thanh trạng thái cuộc gọi" đang chiếm không gian ở trên cùng.Iphone- Cách thay đổi kích thước chế độ xem khi thanh trạng thái cuộc gọi được bật?

Bất kỳ ai ở đây đều có ý tưởng về cách khắc phục vấn đề này? Tôi mới phát triển ứng dụng iPhone.

trả lời của bạn được đánh giá cao ...

Best Regards,

Trả lời

12

Bạn nên đặt chức năng này trên appdelegate, điều này sẽ kích hoạt khi thanh trạng thái thay đổi

- (void)application:(UIApplication *)application didChangeStatusBarFrame (CGRect)oldStatusBarFrame 
{ 
    NSMutableDictionary *dict = [[NSMutableDictionary alloc] init]; 
    [dict setObject:@"trigger" forKey:@"frame"]; 

    [[NSNotificationCenter defaultCenter] postNotificationName:@"trigger" object:self userInfo:dict]; 
} 

Mã này sẽ gửi thông báo với cái tên "cò"

Đặt một mã để điều khiển xem của bạn (ví dụ: viewDidLoad, vv ..) này nghe nếu có thông báo gửi với một tên "cò"

[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(dataReceived:) 
              name:@"trigger" 
              object:nil]; 

Và tạo một hàm dataReceived:

- (void)dataReceivedNotification:(NSNotification *)notification { 
    NSDictionary *data = [notification userInfo]; 
    // do something with data 
} 

làm điều gì đó về phần này của mã này, có thể bạn thay đổi khung của thanh tab của bạn, khung UIView, khung thanh công cụ

Và trong dealloc, đặt mã này để loại bỏ các quan sát viên

- (void)dealloc { 
    [[NSNotificationCenter defaultCenter] removeObserver:self]; 
    [super dealloc]; 
} 
+0

Điều này phù hợp với tôi ... Cảm ơn –

+0

Xem @ process255 để có câu trả lời đúng hơn. Cũng sử dụng các chuỗi ký tự trống để đăng/đăng ký thông báo là thực hành không tốt (dễ bị lỗi và lỗi chính tả, bạn nên xác định trước tên thông báo 'NSString * const'). –

+0

@dianz bạn đã chuyển đổi khóa và giá trị trong dict. "kích hoạt" nên là chìa khóa. – Kof

3

Về cơ bản những gì bạn thường làm là cố gắng thiết lập các cờ autoresize của tất cả các yếu tố ui bạn trong xây dựng giao diện để khi giao diện chính bị "đè bẹp" bởi thanh trạng thái cuộc gọi mọi thứ vẫn trông hợp lý. Có một chút khó khăn để giải thích cách thực hiện tất cả điều này trong một tin nhắn, nhưng tôi khuyên bạn nên tạo một khung nhìn trong IB, đặt một số phần phụ trong đó, sau đó thay đổi kích cỡ khung nhìn chính trong khi chơi cờ tự động để có cảm nhận về cách cờ công việc. Các cờ tự động là trong Command-3 (kích thước thanh tra).

Bạn cũng có thể đặt wantsFullScreenLayout trong bộ điều khiển chế độ xem chính thành CÓ để làm cho chế độ xem chiếm toàn bộ màn hình, bao gồm khu vực bên dưới thanh trạng thái, nhưng sau đó bạn sẽ phải đảm bảo không đặt bất kỳ thứ gì bên dưới thanh trạng thái và thanh trạng thái cuộc gọi sẽ chồng chéo bất cứ thứ gì quá gần với nó, tất nhiên.

+0

Còn về môi trường ràng buộc iOS7/AutoLayout thì sao? –

21

Solizio của dianz hoạt động tốt nhưng hơi dư thừa nếu bạn chỉ quan tâm đến việc biết thông báo bên trong của một bộ điều khiển xem cụ thể.

Sau phương thức ủy quyền application:didChangeStatusBarFrame: được gọi trong Ứng dụng đại biểu UIApplicationDidChangeStatusBarFrameNotification được đăng qua [NSNotificationCenter defaultCenter].

Thay vì sử dụng phương thức ủy nhiệm application:didChangeStatusBarFrame: để chỉ cần gửi lại thông báo tùy chỉnh, bạn có thể thêm người quan sát vào UIApplicationDidChangeStatusBarFrameNotification trực tiếp từ bộ điều khiển chế độ xem của bạn.

Trong MyCustomViewController bạn sẽ thêm một cái gì đó tương tự như sau:

[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(doSomething:) 
              UIApplicationDidChangeStatusBarFrameNotification 
              object:nil]; 

Bây giờ bạn không còn cần phải xác định phương pháp application:didChangeStatusBarFrame: đại biểu trong appdelegate (trừ khi bạn có kế hoạch để làm điều gì đó trong appdelegate khi thanh trạng thái thay đổi kích thước).

Như với ví dụ dianz của bạn cần phải loại bỏ các quan sát viên trong dealloc

- (void)dealloc { 
    [[NSNotificationCenter defaultCenter] removeObserver:self]; 
    [super dealloc]; 
} 
+5

Câu trả lời tuyệt vời, ngoại trừ bạn vô tình (dựa trên câu hỏi ban đầu, anyway) được sử dụng 'UIApplicationWillChangeStatusBarOrientationNotification' thay vì' UIApplicationWillChangeStatusBarFrameNotification'. Nếu bạn đang cố gắng tìm ra khi thanh trạng thái màu xanh lá cây trong cuộc gọi xuất hiện hoặc biến mất, bạn muốn sau: 'UIApplicationWillChangeStatusBarFrameNotification'. –

+0

Rất đúng, cảm ơn bạn đã cập nhật! –

1

đối với tôi, bất cứ khi nào trên thanh trạng thái được mở rộng, các - (void) viewWillLayoutSubviews luôn gọi. Điều này là hoàn hảo cho tôi bởi vì tất cả các mã subframe setFrame của tôi là trong chức năng này.

Các vấn đề liên quan