2013-08-21 12 views
5

Utworzyłem UICollectionView w konstruktorze interfejsów. Odwołułem się do niego zJak mogę programowo zmienić rozmiar UICollectionView?

@property (strong, nonatomic) IBOutlet UICollectionView *contactList; 

w moim pliku .h i @synthesize contactList; w moim pliku .m.
starałem się wdrożyć nieco inny układ w pionowym i poziomym za pomocą następującego kodu:

- (void) adjustViewsForOrientation:(UIInterfaceOrientation) orientation { 
    if (orientation == UIInterfaceOrientationPortrait || orientation == UIInterfaceOrientationPortraitUpsideDown) { 
     UICollectionViewFlowLayout *flow = (UICollectionViewFlowLayout*)contactList.collectionViewLayout; 
     flow.sectionInset = UIEdgeInsetsMake(48, 80, 48, 0); 
     flow.minimumLineSpacing = 80; 
    } else if (orientation == UIInterfaceOrientationLandscapeLeft || orientation == UIInterfaceOrientationLandscapeRight) { 
     UICollectionViewFlowLayout *flow = (UICollectionViewFlowLayout*)contactList.collectionViewLayout; 
     flow.sectionInset = UIEdgeInsetsMake(48, 64, 48, 0); 
     flow.minimumLineSpacing = 64; 
    } 
} 

to działa perfekcyjnie, ale też chcą zmienić rozmiar (w krajobrazie Mam 2 * 3 siatkę za stronę a w portretie to siatka 3 * 2). Próbowałem ustawić rozmiar w następujący sposób:

CGRect frame = [contactList frame]; 
frame.size.width = 960; 
[contactList setFrame:frame]; 

Ale to się nie zaktualizuje. Nie ma błędu, ale widok nie jest aktualizowany. Po prostu pozostaje w tym samym rozmiarze co poprzednio. Co muszę zrobić, aby zaktualizować widok?

+0

Czy możesz spróbować użyć 'self.contactList'? – Amar

+0

@amar To wciąż nie aktualizuje. – Kevin

+0

Czy próbowałeś automatycznie ustawiać rozmiar za pomocą sprężyn-rozpórek/autolayout? –

Odpowiedz

-1

Kiedy modyfikujesz ramkę contactList? W czasie inicjalizacji VC, wyloty są zerowe. Twój kontroler widoku otrzymuje wywołanie ViewDidLoad po podłączeniu gniazd.

Podejrzewam, że contactList jest wciąż zerowy, gdy wykonywany jest kod zmiany rozmiaru. Przenieś wykonanie tego kodu do metody ViewDidLoad, a uzyskasz dostęp do prawdziwej oferty.

można łatwo przetestować tę teorię poprzez dodanie następujących gdzie zmiany rozmiaru ramy:

NSLog(@"contactList is: %@",contactList.description); 
-1

myślę spróbować zrobić [self.yourcontrollerview reloaddata]

podczas modyfikowania ramkę ..

0

W mojej aplikacji zawsze używam tego:

[self.contactList performUpdates:^{ 
    CGRect frame = [contactList frame]; 
    frame.size.width = 960; 
    [contactList setFrame:frame]; 

    [self.contactList.collectionViewLayout invalidateLayout]; 
} completion:nil]; 

Powinno to ustawić ramkę i zaktualizować układ.