2010-04-19 30 views
27

Tôi muốn tạo chế độ xem (UIControl) chặn tất cả đầu vào và hiển thị UIActivityIndicatorView trong khi xác thực người dùng.Thêm UIView trên tất cả các chế độ xem khác, bao gồm StatusBar

UIActionSheet và UIAlertView đều quản lý để thêm chế độ xem nửa trong suốt màu đen trên đầu của tất cả các chế độ xem khác để chặn đầu vào và tôi muốn thực hiện tương tự.

Tôi đã thử thêm chế độ xem vào UIWindow trên cùng trong mảng [[UIApplication sharedApplication]], và trong khi điều này đặt nó trên UIKeyboard nếu nó hiển thị, nó không đặt nó trên StatusBar (mà có ý nghĩa).

Nỗ lực tiếp theo của tôi là mở rộng UIAlertView, xóa tất cả các bản xem con của nó và đặt layer.contents = nil, sau đó thêm ActivityIndicator làm chế độ xem phụ. Điều này làm việc tốt, nhưng tôi dường như không thể giết được sự chuyển đổi bouncy mặc định của UIAlertView khi bạn gọi nó là "show".

Có ai có bất kỳ gợi ý nào về cách tốt nhất để giải quyết vấn đề này cho tôi toàn quyền kiểm soát không? Ồ, tôi biết rằng đầu vào chặn không tuyệt vời nhưng tôi đảm bảo rằng nó không hoạt động trong một khoảng thời gian ngắn và nó có lợi cho người dùng biết rằng hành động của họ phải hoàn tất để xử lý, đang xử lý .

+2

Tại sao "che" thanh trạng thái? Tại sao không che giấu nó, nó có mờ hay chỉ bỏ qua nó hoàn toàn? Thanh trạng thái không phản ứng với các lần chạm, nếu tôi nhớ chính xác. –

+5

Tôi muốn nó trông giống như trong chế độ xem lớp phủ. Điều này làm cho nó rõ ràng cho người dùng rằng họ không thể tương tác hiện tại. Làm cho nó mờ không đạt được điều này không may, và ẩn nó sẽ trông lạ nếu chỉ trong thời gian xác thực. Và nó thực sự phản ứng với các lần chạm. Mặc định là cuộn UIScrollView đang hoạt động lên trên cùng. –

Trả lời

51

tôi đã thực hiện một số đào hơn xung quanh API và tin rằng tôi đã làm việc đó.

Để hiển thị chế độ xem trên toàn bộ màn hình, bạn cần tạo UIWindow của riêng mình và đặt thuộc tính Cửa sổLevel là UIWindowLevelStatusBar. Sau đó, bạn có thể thêm các bản xem phụ tùy chỉnh của mình vào cửa sổ này.

Lưu ý rằng Apple không khuyến khích, nhưng chúng cũng không cấm tạo nhiều cửa sổ.

UIWindow *statusWindow = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
statusWindow.windowLevel = UIWindowLevelStatusBar; 
statusWindow.hidden = NO; 
statusWindow.backgroundColor = [UIColor colorWithWhite:0.0 alpha:0.7]; 
[statusWindow makeKeyAndVisible]; 

Khi bạn muốn xóa cửa sổ khỏi màn hình có vẻ như bạn nhả cửa sổ ra khỏi bộ nhớ.

[statusWindow release]; 

Điều này không cảm thấy an toàn, nhưng tôi không nhận được bất kỳ lỗi nào và dường như thả nó ra khỏi mảng cửa sổ của UIApplication. Xin vui lòng cho tôi biết nếu điều này là sai.

Cập nhật:

Một vấn đề khác mà tôi đi qua là UIStatusBar không dùng sự kiện chạm đến di chuyển UIScrollView tích cực vào đầu sau khi tôi đã hiển thị và loại bỏ cửa sổ lớp phủ này. Giải pháp là đặt cửa sổ chính trở lại cửa sổ chính khi lớp phủ đã được phát hành.

[primaryWindow makeKeyWindow]; 
+2

Mã này không hoạt động đối với tôi trong iOS 4.2. Cửa sổ trạng thái sẽ xuất hiện, nhưng không xuất hiện trên thanh trạng thái mặc định do hệ điều hành cung cấp. Có lời khuyên nào không? Điều này vẫn làm việc cho bạn như của iOS 4.2? – jbrennan

+0

Nó hoạt động, nhưng khi tôi trình bày một viewController hoạt hình, cửa sổ này của tôi, trong đó có một chỉ số hoạt động đi sau viewController trình bày, bất kỳ giải pháp cho vấn đề này? –

+1

điều này không thành công khi cố gắng xoay giao diện sang hướng ngang.trạng tháiWindow chỉ dính vào vị trí thanh trạng thái gốc. –

1

tôi sắp làm điều tương tự trong thời gian ngắn và tìm thấy những điều sau

http://www.dejal.com/developer/dsactivityview

Hình như nó có mọi thứ bạn đang tìm kiếm

+0

Cảm ơn bạn đã liên kết nhưng điều này không bao gồm thanh trạng thái từ những gì tôi có thể thấy. Tôi đang ở chế độ xem nửa trong suốt sẽ bao phủ toàn bộ khu vực giao diện người dùng. –

5

Tôi cần hiển thị chế độ xem ở đầu tất cả các chế độ xem khác trong cửa sổ chính của mình. Ban đầu, tôi nghĩ đến việc trình bày một cửa sổ khác trên cửa sổ chính của tôi. Kể từ khi, táo không khuyến khích sử dụng nhiều cửa sổ, tôi quyết định chống lại nó.

Các mã sau đây đã làm các trick cho tôi:

tôi thêm quan điểm của tôi như một cái nhìn tiểu cửa sổ chính của tôi có thể tự động trình bày quan điểm của tôi trên đầu trang của tất cả các quan điểm khác. Trong trường hợp của tôi, mã này nằm trong ủy quyền của ứng dụng

[self.window addSubview:topViewController.view] 

Và khi tôi thực hiện với chế độ xem, đoạn mã sau sẽ xóa nó khỏi cửa sổ.

[topViewController.view removeFromSuperview]; 
+2

điều này sẽ không bao gồm thanh trạng thái – OpenThread

+0

Bằng cách nào đó trong ứng dụng phong cảnh này cho biết thêm xem trong bức chân dung và điều này trông rất ngớ ngẩn. – Dvole

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