2011-02-05 10 views
5

Próbuję wcięcia tekstu w UILabel pozostawić margines wokół tekstu pokazujący kolor tła. Zgodnie z sugestią here Mam nadpisane textRectForBounds:limitedToNumberOfLines: tak:Tekst ULEFabel textRectForBounds nie daje żadnego efektu podczas próby utworzenia marginesu

- (CGRect)textRectForBounds:(CGRect)bounds limitedToNumberOfLines:(NSInteger)numberOfLines 
{ 
    CGRect intermediate = CGRectMake(bounds.origin.x+MARGIN,bounds.origin.y+MARGIN,bounds.size.width-2*MARGIN,bounds.size.height-2*MARGIN); 
    return [super textRectForBounds:intermediate limitedToNumberOfLines:numberOfLines]; 
} 

Ale bez względu na to, co robię, tekst kończy się mocno do lewej krawędzi prostokąta. Wygląda na to, że rysunek ignoruje początkową część zwróconego CGRect (chociaż wydaje się, że respektuje część szerokości, tak jakbym zmniejszył do szerokości pośredniej do np. bounds.size.width-200, to znaczy, że return textRectForBounds jest odpowiednio wąski i tekst jest narysowany w długiej, chudej kolumnie).

A więc: co jeszcze muszę zrobić z UILabel, aby rysunek był zgodny z oryginałem origin.x i origin.y pod adresem textForRectBounds-recturned-rect? Wolę nie zastępować UILabel 's drawTextInRect, jeśli mogę pomóc.

Aktualizacja: To było dawno temu i nie pamiętam dokładnie, dlaczego inne pytanie nie zadziałało dla mnie. Wierzę, że to dlatego, że próbowałem mieć UILabel z wieloma liniami, a rozwiązanie here nie działało w takim przypadku.

+0

Czy próbowałeś zwrócić bezpośrednio "pośrednie"? –

+0

tak, ale to nie ma znaczenia. – damian

Odpowiedz

8

myślę, że należy zastąpić zarówno textRectForBounds:limitedToNumberOfLines: i drawTextInRect: tak:

- (CGRect)textRectForBounds:(CGRect)bounds limitedToNumberOfLines:(NSInteger)numberOfLines 
{ 
    return CGRectInset(bounds, MARGIN, MARGIN); 
} 

- (void)drawTextInRect:(CGRect)rect 
{ 
    [super drawTextInRect: CGRectInset(self.bounds, MARGIN, MARGIN)]; 
} 
+0

Dzięki, to zadziałało (mniej więcej): musiałem poprawić trochę szerokość, aby wszystko działało poprawnie z wieloma liniami, ale udało mi się to zrobić na końcu. – damian

+0

Jeśli to zrobić (w celu dopasowania do UITextView) może również chcesz nadpisać sizeThatFits jak to: - (CGSize) sizeThatFits: (CGSize) Rozmiar { CGSize fsize = [Super sizeThatFits: rozmiar]; fSize.width + = 2 * MARGINES; fSIze.height + = 2 * MARGINES; return fSize; } –

+1

Nie działa dla mnie, nadal nie jest wywoływana. –

0

Sprawdź w dokumentacji, może to być pomocne. połączenia do super może nie zwracać wartości, które zakładasz.

Nie należy bezpośrednio wywoływać tej metody . Ta metoda powinna być tylko nadpisywana przez podklasy, które chcą zmienić prostokąt ograniczający odbiornika przed wykonaniem jakichkolwiek innych obliczeń . Należy użyć wartości parametru numberOfLines , aby ograniczyć wysokość zwracanego prostokątu o wartości do dla określonej liczby wierszy tekstu. Aby ta metoda mogła zostać wywołana, numer musi być wcześniejszym wywołaniem metody sizeToFit lub sizeThatFits:. Zauważ, że etykiety w obiektach UITableViewCell są sized na podstawie wymiarów komórek, i nie żądanej wielkości Domyślna implementacja tej metody zwraca oryginalne granic prostokąta.

Powodzenia!

+0

W rzeczywistości dokumentacja jest niepoprawna z 'limitedToNumberOfLines: 0'. Przekazany w 'bounds' ma' wysokość', która wygląda jak 'INT_MAX_VALUE' lub coś podobnego, a domyślna implementacja wydaje się zredukować ją do wartości wystarczająco wysokiej, aby dopasować tekst. – damian

Powiązane problemy