Tôi biết rằng điều này trông giống như một câu hỏi rất lớn nhưng nó không phải như vậy don 'sợ để đọc nó. Chủ yếu là tôi giải thích cách thức hoạt động của các công cụ.UIWindow vấn đề định hướng (hai UIWindows và chế độ phong cảnh)
Tôi có hai UIWindow
giây trong ứng dụng của mình. Người đầu tiên là cửa sổ chính được tạo bởi ứng dụng theo mặc định. Cái thứ hai được gọi là modalWindow
và cũng được tạo trong ứng dụng đại biểu.
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.
self.modalWindow = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.modalWindow.windowLevel = UIWindowLevelStatusBar;
//Other stuff I need
//....
return YES;
}
Hầu hết ứng dụng của tôi chỉ có ở chân dung nhưng có một bộ điều khiển chế độ xem nơi người dùng có thể chuyển sang hướng ngang. Tôi đang nghe thay đổi cảnh quan qua:
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationChanged:) name:UIDeviceOrientationDidChangeNotification object:nil];
Phương pháp này hoạt động tốt và trong phương pháp orientationChanged
Tôi trình bày bộ điều khiển chế độ xem ngang. Tất cả là tốt vào thời điểm này. Nếu tôi quay trở lại chân dung tôi nhận được orientationChanged
bắn một lần nữa tại thời điểm đó tôi loại bỏ bộ điều khiển chế độ xem ngang.
Bây giờ, hãy giải thích cách cửa sổ thứ hai được phát. Khi ở chế độ ngang, có một thao tác (chỉ cần nhấn nút) hiển thị bộ điều khiển chế độ xem mới trên cửa sổ thứ hai (modalWindow
). Ok hãy giải thích điều này.
Các đại biểu ứng dụng có hai phương pháp mà trông giống như vậy:
- (void)presentActivityOnModalWindow:(UIViewController *)viewController
{
self.modalWindow.rootViewController = viewController;
self.modalWindow.hidden = NO;
}
- (void)modalTransitionFinished:(NSNotification *)notif
{
self.modalWindow.hidden = YES;
self.modalWindow.rootViewController = nil;
}
tôi gọi là presentActivityOnModalWindow
qua [[[UIApplication sharedApplication] delegate] performSelector....]
. Tôi biết nó không phải là thực hành tốt nhất nhưng nó hoạt động tốt. Đối với việc sa thải tôi sử dụng NSNotificationCenter
để đăng thông báo về việc sa thải. Bộ điều khiển xem được hiển thị trên modalWindow
chỉ hỗ trợ chế độ dọc. Nó quay trở lại YES
trong shouldAutorotate
và UIInterfaceOrientationMaskPortrait
trong supportedInterfaceOrientations
.
Ok rất nhiều giải thích nhưng bây giờ chúng tôi gặp phải sự cố. Khi tôi xoay để cảnh quan, bật lên các modalWindow, bỏ qua cửa sổ phương thức và xoay trở lại chân dung cửa sổ chính của tôi vẫn còn trong chế độ phong cảnh và tất cả mọi thứ trông thảm khốc.
Tôi đã thử thêm một người quan sát cho cả window
và modalWindow
và khai thác gỗ thay đổi trong frame
và bounds
và đây là kết quả:
Did finish launching:
window frame {{0, 0}, {320, 568}}
window bounds {{0, 0}, {320, 568}}
modalWindow frame {{0, 0}, {320, 568}}
modalWindow bounds {{0, 0}, {320, 568}}
Rotate to landscape:
window frame {{0, 0}, {568, 320}}
Open activity in landscape:
modalWindow frame {{0, 0}, {320, 568}}
modalWindow frame {{0, 0}, {320, 568}}
Dismiss activity:
none
Rotate back to portrait:
none
Vì vậy, có vẻ như tôi window
không lấy lại cho khung bình thường khi chúng tôi nhận quay lại chế độ dọc. Cách sửa lỗi này? Nếu tôi cần cung cấp thêm bất kỳ chi tiết nào, hãy hỏi.