2013-08-15 13 views
21

mam problem z ościeżnicą-PROPERTY w iOS 7. Chcę zmienić rozmiar niektórych UIViews w viewDidLoad -method z moich UIViewController, ale jeśli mogę to zrobić jak int screenHeight = [[UIScreen mainScreen] bounds].size.height; [self.leftSideTableView setFrame: CGRectMake(0, 0, 320, screenHeight)]; wysokość jest ustawiona tak, jak chcę do końca metody, ale w każdej innej metodzie jest tak, jak przedtem!Ustawianie ramki o UIView nie działa

Co jest nie tak z tym lub jest to tylko błąd kompilatora lub cokolwiek innego?

+0

Czy możesz wyjaśnić, co jest nie tak? Nie jestem pewien, co miałeś na myśli. –

+0

Czy to mój angielski, czy jak to wytłumaczyłem? : D Tak więc UIView nie zmienia rozmiaru! NSLog pokazuje, że jest w nim właściwa wartość, ale tylko do końca metody! W każdej innej metodzie, którą kompilator wykonuje po viewDidLoad, jest to stara wartość! :/ – MyJBMe

+0

Spróbuj ustawić ramkę 'UIView's w' viewDidLayoutSubviews' lub 'viewWillAppear'. Widoki nie są jeszcze ułożone w 'viewDidLoad'. – bobnoble

Odpowiedz

70

Należy zmienić rozmiar widoku na -viewDidLayoutSubviews:! (documentation)

Umieszczanie zmian ramek widoku na -viewWillAppear: lub -viewDidLoad: nie będzie działać, ponieważ widoki nie są jeszcze rozmieszczone!

+4

Dzięki za to. Licz na Apple, aby zmienić zdanie na podstawie kaprysu i wprowadzić nieprzyjemne zmiany w zachowaniu dla bardzo podstawowych rzeczy, które działały od wydania 1.0. –

+1

W rzeczywistości to też nie działa. viewDidLayoutSubviews zostaje wywołany, a wartości klatek zmieniają się, ale obraz jest nadal rozciągnięty, podobnie jak dla initWithFrame: in viewWillAppear. Korzystanie z tego kodu. CGRect frame = self.navigationItem.titleView.frame; frame.size.width = 102; frame.size.height = 44; self.navigationItem.titleView.frame = frame; –

+0

Tylko notatkę. iOS7 i iOS8 zachowują się inaczej. w systemie iOS7 zmiana klatki w widoku podrzędnym wyzwala layoutSubview, w systemie iOS8 tak się nie dzieje. – aryaxt

1

Istnieje kilka powodów, dla których może się tak dziać. Przede wszystkim upewnij się, że Twój widok tabeli nie jest zerowy. Jeśli tworzysz programowo, musisz mieć pewność, że wywołujesz alokację/init gdzieś przed próbą ustawienia ramki. Jeśli self.leftSideTableView jest IBOutlet, może to być spowodowane zapomnieniem, aby faktycznie połączyć gniazdo z obiektem interfejsu.

Następnie drugie i mniej prawdopodobne, programujesz widok tabeli i inicjalizujesz go poprawnie, ale zapomniałeś dodać go jako widok z jednego z widoków na ekranie.

+0

TableView jest tworzony w stalówce i jest połączony, a teraz chcę go zmienić! Widzę to również na ekranie i jest wypełniona, ale nie jestem w stanie zmienić wysokości! – MyJBMe

+0

@MyJBMe Czy używasz podklasy UITableViewController? –

+0

Nie, jest to normalny UITableView! Ale @bobnoble właśnie przyniósł odpowiedź! Nie mogę zmienić rozmiaru w viewDidLoad - nawet jeśli mogę ustawić cień - ale mogę ustawić viewDidLayoutSubviews! viewWillAppear też tego nie robi! – MyJBMe

11
  • Sprawdź, czy używasz autolayout w swoim pliku XIB. Jeśli nie chcesz używać autolayout, odznacz go w swoim pliku XIB.

  • Zmień ramkę self.leftSideTableView w -viewWillAppear:.

7

Sprawdź, czy automatyczny układ nie został aktywowany w pliku scenorysu.

Aby wyłączyć tę funkcję, spójrz na inspektora w programie budującym interfejs. Kliknij ikonę, która wygląda jak strona po lewej stronie. W sekcji "Dokument konstruktora interfejsu" odznacz "Użyj automatycznego układu".

Uważam, że najlepiej jest dla całego kontrolera widoku w IB z automatycznym układem lub całkowicie w kodzie. Miksowanie tych dwóch może prowadzić do dziwnych zachowań, które są trudne do debugowania.

+0

wyłączenie autolayout dla mnie działało! Dziękuję Ci! –

+0

Człowieku, uderzyłem w to głową przez wiele godzin (facepalm). Dzięki! – Sobakus

Powiązane problemy