2009-08-17 19 views
6

szukam sposobu na zrzut ekranu na iPhone z góry pasek stanu wliczone Obecnie używam następujący kod:Przechwytywanie ekranu iPhone'a z dołączonym paskiem stanu?

UIGraphicsBeginImageContext(self.view.bounds.size); //self.view.window.frame.size 
[self.view.layer renderInContext:UIGraphicsGetCurrentContext()]; 
UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
UIImageWriteToSavedPhotosAlbum(viewImage, nil, nil, nil); 

Powyższy kod powodzeniem zajmuje zrzut ekranu z iPhone UIView lecz nie obejmuje górnego paska stanu (w jego miejscu jest tylko puste miejsce o rozmiarze 20 pikseli).

Odpowiedz

3

Możesz pobrać całą zawartość ekranu, dzwoniąc do prywatnego API UIGetScreenImage. Szczegółowe informacje można znaleźć w mojej previous answer do similar question.

+0

Czytałem o tej prywatnej API funkcja wcześniej, jestem ciekawy, czy Apple zaakceptuje aplikację na iPhone'a do korzystania z funkcji prywatnego API? –

+3

Uczucia różnią się w zależności od korzystania z prywatnych interfejsów API. Oto moje zdanie: 1) Korzystanie z prywatnych interfejsów API jest niezgodne z zasadami firmy Apple i jest jednym z (niewiarygodnie mało) oczywistych sposobów odrzucania lub pobierania Twojej aplikacji ze sklepu; ale ... 2) Coś tak prostego jak zrzut ekranu prawdopodobnie będzie latać pod radarem i nie zostanie zauważone przez osobę, która przeszła; a jednak ... 3) Apple może zmienić to API w dowolnym momencie w przyszłości, z dowolnym wydaniem, w dowolny sposób, z dowolnego powodu, bez żadnego ostrzeżenia. Uważam, że każde użycie prywatnych interfejsów API ustawia się na wsparcie bólu głowy i stwarza ryzyko złego doświadczenia użytkownika. –

+0

W tym konkretnym przypadku, nie sądzę, że istnieje duże ryzyko, jeśli funkcja jest dynamicznie dostępna, a awarie są uwzględniane: aplikacja może po prostu wrócić do zrzutu ekranu przy użyciu standardowej metody. Konkretna implementacja tego w mojej odpowiedzi używa jednak statycznego linkowania i jest to ćwiczenie dla czytelnika. – rpetrich

1

Od 8 października 2009 r. Użycie UIGetScreenImage spowodowało odrzucenie mojej aplikacji! :(Nie radziłbym go używać.Myślę, że Apple próbuje oczyścić wszystkie aplikacje i dostosować je do nowych 3.x OS/API.Jestem alternatywą.Jeśli ktoś ma jakieś sugestie. API?

1

Zamiast prywatną API, dlaczego nie czynią całą UIWindow do kontekstu obrazu? To może być wystarczający, aby zastąpić self.view z self.view.window w kodzie.

można również uzyskać bieżące okno (s) jako właściwość instancji [UIApplication sharedApplication]. Możliwe jest, że pasek stanu znajduje się na osobnej warstwie okna i być może trzeba będzie wyrenderować okna w kolejności:

Coś takiego:

UIGraphicsBeginImageContext(self.view.window.frame.size); 
for (UIWindow *window in [[UIApplication sharedApplication] windows]) { 
    [window.layer renderInContext:UIGraphicsGetCurrentContext()]; 
} 
UIImage *screenshotImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
UIImageWriteToSavedPhotosAlbum(viewImage, nil, nil, nil); 

W każdym razie prawdopodobnie nie musisz uciekać się do prywatnego API.

+0

Niestety, użycie właściwości keyWindow aplikacji UIApplication powoduje ten sam problem - czarny pasek stanu. Najwyraźniej nie ma (prawnej) metody przechwytywania całego ekranu. –

+0

Pasek stanu znajduje się w osobnym oknie. Możesz przechodzić przez właściwość 'windows' UIApplication i renderować je na tym samym obrazie, w kolejności. – benzado

+0

Dowolny sposób, aby powiedzieć, który jest pasek stanu? –

11

Jako iOS 7 można to zrobić bez użycia prywatnych API użyciu

UIView *screenshotView = [[UIScreen mainScreen] snapshotViewAfterScreenUpdates:NO]; 

Zobacz moją odpowiedź na to pytanie:

Moving status bar in iOS 7

Powiązane problemy