Jaki jest sekret "contentScaleFactor" UIView, gdy jest używany z CATiledLayer?
Pozdrawiam,
Pracuję nad aplikacją inspirowaną przykładem "ZoomingPDFViewer", który jest dostarczany z zestawem SDK iOS. W pewnym momencie znalazłem następujący bit kodu:
// to handle the interaction between CATiledLayer and high resolution
// screens, we need to manually set the tiling view's
// contentScaleFactor to 1.0. (If we omitted this, it would be 2.0
// on high resolution screens, which would cause the CATiledLayer
// to ask us for tiles of the wrong scales.)
pageContentView.contentScaleFactor = 1.0;
Próbowałem dowiedzieć się więcej o contentScaleFactor
i co to robi. Po przeczytaniu całej dokumentacji Apple, która o tym wspomniała, przeszukałem Google i nigdy nie znalazłem jednoznacznej odpowiedzi na to, co tak naprawdę robi.
Oto kilka rzeczy, które mnie ciekawi:
Wydaje się, że
contentScaleFactor
ma jakiś wpływ na kontekst graficzny podczas rysowania zawartości UIView/Calayera. Wydaje się, że jest to istotne dla wyświetlaczy o wysokiej rozdzielczości (takich jak wyświetlacz Retina). Jaki efektcontentScaleFactor
ma naprawdę i na czym?Gdy używasz
UIScrollView
i ustawiasz go na zoom, powiedzmy, mój contentView ; wszystkie podwidywa contentView również są skalowane. Jak to działa? Które właściwościUIScrollView
modyfikują, aby nawet odtwarzacze wideo stały się rozmyte i zwiększyć skalę?
TL; DR: jak funkcja powiększania uiscrollview działa "pod maską"? Chcę zrozumieć, jak to działa, żebym mógł napisać odpowiedni kod.
Wszelkie wskazówki i wyjaśnienia są bardzo cenione! :)
2 answers
Współrzędne są wyrażone w punktach, a nie w pikselach. contentScaleFactor
definiuje relację między punktem a pikselami: jeśli jest 1, punkty i piksele są takie same, ale jeśli jest 2 (Jak wyświetlacze retina ) oznacza to, że każdy punkt ma dwa piksele.
W normalnych rysunkach praca z punktami oznacza, że nie musisz się martwić o rozdzielczości: w iphone 3 (scaleFactor 1) i iphone4 (scalefactor 2 i rozdzielczość 2x) możesz użyć tych samych współrzędnych i kodu rysowania. Jeśli jednak rysujesz obraz (bezpośrednio, jako Tekstura...) i po prostu używając normalnych współrzędnych (punktów), nie można ufać, że piksel do mapy punktowej to 1 do 1. Jeśli to zrobisz, to każdy piksel obrazu będzie odpowiadał 1 punktowi, ale 4 pikselom, jeśli scaleFactor wynosi 2 (2 w kierunku x, 2 w kierunku y), więc obrazy mogą stać się nieco rozmyte
Dzięki scalefactor 2 możesz uzyskać nieoczekiwane rezultaty. Myślę, że posiadanieUIView
a contentScaleFactor==2
i warstwy a contentScale==2
myli system i czasami mnoży skalę. Może coś podobnego dzieje się z Scrollview.
Mam nadzieję, że to trochę wyjaśni
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-17 14:18:28
[[1]}Apple ma sekcję o tym na stronie "wsparcie ekranów o wysokiej rozdzielczości" w dokumentacji deweloperskiej iOS.
Strona mówi:
Aktualizacja Własnego Kodu Rysunku
Kiedy wykonujesz dowolny niestandardowy rysunek w aplikacji, przez większość czasu nie musisz dbać o rozwiązanie bazowego ekran. Natywne technologie rysowania automatycznie zapewniają, że współrzędne określone w logicznej mapie przestrzeni współrzędnych prawidłowo do pikseli na ekranie głównym. Czasami jednak możesz potrzebować aby wiedzieć, jaki jest obecny współczynnik skali, aby renderować swoje treść poprawnie. W takich sytuacjach UIKit, Core Animation i inne ramy systemowe zapewniają pomoc potrzebną do wykonania rysunku prawidłowo.
Tworzenie obrazów bitmapowych o wysokiej rozdzielczości programowo, jeśli obecnie użyj funkcji UIGraphicsBeginImageContext, aby utworzyć bitmapy, możesz dostosować swój kod do weź czynniki skali na konto. Funkcja UIGraphicsBeginImageContext zawsze tworzy obrazy o współczynniku skali 1,0. Jeśli urządzenie bazowe ma ekran o wysokiej rozdzielczości, obraz utworzony za pomocą tej funkcji może nie wyświetlane są jako gładkie po renderowaniu. Aby utworzyć obraz z czynnikiem skali inne niż 1.0, użyj UIGraphicsBeginImageContextWithOptions zamiast tego. Proces korzystania z tej funkcji jest taki sam jak dla Funkcja UIGraphicsBeginImageContext:
- wywołanie UIGraphicsBeginImageContextWithOptions, aby utworzyć bitmapę kontekstu (z odpowiednim współczynnikiem skali) i wcisnąć go na stos Grafiki.
- użyj procedur UIKit lub Core Graphics, aby narysować zawartość obraz.
- wywołaj UIGraphicsGetImageFromCurrentImagecontext, aby pobrać bitmapę zawartość.
- wywołanie UIGraphicsEndImageContext, aby wyświetlić kontekst ze stosu.
Na przykład poniższy fragment kodu tworzy bitmapy o wymiarach 200 x 200 pikseli. (Liczba pikseli wynosi określona przez pomnożenie rozmiaru obrazu przez skalę factor.)
UIGraphicsBeginImageContextWithOptions(CGSizeMake(100.0,100.0), NO, 2.0);
Zobacz tutaj: obsługa ekranów o wysokiej rozdzielczości
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-25 11:34:44