19

UICollectionViewCells の角を丸くして影を落としたいのですが、両方ではなくどちらか一方しか持てないように見えるという問題に遭遇しました。

角を丸くするために、セルの初期化で次のコードを使用します。

CALayer *layer = [self layer];
[layer setCornerRadius:4];
[layer setRasterizationScale:[[UIScreen mainScreen] scale]];
[layer setShouldRasterize:YES];

ドロップ シャドウを追加するには、セルの初期化で次のコードを使用します。

CALayer *layer = [self layer];
[layer setMasksToBounds:NO];
[layer setRasterizationScale:[[UIScreen mainScreen] scale]];
[layer setShouldRasterize:YES];
[layer setShadowColor:[[UIColor blackColor] CGColor]];
[layer setShadowOffset:CGSizeMake(0.0f,0.5f)];
[layer setShadowRadius:8.0f];
[layer setShadowOpacity:0.2f];
[layer setShadowPath:[[UIBezierPath bezierPathWithRoundedRect:self.bounds cornerRadius:layer.cornerRadius] CGPath]];

角を丸くしてドロップ シャドウを付けるには、セルの初期化で次のコードを使用します。

CALayer *layer = [self layer];
[layer setMasksToBounds:NO];
[layer setCornerRadius:4];
[layer setRasterizationScale:[[UIScreen mainScreen] scale]];
[layer setShouldRasterize:YES];
[layer setShadowColor:[[UIColor blackColor] CGColor]];
[layer setShadowOffset:CGSizeMake(0.0f,0.5f)];
[layer setShadowRadius:8.0f];
[layer setShadowOpacity:0.2f];
[layer setShadowPath:[[UIBezierPath bezierPathWithRoundedRect:self.bounds cornerRadius:layer.cornerRadius] CGPath]];

ただし、これはドロップ シャドウのみになります。

これはバグですか、それとも何か間違っていますか?

4

5 に答える 5

31

私にとって素晴らしい作品:

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
    {
        ...
        cell.layer.masksToBounds = YES;
        cell.layer.cornerRadius = 6;
        ...
        return cell;
    }
于 2014-11-17T15:39:54.780 に答える
2

同様の問題に遭遇したと思います。私の問題は、サブビューのクリッピングがUICollectionViewCell影と丸い境界線で適切に機能しないことでした。まったく同じコードが、そのビューを (UIViewただし標準のサブクラスとして) UIScrollView.

簡単に言うと、このセットアップをすべて からinitWithCoder取得した後、 から別の場所に移動しました-dequeueReusableCellWithReuseIdentifier:forIndexPath:。私の問題を解決しました。UICollectionViewsある時点で彼らの細胞の層に私が予期しないことをしているように見えますか?

于 2013-08-20T03:46:42.100 に答える