2009-08-10 19 views

Odpowiedz

12

OK Odpowiadam na moje własne pytanie tutaj.

Znalazłem wiele odniesień do tego błędu przez Google, ale wszyscy pracowali nad nim, bawiąc się rozmiarami czcionek. Po wielu polowaniach znalazłem this thread, który mówi, że antyaliasing jest stosowany, gdy ramka widoku zawiera ułamkowe wartości pikseli, np. jeśli obliczysz jego rozmiar jako ułamek super widoku.

Rzeczywiście, rzucanie wartości CGRect do (int) dla ramki widoku działało idealnie. Tak na przykład, jeśli chcesz swoje pole tekstowe, aby być wyśrodkowany pionowo w SuperView, należy użyć (int) rzucić tak:

 
textFieldWidth = 300; 
textFieldHeight = 31; 
offsetX = 0; 
offsetY = (superview.bounds.size.height - textFieldHeight)/2; 

textField.frame = CGRectMake((int) offsetX, 
          (int) offsetY, 
          (int) textFieldWidth, 
          (int) textFieldHeight); 

Istnieje również funkcja CGRectIntegral że można użyć do przekształcania CGRect do wartości integralnych.

+7

Proponuję, abyś * nie * rzutował na int, aby zaokrąglić wartość zmiennoprzecinkową. Jest na to funkcja. To jest "runda". Przesyłanie do int spowoduje powrót do unosu, gdy 'CGRectMake' przyjmie parametry zmiennoprzecinkowe. Ta podwójna obsada zaciemnia celność i może być gorsza. Z drugiej strony CGRectIntegral jest jeszcze lepszy. –

+0

również, zamiast rundy można użyć ciel lub floorf (??), aby zaokrąglić w górę lub w dół do najbliższej wartości całkowitej odpowiednio. –

26

Użyj CGRectIntegral, aby upewnić się, że ramki pól tekstowych są oparte na współrzędnych całkowitych. Otrzymasz rozmytą antyaliasing, gdy rzeczy leżą na współrzędnych ułamkowych.

+0

najczystsze rozwiązanie.Do mojego celu dodałem rozszerzenie NSView z '- (void) convertFrameMeasurementsToInteger { \t self.frame = CGRectIntegral (self.frame); } ' .. .. , ale jeszcze lepiej byłoby mieć flagę' useIntegerBounds' i nadpisać '-setFrame' – codrut

0

Bardzo chciałbym wnieść swój wkład, ponieważ właśnie odkryłem odpowiedź po odrobinie frustracji.

UITextField w InterfaceBuilder ma wymuszoną wysokość ramki 31 pikseli. Nie można tego przeciągnąć, aby zmienić rozmiar, ani nie można go ustawić we właściwościach ramki w IB. Musisz przejść do viewDidLoad i dostosować wysokość ramki do 32 pikseli, co powinno rozwiązać problem.

Mam nadzieję, że przyszłe wersje IB poprawią to.

1

Oprócz stosowania pozycjonowania bez ułamków należy upewnić się, że do UITextField zastosowano niecentryczne pionowe wyrównanie. Wygląda na to, że wyśrodkowane wyrównanie w pionie w połączeniu z nieparzystym rozmiarem czcionki powoduje również rozmycie tekstu.

0

Próbowałem używać CGRectIntegral i innych rzeczy. W moim przypadku zmienił się minimalny rozmiar czcionki i rozmiar czcionki w IB.

0

Napotkałem ten problem wcześniej. Poniższe rozwiązanie działa idealnie dla dowolnego rozmiaru tekstu lub ramki, ponieważ używa funkcji rundy, aby pozbyć się ułamkowych wartości pikseli. Wstaw następujący kod po utworzeniu pola uytte pole.

0

Po prostu ustawienie wysokości ramki na równomierną wartość ustawiono dla mnie.

+0

To jednak nie naprawia problemu, działa tylko wokół podstawowego problemu, dzięki czemu można uzyskać rozmiar, który nie powoduje rozmycia. Wymuszenie ramki na wartościach integralnych rozwiązuje problem prawidłowo. –

+0

Cóż, dla mnie tak się stało. Używam systemFontOfSize: 18 – samvermette

Powiązane problemy