2009-09-28 20 views
6

Mam dużo png o różnych rozmiarach i chcę je załadować do stołu. Mam ten kod:Wyśrodkowane obrazy są rozmyte

charImage.image = [self imageForId:g.charId glyphNr:g.glyphNr]; 
[charImage sizeToFit]; 
//charImage.contentMode = UIViewContentModeCenter; 
charImage.center = CGPointMake(30, 23); 

Wszystko działa dobrze z wyjątkiem tego, że moje png są rozmyte. Jeśli ich nie centruję, są bardzo ostre. Wszystkie są wykonane z krzywych. Nie wyeksportowałem ich wszystkich, więc nadal mam szansę na eksport ze stałym rozmiarem i rysunkami, które są już wyśrodkowane, ale chcę wiedzieć, czy robię coś nie tak, czy nie. Dlaczego są rozmyte?

myślę, nie jest możliwe, aby przesłać dowolne zdjęcie tutaj ..

Odpowiedz

10

Będzie to upewnij się, że rama jest na całkowitą współrzędne:

int centerX = 30; 
int centerY = 23; 
CGSize size = charImage.frame.size; 
charImage.frame = CGRectMake((int)(centerX - size.width/2), 
          (int)(centerY - size.height/2), 
          size.width, size.height); 

różnica pomiędzy tym

charImage.center = CGPointMake(30, 23); 

jest otocz .center nastawczym ld ustaw początek do punktu niecałkowitego, gdy któraś z szerokości lub wysokości ma niewłaściwą parzystość. Jak powiedzieli inni ludzie, obrazy i tekst wyglądają na rozmyte, gdy są na współrzędnych niecałkowitych.

+0

Doskonale, dziękuję bardzo. –

+1

Należy zauważyć, że dzieje się tak również, gdy rozmiar obrazu nie jest "równy" ani w wysokości ani szerokości (np. Rozmiar 301x199). W takim przypadku użycie UIViewContentModeCenter może spowodować rozmycie obrazu nawet bez użycia środka. –

1

można użyć oblicza współrzędne zamiast contentMode:

charImage.frame = CGRectMake(x,y,width,height)

+0

Czy możesz mi pomóc obliczyć niektóre ustalone wartości? jest to równoważne z właściwością centrum, ale nadal nie są to wartości stałe, nie wiem jak, granice to 46x46px: charImage.frame = CGRectMake ((46- [ograniczenia charImage] .size.width)/2 , (46- [granica pola charImage] .size.height)/2, [ograniczenia pola charImage] .size.width, [charImage bounds] .size.height); –

+0

Myślę, że można zmienić tylko pozycję, a nie obliczyć nową ramkę, prawda? Ale nie wiem, co to za własność. –

4

Dzieje się tak dlatego, że PNG uzyskać umieszczone w położeniach subpikseli . Używanie sizeToFit wraz z UIViewContentModeCenter sprawia, że ​​tak się dzieje. Jeśli nie korzystasz z UIViewContentModeCenter, widoki są umieszczane w (0.0, 0.0), a więc nie są rozmyte.

Jeśli chcesz uniknąć rozmazania, najpierw nie używać sizeToFit, a następnie użyć tego, aby wyśrodkować obraz:

image.frame = CGRectMake(round(centerX - image.frame.size.width/2.0), 
         round(centerY - image.frame.size.height/2.0), 
         image.frame.size.width, 
         image.frame.size.height); 
+0

Jak rozumiem sizeToFit sprawia, że ​​mój UIImageView do podjęcia rozmiar UIImage, więc contentMode tutaj nie ma wpływu, dlatego ja skomentowałem to. nie mogłem obsłużyć skalowań UIImageView, więc wolałem centrować bezpośrednio UIImageView. charImage to UIImageView –

+0

Masz rację: nie musisz ustawiać trybu zawartości. Ale jeśli sizeToFit, obraz może zostać rozciągnięty, a to samo w sobie może oczywiście spowodować, że obraz będzie niewyraźny. Zobacz zaktualizowaną odpowiedź. – Felixyz

Powiązane problemy