2013-07-06 24 views
10

staram się na dwa dni, aby zmodyfikować klatka UILabel, który jest śmieszne ... The UILabel jest IBOutlet, ale to nie jest powód, dlaczego nie działa: Starałem się stworzyć UILabel programowo i nadal nie działa. Oto jak to zrobić:Dlaczego nie mogę zmienić ramki mojego UILabel?

self.descriptionLabel.text = description; 
self.descriptionLabel.lineBreakMode = NSLineBreakByWordWrapping; 

CGSize textSize = [self.descriptionLabel.text sizeWithFont:[UIFont systemFontOfSize:12.0] 
             constrainedToSize:CGSizeMake(self.descriptionLabel.frame.size.width, FLT_MAX) 
              lineBreakMode:self.descriptionLabel.lineBreakMode]; 
CGFloat frameHeight = textSize.height; 
CGRect frame = self.descriptionLabel.frame; 
frame.size.height = frameHeight; 
self.descriptionLabel.frame = frame; 

CGRect bounds = self.descriptionLabel.frame; 
bounds.origin.x = self.descriptionLabel.frame.origin.x + 10.0; 
bounds.size.width = self.descriptionLabel.frame.size.width - 20.0; 
self.descriptionLabel.bounds = bounds; 
self.descriptionLabel.numberOfLines = 0; 

Już zadawane na IRC i powiedziano mi, że nie ma powodu, dlaczego rama nie zostanie zmieniona ...

Próbowałem też stworzyć ramkę z CGRectMake i daj mu dowolną wartość , ale to też nie wystarczy.

Czy ktoś wie, na czym może polegać problem?

Edit 1: Zalogowałem ramkę przed i po, i mam wyniki nieparzyste:

Before: 0.000000 0.000000 0.000000 0.000000 
After: 0.000000 0.000000 0.000000 33525.000000 

Wysokość po ustawić rama jest jedyną wartością, która ma sens (mam dużo tekst na etykiecie celowo).

Edit 2: Zmieniłem kod w następujący sposób, dziennik twierdzi, że rama zmieniło, ale na symulatorze nie uległa zmianie; Udowodniłem to, dodając czerwone granice do warstwy UILabel.

self.descriptionLabel.text = description; 
self.descriptionLabel.lineBreakMode = NSLineBreakByWordWrapping; 

CGSize textSize = [self.descriptionLabel.text sizeWithFont:[UIFont systemFontOfSize:12.0] 
             constrainedToSize:CGSizeMake(self.view.frame.size.width, FLT_MAX) 
              lineBreakMode:self.descriptionLabel.lineBreakMode]; 
CGFloat frameHeight = textSize.height; 
CGRect frame = CGRectMake(0.0, 300.0, self.view.frame.size.width, frameHeight); 
self.descriptionLabel.frame = frame; 

DDLogInfo(@"After: %f %f %f %f", self.descriptionLabel.frame.origin.x, self.descriptionLabel.frame.origin.y, self.descriptionLabel.frame.size.width, self.descriptionLabel.frame.size.height); 
// After: 0.000000 300.000000 320.000000 585.000000 

self.descriptionLabel.numberOfLines = 0; 
self.descriptionLabel.layer.borderColor = [UIColor redColor].CGColor; 
self.descriptionLabel.layer.borderWidth = 2; 

Proof

+0

Czy rejestrowałeś ramkę przed i po? I dlaczego zmieniasz granice (szczególnie używając ramki, która znajduje się w innym miejscu współrzędnych)? – Wain

+0

Zalogowałem ramkę przed i po, zgodnie z sugestią, i otrzymałem dziwne wyniki, które zawarłem w pytaniu, które zredagowałem. –

+1

Dlaczego ustawiasz liczbę linii na 0 na końcu? – Abizern

Odpowiedz

26

Jeśli korzystasz z automatycznego układu, nie powinieneś wykonywać żadnych ustawień ramek - wyłącz automatycznego układu lub użyj więzów, aby zmienić rozmiar etykiety. Najprościej to zrobić, aby nadać swojej etykiecie ograniczenie wysokości (i szerokość, jeśli chcesz mieć stałą szerokość) w IB, i stworzyć dla niego IBOutlet. Następnie, w kodzie, zmień stałą wartość tego ograniczenia na podstawie wartości otrzymanej z sizeWithFont: constrainedToSize: lineBreakMode :.

+0

Udało się! Dzięki wielkie!! –

+0

Pracował świetnie. Nie jest oczywiste, jak zaktualizować ograniczenie. Oto, jak to zrobić: self.labelWidthContraint.constant = size.width; self.labelHeightContraint.constant = size.height; – ddiego

+0

Niezupełnie intuicyjny, ale to działało ładnie - dziękuję, panie Delmar! – BonanzaDriver

0

Etykieta ma ramę zera na początku, tak, to kiedy to zrobić:

CGSize textSize = [self.descriptionLabel.text sizeWithFont:[UIFont systemFontOfSize:12.0] 
             constrainedToSize:CGSizeMake(self.descriptionLabel.frame.size.width, FLT_MAX) 
              lineBreakMode:self.descriptionLabel.lineBreakMode]; 

Prosisz metodę sizeWithFont coś zrobić skutecznie niemożliwe - powie wysokość, która jest wymagana, gdy żadna szerokość nie jest dozwolona. Odpowiedź, jaką zapewnia (33525.000000), jest prawdopodobnie wysokością, jeśli jedna postać jest dozwolona w każdej linii lub coś podobnego.

Tak więc albo ustaw szerokość etykiety przed rozpoczęciem, albo podaj dozwoloną szerokość do metody sizeWithFont, a następnie ustaw rozmiar etykiety za pomocą odpowiedzi (nie tylko wysokości).

Zastanów się także, co próbujesz zrobić, zmieniając granice. Komentarz, który wykreśla kod, dopóki nie uzyskasz ramki przynajmniej, wtedy możesz dodać go z powrotem i sprawdzić, czy rzeczywiście robi to, co chcesz.

+0

Proszę zobaczyć moją ostatnią zmianę. Podążyłem za twoimi sugestiami i w dzienniku zmieniła się ramka, ale nie zrobiła ona nic w symulatorze ... –

+0

A to jedyny kod jaki masz, co robi z etykietą? Gdzie jest ten kod w (w jakiej jest formie i kiedy jest nazywany)? Jakie są zasady automatycznego zmieniania rozmiaru/automatycznego układu? – Wain

+0

Dodałem UILabel z IB i nie dotknąłem ograniczeń automatycznego układu. Oto pełny plik, w którym znajduje się ten kod: https://gist.github.com/AzizLight/40b66b2daa2917952d6f Jak widać UILabel jest ustawiony na 'viewDidLoad' i to wszystko ... –

Powiązane problemy