2014-09-21 15 views
13

Tôi đang gặp sự cố kỳ lạ ở đây với iOS8. Tôi đã googling và bashing đầu của tôi chống lại một bức tường cho một vài ngày không có may mắn. Tôi không chắc chắn làm thế nào để thậm chí giải thích nó, nhưng ở đây đi ...Vị trí cảm ứng iOS8 bị giới hạn ở chế độ ngang, như thể cửa sổ là Chân dung ở một bên?

Ứng dụng đã chạy tốt dưới iOS7, nhưng bây giờ biên dịch bằng cách sử dụng xCode 6/iOS8 Tôi đang gặp một vài vấn đề định hướng lạ. Tôi không sử dụng một tập tin xib, nhưng thay vì tạo một cửa sổ và xem theo chương trình. Tôi đang chạy OpenGL trong chế độ xem và sau đó xử lý mọi thứ khác bên trong OpenGL. Vì vậy, tôi đang thu thập chạm và chuyển chúng đến các thói quen GL của tôi. Tất cả đã được tốt mãi mãi, đến bây giờ. Bây giờ với iOS8 nó có vẻ như là "cửa sổ cảm ứng" đang xoay chính nó để chạm vào Cảnh được giới hạn ở một bên của màn hình, như thể cửa sổ hiển thị là Cảnh, nhưng các điểm chạm là tất cả trong một cửa sổ Chân dung được đặt ở một bên của màn hình.

Điều gì có vẻ lạ lùng là các lần chạm đến màn hình trên toàn màn hình như bình thường, nhưng giá trị Y dừng lại ở 320 và không đi xa hơn nữa. Các X hoạt động bình thường. Nếu tôi chuyển thiết bị sang chế độ Chân dung (bộ điều khiển chế độ xem không tự động xoay), tất cả sẽ hoạt động, nhưng trong Chế độ ngang, thiết bị sẽ chuyển sang hành vi lạ này.

Tôi đã thử tất cả những gì tôi có thể nghĩ ra mà không có bất kỳ thay đổi nào và tôi không chắc chắn nên bắt đầu giải thích tại sao điều này có thể xảy ra. Mọi lời khuyên sẽ được đánh giá cao.

+0

Bạn có dựa vào '[màn hình chính UIScreen] .bounds' ở bất kỳ đâu không? Hành vi của nó thay đổi trong iOS8, trước đây '[UIScreen mainScreen] .bounds' không bao giờ 'xoay' ở chỗ nó sẽ luôn báo cáo cùng kích thước, bây giờ kích thước đó 'quay' và bạn nên truy vấn' [UIScreen mainScreen] .nativeBounds' nếu bạn muốn một kích thước nhất quán không 'xoay'. – Shizam

+0

Chúng tôi không dựa vào giới hạn ở bất cứ đâu mà tôi có thể thấy, và chắc chắn không có nơi nào gây ra điều này. Cho đến nay giải pháp duy nhất tôi đã tìm thấy rằng sửa chữa tất cả các vấn đề là quay lại sử dụng XCode 5! Mà không thực sự là một giải pháp ở tất cả! – Rob

Trả lời

0

tôi đoán là rằng bất cứ quan điểm sở hữu nhận dạng cử chỉ là không nhận được thay đổi kích cỡ trong xoay cho một (hoặc nhiều hơn) trong những lý do sau đây:

  • Nó sử dụng bố trí tự động và không được gắn với nó superView
  • Nó sử dụng lò xo và thanh chống và không có UIViewAutoresizing đúng mặt nạ
  • Nó sống trong một subview mà không bị thay đổi kích cỡ

Nếu bạn đang sử dụng auto lay ra, hãy thử điều này trong bộ điều khiển chế độ xem của bạn:

- (void)viewDidLayoutSubviews 
{ 
    // For each subview with its own auto layout: 
    [self.mySubview layoutSubviews]; 

    // ... 

    [super viewDidLayoutSubviews]; 
} 
0

Ok, tôi đã tìm thấy vấn đề về phía tôi (Tôi là người tặng tiền thưởng).

