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

时间:2013-08-21 12:59:40

标签: ios objective-c uicollectionview

我在界面构建器中创建了一个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];

但它不会更新。没有错误,但视图没有更新。它只是保持与以前相同的大小。我该怎么做才能更新视图?

3 个答案:

答案 0 :(得分:0)

在我的应用程序中,我总是使用它:

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

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

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

答案 1 :(得分:-1)

您何时修改contactList的框架?在VC初始化时,出口是零。在连接插座后,您的视图控制器会收到ViewDidLoad电话。

我怀疑在执行调整大小代码时contactList仍为零。将该代码的执行移至ViewDidLoad方法,您将能够访问真实交易。

您可以通过将以下内容添加到调整框架大小的位置来轻松测试此理论:

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

答案 2 :(得分:-1)

我想你会尝试做 [self.yourcontrollerview reloaddata]

修改框架时..