我该如何以编程方式更改UICollectionView的大小?

5
我在界面构建器中创建了一个UICollectionView。我用以下代码引用它:
@property (strong, nonatomic) IBOutlet UICollectionView *contactList;

在我的.h文件中,使用@synthesize contactList; 在我的.m文件中。我试图使用以下代码在纵向和横向实现稍微不同的布局:

- (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;
    }
}

这段代码运行正常,但我还想改变页面大小(横屏时每页有2*3的网格,在竖屏时是3*2的网格)。我尝试像这样设置大小:
CGRect frame = [contactList frame];
frame.size.width = 960;
[contactList setFrame:frame];

但是它没有更新。没有错误,但视图没有更新。它仍然保持与之前相同的大小。我需要做什么才能更新视图?


你可以尝试使用self.contactList吗? - Amar
@amar 它仍然没有更新。 - Kevin
你尝试过使用Spring-Struts / AutoLayout自动设置大小吗? - Anurag Soni
@AnuragSoni 我在我的应用程序中几乎使用自动布局来完成任何事情,但是我无法正确设置我的集合视图的大小,因为它不应该真正“捕捉”任何东西或与边缘保持一定的距离。 - Kevin
@AnuragSoni 我成功让自动布局做了我想要的事情。我认为这已经足够让我继续前进了,谢谢。 - Kevin
3个回答

0
在我的应用程序中,我总是使用这个:
[self.contactList performUpdates:^{
  CGRect frame = [contactList frame];
  frame.size.width = 960;
  [contactList setFrame:frame];

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

这应该设置您的框架并更新您的布局。


-1
我认为你尝试在修改框架时执行以下代码:[self.yourcontrollerview reloaddata]

-1

你什么时候修改contactList的框架?在视图控制器初始化时,outlets是空的。当outlets连接后,你的视图控制器会收到一个ViewDidLoad的调用。

我怀疑当执行调整大小的代码时,contactList仍然为空。将该代码的执行移到ViewDidLoad方法中,你就能够访问真正的内容了。

你可以通过在调整框架的位置添加以下内容来轻松测试这个理论:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接