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:

  1. 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 efekt contentScaleFactor ma naprawdę i na czym?

  2. 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ści UIScrollView 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! :)

Author: BastiBen, 2011-03-11

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 posiadanie UIView 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

 7
Author: Luis,
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:

  1. wywołanie UIGraphicsBeginImageContextWithOptions, aby utworzyć bitmapę kontekstu (z odpowiednim współczynnikiem skali) i wcisnąć go na stos Grafiki.
  2. użyj procedur UIKit lub Core Graphics, aby narysować zawartość obraz.
  3. wywołaj UIGraphicsGetImageFromCurrentImagecontext, aby pobrać bitmapę zawartość.
  4. 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

 2
Author: nilsou,
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