Zastanawiam się, jak moja aplikacja na iPhone'a może zrobić zrzut ekranu z konkretnym UIView
plikiem UIImage
.
Wypróbowałem ten kod, ale otrzymałem tylko pusty obraz.
UIGraphicsBeginImageContext(CGSizeMake(320,480));
CGContextRef context = UIGraphicsGetCurrentContext();
[myUIView.layer drawInContext:context];
UIImage *screenShot = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
myUIView
ma wymiary 320x480 i ma kilka podwidoków. Jaki jest właściwy sposób, aby to zrobić?
ios
objective-c
uiview
screenshot
cduck
źródło
źródło
Odpowiedzi:
Myślę, że możesz chcieć
renderInContext
, niedrawInContext
. drawInContext to bardziej metoda, którą można by zastąpić ...Zwróć uwagę, że może nie działać we wszystkich widokach, szczególnie rok temu, kiedy próbowałem użyć tego z podglądem na żywo z kamery, nie działało.
źródło
iOS 7 ma nową metodę, która umożliwia narysowanie hierarchii widoków w bieżącym kontekście graficznym. Można to wykorzystać do bardzo szybkiego uzyskania UIImage.
Zaimplementowałem metodę kategorii,
UIView
aby uzyskać widok jakoUIImage
:Jest znacznie szybsza niż dotychczasowa
renderInContext:
metoda.Źródła: https://developer.apple.com/library/content/qa/qa1817/_index.html
UPDATE FOR SWIFT : Rozszerzenie, które robi to samo:
AKTUALIZACJA DLA SWIFT 3
źródło
Musisz przechwycić okno klucza do zrzutu ekranu lub UIView. Możesz to zrobić w rozdzielczości Retina za pomocą UIGraphicsBeginImageContextWithOptions i ustawić parametr skali na 0,0f. Zawsze przechwytuje w natywnej rozdzielczości (siatkówka w przypadku iPhone'a 4 i nowszych).
Ten robi zrzut ekranu na pełnym ekranie (okno klucza)
Ten kod przechwytuje UIView w rozdzielczości natywnej
To zapisuje UIImage w formacie jpg z jakością 95% w folderze dokumentów aplikacji, jeśli musisz to zrobić.
źródło
Od iOS7 mamy poniżej domyślne metody:
Wywołanie powyższej metody jest szybsze niż próba samodzielnego renderowania zawartości bieżącego widoku na obraz bitmapowy.
Jeśli chcesz zastosować efekt graficzny, taki jak rozmycie, do migawki, użyj
drawViewHierarchyInRect:afterScreenUpdates:
zamiast tego metody.https://developer.apple.com/library/ios/documentation/uikit/reference/uiview_class/uiview/uiview.html
źródło
Jest nowe API z iOS 10
źródło
Stworzyłem użyteczne rozszerzenie dla UIView do robienia zrzutów ekranu w Swift:
Aby z niego skorzystać, wystarczy wpisać:
źródło
UIGraphicsBeginImageContextWithOptions(self.bounds.size, false, 0);
zamiastUIGraphicsBeginImageContext(self.bounds.size);
używać właściwego współczynnika skali urządzenia.drawViewHierarchyInRect
zamiastrenderInContext
nie działa.Ta metoda może zostać umieszczona w Twojej klasie kontrolera.
źródło
drawRect
nie jest częścią UIViewController (IIRC). Jest częścią UIView. Nie wierzę, że zostanie wywołany, jeśli jest w kontrolerze.Apple pozwala nam teraz używać go w publicznej aplikacji, mimo że jest to prywatny interfejs API
źródło
Detale
Rozwiązanie
Stosowanie
Pełna próbka
Wynik
źródło
Apple nie zezwala na:
Aplikacje powinny wykonać zrzut ekranu przy użyciu
drawRect
metody określonej w: http://developer.apple.com/library/ios/#qa/qa2010/qa1703.htmlźródło
Stworzyłem to rozszerzenie, aby zapisać zrzut ekranu z UIView
zadzwoń :
Jeśli chcesz stworzyć png, musisz zmienić:
przez
źródło
Zaktualizowano Swift 4:
źródło
Poniższy fragment służy do zrobienia zrzutu ekranu:
Użyj
renderInContext:
metody zamiastdrawInContext:
metodyrenderInContext:
metoda renderuje odbiornik i jego podwarstwy w bieżącym kontekście. Ta metoda renderuje bezpośrednio z drzewa warstw.źródło
źródło
możesz użyć następującej kategorii UIView -
źródło