Mam takie samo życzenie. Chcę móc zapisywać zrzuty ekranu z kilku ekranów w mojej aplikacji bez całej ręcznej pracy. Jeszcze mnie nie ma, ale zacząłem.
Chodzi o to, aby zakończyć /var/log/system.log, gdzie znajduje się wyjście z instrukcji NSLog. Wyprowadzam dane wyjściowe do programu Pythona. Program python czyta wszystkie linie ze standardowego wejścia i kiedy linia pasuje do określonego wzorca, wywołuje screencapture.
NSLog(@"screenshot mainmenu.png");
To spowoduje, że zrzut ekranu o nazwie "XX. główne menu YY.png" będzie tworzony za każdym razem, gdy zostanie wywołany. XX to numer zrzutu ekranu od momentu uruchomienia programu. YY to numer ekranu głównego "menu głównego".
Mam nawet dodaje niepotrzebne funkcje:
NSLog(@"screenshot -once mainmenu.png");
To uratuje tylko "XX". Mainmenu.png raz.
NSLog(@"screenshot -T 4 mainmenu.png");
uczyni to ekranu po upływie 4 sekund.
Po uruchomieniu aplikacji z prawej wyrębu, screeny z następującymi nazwami mogły powstać:
00. SplashScreen.png
01. MainMenu 01.png
03. StartLevel 01.png
04. GameOver 01.png
05. MainMenu 02.png
Spróbować:
dodać kilka oświadczeń NSLog do kodu
$ tail -f -n0 /var/log/system.log | ./grab.py
Uruchom aplikację iPhone w symulatorze
Pobaw się ze swojej aplikacji
Zapraszamy do obejrzenia screenów pokazuje się gdzie program zostanie uruchomiony grab.py
grab.py:
#!/usr/bin/python
import re
import os
from collections import defaultdict
def screenshot(filename, select_window=False, delay_s=0):
flags = []
if select_window:
flags.append('-w')
if delay_s:
flags.append('-T %d' % delay_s)
command_line = 'screencapture %s "%s"' % (' '.join(flags), filename)
#print command_line
os.system(command_line)
def handle_line(line, count=defaultdict(int)):
params = parse_line(line)
if params:
filebase, fileextension, once, delay_s = params
if once and count[filebase] == 1:
print 'Skipping taking %s screenshot, already done once' % filebase
else:
count[filebase] += 1
number = count[filebase]
count[None] += 1
global_count = count[None]
file_count_string = (' %02d' % number) if not once else ''
filename = '%02d. %s%s.%s' % (global_count, filebase, file_count_string, fileextension)
print 'Taking screenshot: %s%s' % (filename, '' if delay_s == 0 else (' in %d seconds' % delay_s))
screenshot(filename, select_window=False, delay_s=delay_s)
def parse_line(line):
expression = r'.*screenshot\s*(?P<once>-once)?\s*(-delay\s*(?P<delay_s>\d+))?\s*(?P<filebase>\w+)?.?(?P<fileextension>\w+)?'
m = re.match(expression, line)
if m:
params = m.groupdict()
#print params
filebase = params['filebase'] or 'screenshot'
fileextension = params['fileextension'] or 'png'
once = params['once'] is not None
delay_s = int(params['delay_s'] or 0)
return filebase, fileextension, once, delay_s
else:
#print 'Ignore: %s' % line
return None
def main():
try:
while True:
handle_line(raw_input())
except (EOFError, KeyboardInterrupt):
pass
if __name__ == '__main__':
main()
Problemy z tej wersji:
Jeśli chcesz zrobić zrzut ekranu z okna tylko iPhone Simulator, trzeba kliknąć okno iPhone Simulator dla każdego ekranu. screencapture odmawia przechwycenia pojedynczych okien, chyba że jesteś skłonny do interakcji z nim, dziwnej decyzji projektowej dla narzędzia wiersza poleceń.
Aktualizacja: Teraz symulator iPhone'a symulatora (w http://www.curioustimes.de/iphonesimulatorcropper/index.html) działa z poziomu wiersza poleceń. Zamiast więc używać wbudowanego screencapture, pobierz i użyj go zamiast tego. Teraz proces jest całkowicie automatyczny.
Chciałbym usłyszeć odpowiedź na to również z urządzenia. –