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];

しかし、それは更新されません。エラーはありませんが、ビューが更新されていません。以前と同じサイズのままです。ビューを更新するにはどうすればよいですか?

4

3 に答える 3

0

私のアプリでは、常にこれを使用しています:

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

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

これにより、フレームが設定され、レイアウトが更新されます。

于 2014-06-06T07:30:21.957 に答える
-1

私はあなたがやろうとしていると思います [self.yourcontrollerview reloaddata]

フレームを変更すると..

于 2013-08-22T09:03:17.877 に答える
-1

のフレームを変更するのはcontactListいつですか? VC の初期化時には、アウトレットは nil です。ViewDidLoadアウトレットが接続された後、View Controller が呼び出されます。

contactListサイズ変更コードが実行されているときは、まだ nilであると思われます。そのコードの実行をViewDidLoadメソッドに移動すると、実際の取引にアクセスできるようになります。

フレームのサイズを変更する場所に次を追加することで、この理論を簡単にテストできます。

NSLog(@"contactList is: %@",contactList.description);
于 2013-08-21T13:22:56.967 に答える