2013-02-14 15 views
6

Mam następujący projekt komórki, w której etykieta numeryczna ulega skurczeniu, a etykieta "Ogółem" znajduje się bezpośrednio pod nią.Określanie wysokości UILabel dla centrowania przy użyciu funkcji adjustFontSizeToFitWidth

enter image description here

mam właściwie ustawić adjustFontSizeToFitWidth i minimumFontSize właściwości. Czcionka zmienia rozmiar poprawnie. Jednak zakotwiczenie etykiety numerycznej na dno jest wyzwaniem. Zwłaszcza, gdy czcionka kurczy się, przerwa między dwiema etykietami rozszerza się i nie pojawia się pionowo w środku.

Próbowałem już sizeToFit, sizeThatFits i używałem czcionki pointSize. Wszystko bezskutecznie.

Jestem świadomy sizeWithFont:minFontSize:actualFontSize:forWidth:lineBreakMode:, ale nie rozumiem, dlaczego potrzebowałbym go w połączeniu z adjustFontSizeToFitWidth.

+0

czy próbowałeś 'sizeWithFont: minFontSize: actualFontSize: forWidth: lineBreakMode:'? –

+0

Rozważałem to. Zobacz aktualizację. –

+0

Czy możesz zmienić zdanie na nowo? Myślę, że mogę ci pomóc, ale nie jestem do końca pewien, jaki jest twój dokładny problem. Wygląda na to, że wystarczy zmienić ramkę dla etykiet "123" i "Ogólnie" po zmianie rozmiaru etykiety "123". – FreeAsInBeer

Odpowiedz

2

Ah, więc chcesz ustawić UILabels w środku widoku kontenera (zarówno w poziomie, jak iw pionie)?

Przeformułowałem moją odpowiedź, aby miało to więcej sensu dla przyszłych czytelników.

Mój kod jest przy założeniu, że masz 3 IBOutlets konfigurowaniu:

UIView *containerView; //Your nice view containing the two textfields. 
UILabel *points; //The label containing the number. 
UILabel *overall; //The textfield containing the text 'overall'. 

Można po prostu ustawić ramkę etykiet po przypisując tekst i wywołanie sizeToFit.

  1. Pierwszy wiersz pozycjonuje UILabel punktów jedyną zmianą była to współrzędna Y jest połową containerView odjąć połowie wysokości siebie.

    points.frame = CGRectMake(points.frame.origin.x, (containerView.frame.size.height/2) - (points.frame.size.height/2), points.frame.size.width, points.frame.size.height); 
    
  2. do stanowiska overall odpowiednio - mówią, że jest to odległość powiedzmy 6 pomiędzy liczbą i ogólnych etykiet:

    int space = 6; 
    
    overall.frame = CGRectMake(overall.frame.origin.x, points.frame.origin.y + points.frame.size.height + space, overall.frame.size.width, overall.frame.size.height); 
    
  3. Po przeczytaniu komentarzy, myślę, że jesteś po tym roztworze. Jeśli chcesz, aby oba elementy wyświetlały się w środku; (overall.frame.size.height/2) + (space/2) odjąć od wartości y points jak w przykładzie (kod z numerem 2 pod nią)

    int space = 6; 
    points.frame = CGRectMake(points.frame.origin.x, ((containerView.frame.size.height/2) - (points.frame.size.height/2)) - ((overall.frame.size.height/2) + (space/2)), points.frame.size.width, points.frame.size.height); 
    overall.frame = CGRectMake(overall.frame.origin.x, points.frame.origin.y + points.frame.size.height + space, overall.frame.size.width, overall.frame.size.height); 
    

punkt końcowy spowoduje wyjście jak tego obrazu. Jak widać niebieska linia jest połową całego obrazu i przecina czarny prostokąt (który jest przytulny wokół dwóch etykiet) w jego środkowym punkcie. Mam nadzieję, że właśnie o to prosiłeś.

image depicting effect

+0

Podczas wywoływania go 'squareView', widok kontenera może być do zrobienia. –

+0

Zakładam, że masz widok ogólny, który ma to ładne tło, a kropki po prawej. Powinienem zmienić nazwę tego, co to jest. Teraz jest to 'containerView' - znacznie lepiej! :) – Patrick

0

Zamiast dwóch etykiet, zamiast używać CATextLayer. Z łatwością będziesz mógł wykonać jedną część BOLD, a drugą normalną. plus pozycja i dopasowywanie rozmiaru dla jednej warstwy będzie łatwe w odniesieniu do umieszczania dwóch etykiet.ustawienie cienia, tryb przełamania linii, czcionki, będziesz mógł wszystko pięknie ustawić :)

+0

Zapamiętam to na przyszłość. Ale w tym momencie wszystko jest zbudowane jako UILabel i wolę nie refaktoryzować. Plus to teraz wyzwanie :) –

Powiązane problemy