Có thể chúng tôi đang sử dụng một số loại hack trong ứng dụng của chúng tôi để xử lý xoay vòng chế độ xem theo cách thủ công, vì chúng tôi đã trả về 0 đến - (NSUInteger)supportedInterfaceOrientations trong số rootViewController của chúng tôi.

- (NSUInteger)supportedInterfaceOrientations { 
    return 0; // BOOOOOOO, even forbidden by documentation 
} 

Sau đó, chúng tôi quản lý thủ công chế độ xem nội bộ của mình bằng cách nghe thông báo UIDeviceRotationChanged, xoay lượt xem và yêu cầu statusBar xoay vòng.

Trả lại thứ gì đó không 0 đến số supportedInterfaceOrientations này làm cho lớp "chạm" xoay cùng với phần còn lại.
Nhưng bây giờ chúng ta phải làm cho mã phát triển để sử dụng xoay vòng iOS thay vì lớp hacky của chúng tôi.

Ngoài ra, sau khi điều tra thêm, đặc biệt là trên iPad, bạn để sử dụng UIWindow dựa trên Storyboard. Sử dụng cửa sổ dựa trên XIB sẽ dẫn đến kích thước của nó sai khi ứng dụng được khởi chạy trong khi ở chế độ ngang. Điều này dẫn đến một ngọn núi buggy khung và messes lên nặng với bố trí của chúng tôi.

1

Trong trường hợp của chúng tôi.
Buộc quay với chuyển đổi của chế độ xem gây ra sự cố đó.
Chúng tôi đã xóa mã đó, xoay với

+ (void)attemptRotationToDeviceOrientation 

và giải quyết sự cố.

Chúng tôi đã gọi phương thức đó theo phương pháp forceRotate của chúng tôi.

-(void)forceRotateLandscape { 
    ... 
    UIViewController *vc = [UIViewController new]; 
    [topVc presentViewController:vc animated:NO completion:nil]; 
    [topVc dismissViewControllerAnimated:NO completion:nil]; 

    supportedOrientations = UIInterfaceOrientationMaskLandscapeRight; 
    [UIViewController attemptRotationToDeviceOrientation]; 
    ... 
} 
+0

Đây là một trong những điều chúng tôi đã thử đầu, nhưng không thực sự tạo ra bất kỳ sự khác biệt nào. Bạn đang gọi cái này ở đâu? – Rob

2

Trên iOS8, màn hình UIS bây giờ là giao diện được định hướng. Trong một số thư viện (hoặc tôi nên nói tất cả) trước iOS8, một số kiểm tra đã được thực hiện để điều chỉnh độ thiếu và chiều rộng và chiều cao trao đổi khi ứng dụng ở chế độ ngang.

Bạn nên xem xét một số mã giúp xoay vòng và xóa mã đó.

-[UIScreen bounds],
-[UIScreen applicationFrame],
Status khung thanh và
Keyboard khung hiện nay giao diện theo định hướng.
(xem video WWDC2014 - view controller advancements in iOS8 @ 50:41)

0

Tôi cũng gặp vấn đề tương tự. Trong iOS7 tất cả đã làm việc tốt, trong iOS8 nó giống như "touch-view" vẫn còn trong bức chân dung.

Tôi vừa thay thế chính xib bằng bảng phân cảnh, không có thay đổi nào khác (tôi đã thử chơi rất nhiều với màn hình bị ràng buộc và khung mà không có bất kỳ kết quả nào).

Hãy dùng thử, cho tôi biết nếu nó cũng phù hợp với bạn. Chúc may mắn.

0

Tôi gặp vấn đề tương tự với cửa sổ thứ hai ở chế độ ngang. Nó từ chối hiển thị chính nó trên toàn màn hình và cũng để nhận các sự kiện cảm ứng trên phần cắt của màn hình. Giải pháp duy nhất mà tôi tìm thấy cho đến nay là cho phép hỗ trợ độ phân giải gốc của iPhone6 ​​/ 6+ bằng cách thêm màn hình khởi chạy bắt buộc. Nếu bạn không hỗ trợ các độ phân giải này trong ứng dụng của mình có thể là vấn đề tương tự.

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