UIImageViewでのコーナー半径の設定が機能しない


129

私は少し途方に暮れています。アプリの複数の要素の角を丸めるために、UIViewのレイヤープロパティを使用しました。ただし、この1つのUIImageViewは単に準拠していません。何が欠けているかわからない。

UIImageView(previewImageと呼ばれます)は、テーブルビューセルに含まれています。(セル自体とセルを作成するコントローラー内の)cornerRadiusプロパティの複数の場所を無効に設定してみました。

static NSString *CellIdentifier = @"MyTableViewCell";

MyTableViewCell *cell = (MyTableViewCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:CellIdentifier owner:self options:nil];
    cell = [topLevelObjects objectAtIndex:0];
    cell.previewImage.layer.cornerRadius = 20; //Made it 20 to make sure it's obvious.
}

セルがロードされる方法について何か不足していますか?

回答:


377

レイヤーのmasksToBoundsプロパティをYES次のように設定する必要があります。

cell.previewImage.layer.masksToBounds = YES;

これは、UIImageViewコントロールがUIImageオブジェクトを保持するための疑似サブビューを作成するためです。


19
ビューもラスタライズしない限り(view.layer.shouldRasterize = YES)、すべてのフレームですべてのピクセルの再マスクが必要になります。
jjxtra 2013

@jjxtraなので、設定した方がいいshouldRasterize = falseですか?
user924

shouldRasterizeがfalseの場合、マスク作成のオーバーヘッドをフレームごとに支払います。shouldRasterizeがtrueで、レイヤーがフレームごとに変更される場合、マスクのオーバーヘッドとラスタライズのオーバーヘッドを支払います。理想的なケースは、shouldRasterize = trueの静的な(あまり変更されない)レイヤーです。
jjxtra

30

それも注目に値する

  1. clipsToBounds / masksToBoundsでaspectFit および cornerRadiusを使用している場合、角が丸くなりません。

つまり、これがあれば

theImageView.contentMode = .scaleAspectFit

そして

   theImageView.layer.cornerRadius = (theImageView.frame.size.height)/2
    theImageView.clipsToBounds = true

または

theImageView.layer.masksToBounds = true

それは動作しません。あなたはaspectFitコードを取り除く必要があります

//theImageView.contentMode = .scaleAspectFit
  1. 画像ビュー幅と高さが同じであることを確認してください

つまり、AspectFitを使用する場合は、アスペクト比を1:1に設定します
djdance




2

以下のコードを試してください

cell.previewImage.layer.cornerRadius = 20;
cell.previewImage.clipsToBounds = YES;

2

このコードを試してください:-

self.imgaviewName.clipsToBounds = true
self.imageviewName.layer.cornerRadius = 10

コードのみの回答はお勧めしません。編集をクリックして、コードが質問にどのように対処するかを要約するいくつかの単語を追加するか、おそらくあなたの回答が以前の回答とどのように異なるかを説明してください。ありがとう
Nick

1

以下のために画像が非常に大きい場合、ハードウェアに依存して、適用されません。imageView.contentMode = .scaleAspectFillcornerRadius

サイズ変更されたパノラマ画像を使用したいくつかのテスト:

  • iPhone X、画像サイズ5000x1107:🚫4000x886:✅
  • iPhone 6s Plus、画像サイズ10000x2215:🚫5000x1107:✅
  • iPhone 6s、画像サイズ10000x2215:🚫5000x1107:✅

imageViewの寸法は160x100です。興味深いことに、新しいハードウェアは必ずしも機能が優れているとは限りません。

テスト結果を追加して、この投稿を自由に編集してください!


0
-(void) viewDidAppear:(BOOL)animated{
       [super viewDidAppear:animated];
       [self setMaskTo:viewDistance 
             byRoundingCorners:UIRectCornerBottomLeft | UIRectCornerBottomRight];
           }

- (void)setMaskTo:(UIView*)view byRoundingCorners:(UIRectCorner)corners
     {
      UIBezierPath *rounded = [UIBezierPath 
                bezierPathWithRoundedRect:view.bounds
                                              byRoundingCorners:corners

                     cornerRadii:CGSizeMake(20.0, 20.0)];

          CAShapeLayer *shape = [[CAShapeLayer alloc] init];
          shape.frame = self.view.bounds;
         [shape setPath:rounded.CGPath];
          view.layer.mask = shape;
       }

0

Swift 4.2の回答:

コーナー半径を機能させるには、画像をaに追加してUIViewから、画像のmasksToBoundsプロパティをtrue次のように設定する必要があります。

planeImage.layer.masksToBounds = true
planeImage.layer.cornerRadius = 20

注:20を目的の値に置き換えます cornerRadius


0

以前の回答から何も機能していませんか?

UIImageViewのサイズが画像サイズより大きい場合があります。コーナー半径は適切に設定できますが、その場合は表示されません。

コードによるUIImageViewサイズのクイックチェック:(またはXCodeの「View UI Hierarchy」ツールを使用できます)

self.imageView.backgroundColor = [UIColor greenColor]; 

このシナリオでは、UIImageViewが画像と同じアスペクト比であることを確認する必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.