IPhoneアプリで、コレクションビューに画像を表示しています。 URLから画像を取得し、URLで画像サイズも取得します。例:-風景とポートレートの2種類の画像があるとしましょう。
CollectionViewセルのサイズをカスタマイズする方法は?
このUICollectionViewDelegateFlowLayout
メソッドを使用します
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath;
1)複数のレイアウトオブジェクトを維持および交換できますが、もっと簡単な方法があります。 UICollectionViewControllerサブクラスに次を追加し、必要に応じてサイズを調整します。
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath
{
// Adjust cell size for orientation
if (UIDeviceOrientationIsLandscape([[UIApplication sharedApplication] statusBarOrientation])) {
return CGSizeMake(170.f, 170.f);
}
return CGSizeMake(192.f, 192.f);
}
- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
{
[self.collectionView performBatchUpdates:nil completion:nil];
}
-performBatchUpdates:completion:
を呼び出すと、レイアウトが無効になり、アニメーションでセルのサイズが変更されます(実行する追加の調整がない場合は、両方のブロックパラメーターにnilを渡すことができます)。
2)-collectionView:layout:sizeForItemAtIndexPath
でアイテムのサイズをハードコーディングする代わりに、collectionViewの境界の高さまたは幅を画面に収めたいセルの数で割るだけです。 UICollectionView
が水平にスクロールする場合は高さを使用し、垂直にスクロールする場合は幅を使用します。
これは私がやったことです。まず、画面のサイズに基づいてセルのサイズを設定します(各行で最適な数の画像を取得できるようにするため)。目的に合わせて番号を変更することもできます。
-(CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath{
CGFloat widthOfCell =(self.view.frame.size.width-30)/2;
CGFloat heightOfCell =widthOfCell * 1.33;
CGSize returnValue = CGSizeMake(widthOfCell, heightOfCell);
returnValue.height += 5;
returnValue.width += 5;
return returnValue;
}
次に、画像操作方法を使用して風景またはポートレートの状態を判断し、(私のアプリの場合)すべての画像をポートレートにすることにしました。
if (sourceImage.size.width>sourceImage.size.height) {
sourceImage = [[UIImage alloc] initWithCGImage: sourceImage.CGImage
scale: 1.0
orientation: UIImageOrientationRight];
}
逆にしたい場合は、>
with <
警告:画像が左または右を指している場合、回転方法は考慮されません。言い換えれば、画像が上下逆になっている場合、私のコードはそれを認識できません。他の誰かがあなたを助けてくれることを願っています、そして私は軌道に乗っていないことを望みます! :)
Swiftビューコントローラーにフローレイアウトを拡張します。ビューコントローラーに画像名を保持するセルメイク変数に動的画像を表示する必要がある場合、これを使用します:
let imageData = ["image1","image2","image3","image4"]
extension yourViewController: UICollectionViewDataSource,UICollectionViewDelegate,UICollectionViewDelegateFlowLayout{
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
let photo = UIImage(named: imageData[indexPath.row])
return CGSize(width: (photo?.size.width)!, height: (photo?.size.height)!)
}
}