パフォーマンスに影響を与えずにUITableViewの循環UIImageView?


82

私が持っているUIImageView私のそれぞれにUITableView、そのディスプレイの遠隔画像(使用して、細胞SDWebImage)。私はいくつかやったQuartzCoreような、画像表示にレイヤースタイルを:

UIImageView *itemImageView = (UIImageView *)[cell viewWithTag:100];
    itemImageView.layer.borderWidth = 1.0f;
    itemImageView.layer.borderColor = [UIColor concreteColor].CGColor;
    itemImageView.layer.masksToBounds = NO;
    itemImageView.clipsToBounds = YES;

これで、50x50の正方形にかすかな灰色の境界線ができましたが、正方形ではなく円形にしたいのです。このアプリHemoglobeはテーブルビューで円形の画像を使用しており、それが私が達成したい効果です。ただし、cornerRadiusスクロールFPSが低下するため、使用したくありません。

これがHemoglobe円形を示していUIImageViewsます:

ここに画像の説明を入力してください

この効果を得る方法はありますか?ありがとう。


1
cornerRadiusがパフォーマンスに影響を与えているのではなく、masksToBounds / clipsToBoundsが問題です
Calin Chitu 2014

回答:


141

cornerRadius幅または高さの半分に設定するだけです(オブジェクトのビューが正方形であると仮定します)。

たとえば、オブジェクトのビューの幅と高さが両方とも50の場合:

itemImageView.layer.cornerRadius = 25;

更新-ユーザーatulkhatriが指摘しているように、以下を追加しないと機能しません。

itemImageView.layer.masksToBounds = YES;

30
なぜこれが最良の答えでしょうか?まあ、そうは思いません。cornerRadiusを使用すると、特にiPhone4デバイスで、スクロールビューのパフォーマンスが低下します。
Danny Xu

11
「cornerRadiusを幅または高さの半分に設定する」というポイントが気に入りましたが、「itemImageView.layer.masksToBounds = YES;」を追加することを忘れないでください。そうでなければ、それは機能しません。
atulkhatri 2014年

ちなみに、Danny Xuがコメントしたように、テーブルビューのスクロールパフォーマンスが低下するため、テーブルビューセルでは避ける必要があります。
atulkhatri 2014年

4
これにより、テーブルビューのスクロールパフォーマンスの問題が修正されます。self.imageView.layer.shouldRasterize = YES; self.imageView.layer.rasterizationScale = [UIScreen mainScreen] .scale;
hishboy 2014年

Swift3の場合:itemImageView.layer.masksToBounds = true;
ロイスタラグランド2017年

38

境界線を追加するには

self.ImageView.layer.borderWidth = 3.0f;

self.ImageView.layer.borderColor = [UIColor whiteColor].CGColor;

円形の場合

self.ImageView.layer.cornerRadius = self.ImageView.frame.size.width / 2;
self.ImageView.clipsToBounds = YES;

このリンクを参照してください

http://www.appcoda.com/ios-programming-circular-image-calayer/


14

このコードを使用してください。これは役に立ちます。

    UIImage* image = ...;
    UIGraphicsBeginImageContextWithOptions(imageView.bounds.size, NO, 1.0);
    // Add a clip before drawing anything, in the shape of an rounded rect
    [[UIBezierPath bezierPathWithRoundedRect:imageView.bounds
                                cornerRadius:50.0] addClip];
    // Draw your image
    [image drawInRect:imageView.bounds];

    // Get the image, here setting the UIImageView image
    imageView.image = UIGraphicsGetImageFromCurrentImageContext();

    // Lets forget about that we were drawing
    UIGraphicsEndImageContext();

それは私にとってはうまくいきます。:)


このコードを使用すると、非常に簡単です。おかげ@Shivam
AnilkumarのiOS - ReactNative

10

これは、IBDesignableとIBInspectableを使用してUIImageViewをサブクラス化するSwiftの最新のメソッドです。

@IBDesignable class RoundableUIImageView: UIImageView {
    private var _round = false
    @IBInspectable var round: Bool {
        set {
            _round = newValue
            makeRound()
        }
        get {
            return self._round
        }
    }
    override internal var frame: CGRect {
        set {
            super.frame = newValue
            makeRound()
        }
        get {
            return super.frame
        }

    }

    private func makeRound() {
        if self.round == true {
            self.clipsToBounds = true
            self.layer.cornerRadius = (self.frame.width + self.frame.height) / 4
        } else {
            self.layer.cornerRadius = 0
        }
    }

    override func layoutSubviews() {
            makeRound()
    }
}

私はそれが(テーブルビューセル内で)私のために動作させるために、次のコードを追加する必要がありました:オーバーライドFUNCのlayoutSubviewsを(){makeRound()}
ハーバート

1
+ @ herbertの場合は1。クラス内のlayoutSubviewsをオーバーライドすると、完全に機能しました。コードを更新する必要があります
Abdoelrhman 2016年

ありがとうございました!!私はついにこれを実行し(サブクラスですが、Objective-Cで)、ラウンドを維持できない循環UIImageViewを処理しました。
ジョンスチュワート

7

はい、与えることができるlayer.cornerRadius (追加する必要が #import <QuartzCore/QuartzCore.h>
円形任意のコントロールを作成するためではなく、あなたのケースではなく、一連layerUIImageViewそれ円形としてのあなたのイメージを作成し、上でそれを追加するための最良の方法であるUIImageView持っているbackGroundColorですClearColor

この2つのコードソースも参照してください。

https://www.cocoacontrols.com/controls/circleview

そして

https://www.cocoacontrols.com/controls/mhlazytableimages

これはあなたの場合に役立つかもしれません:


4
最後に、ここでのパフォーマンスを気にするのは@iPatelだけだと思います。スクロール中に高性能が必要な場合は、cornerRadiusに注意してください。
Danny Xu

少し混乱しています...なぜサークルビュープロジェクトのリンクを投稿したのですか?それは質問やあなたが与えた答えとは何の関係もありません。
user717452 2014年

@ iPatel-更新:2番目のリンクは作成者によって非推奨になり、ダウンロードできなくなりました。
trdavidson 2015年

3

UIImageViewの高さと幅を同じに設定します(例:Height=60Width = 60)。そうすると、cornerRadius正確に半分になります。私の場合は30のままにしました。これでうまくいきました。

 self.imageView.layer.cornerRadius = 30;
 self.imageView.layer.borderWidth = 3;
 self.imageView.layer.borderColor = [UIColor whiteColor].CGColor;
 self.imageView.layer.masksToBounds = YES;

2

いくつかの自動レイアウトと異なるセルの高さを使用する場合は、次のようにすることをお勧めします。

   override func layoutSubviews() {
        super.layoutSubviews()
        logo.layer.cornerRadius = logo.frame.size.height / 2;
        logo.clipsToBounds      = true;
    }

1

Round Image Viewクラスを使用しています…したがって、UIImageViewの代わりにそれを使用するだけで、微調整する必要はありません…

このクラスは、円の周りにオプションの境界線も描画します。多くの場合、丸みを帯びた画像の周囲に境界線があります。

UIImageViewには独自のレンダリングメカニズムがあり、drawRectメソッドを呼び出さないため、UIImageViewサブクラスではありません。

インターフェース :

#import <UIKit/UIKit.h>

@interface MFRoundImageView : UIView

@property(nonatomic,strong) UIImage* image;

@property(nonatomic,strong) UIColor* strokeColor;
@property(nonatomic,assign) CGFloat strokeWidth;

@end

実装:

#import "MFRoundImageView.h"


@implementation MFRoundImageView

-(void)setImage:(UIImage *)image
{
    _image = image;
    [self setNeedsDisplay];
}

-(void)setStrokeColor:(UIColor *)strokeColor
{
    _strokeColor = strokeColor;
    [self setNeedsDisplay];
}

-(void)setStrokeWidth:(CGFloat)strokeWidth
{
    _strokeWidth = strokeWidth;
    [self setNeedsDisplay];
}

- (void)drawRect:(CGRect)rect {
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    CGPathRef path = CGPathCreateWithEllipseInRect(self.bounds, NULL);
    CGContextAddPath(ctx, path);
    CGContextClip(ctx);
    [self.image drawInRect:rect];

    if ( ( _strokeWidth > 0.0f ) && _strokeColor ) {
        CGContextSetLineWidth(ctx, _strokeWidth*2); // Half border is clipped
        [_strokeColor setStroke];
        CGContextAddPath(ctx, path);
        CGContextStrokePath(ctx);
    }
    CGPathRelease(path);
}

@end

1

使用する際のSwift使用可能なソリューションextension

extension UIView{
  func circleMe(){
      let radius = CGRectGetWidth(self.bounds) / 2
      self.layer.cornerRadius = radius
      self.layer.masksToBounds = true
  }
}

使用法:

self.venueImageView.circleMe()

拡張機能をに適用する方が良いのではないでしょうUIImageViewか?このコードは機能しますが、拡張機能をすべてのUIViewオブジェクトにジェネリックにします。
swiftcode 2016年

UIImageViewはすでにから拡張されていUIViewます。場合によってはUIViews、いくつかを丸で囲む必要があるため、この方法はすべての場合に機能します。
Hossam Ghareeb 2016年

0

以下のSOリンクを使用すると、円形の画像ビューを簡単に作成できます。cellForRowAtIndexPathメソッドにすべてのものを割り当てるのではなく、テーブルビューにカスタムセルを用意するだけです。

iPhoneで画像の背景でボタンを丸くする方法は?

上記のリンクは、ボタンの例を示しています。画像ビューに使用するだけです。


0

単色の背景色の上に画像を表示する場合、簡単な解決策は、中央に透明な円があるオーバーレイ画像を使用することです。

このようにして、正方形の画像を使用し、その上に円の画像を追加して、円形の効果を得ることができます。

画像を操作したり、複雑な背景色で表示したりする必要がない場合、これはパフォーマンスに影響を与えない単純なソリューションになります。


いいえ、しません。単純なロード、自動キャッシュ(四角いサムネイル)、表示だけです。
swiftcode 2013

それは本当にワークアウトです。私は以前にこのトリッキーな方法を使用しました。しかし、今は私の新しいバージョンのアプリには適していません。
Danny Xu

0

迅速にviewDidLoadメソッド内で、userImageアウトレットを使用して:

self.userImage.layer.borderWidth = 1;
self.userImage.layer.borderColor = UIColor.whiteColor().CGColor;
self.userImage.layer.cornerRadius = self.userImage.frame.size.width / 2;
self.userImage.clipsToBounds = true;

0

Swiftでは、CircularImageViewまたはRoundedImageViewにこの拡張機能を使用します。

extension UIView {

    func circular(borderWidth: CGFloat = 0, borderColor: UIColor = UIColor.whiteColor()) {
        let radius = CGRectGetWidth(self.bounds) / 2
        self.layer.cornerRadius = radius
        self.layer.masksToBounds = true

        self.layer.borderWidth = borderWidth
        self.layer.borderColor = borderColor.CGColor
    }

    func roundedCorner(borderWidth: CGFloat = 0, borderColor: UIColor = UIColor.whiteColor()) {
        let radius = CGRectGetWidth(self.bounds) / 2
        self.layer.cornerRadius = radius / 5
        self.layer.masksToBounds = true

        self.layer.borderWidth = borderWidth
        self.layer.borderColor = borderColor.CGColor
    }

}

使用法:

self.ImageView.circular()
self.ImageView.roundedCorner()

0

円形のimageviewの場合、以下のコードを使用します。

self.imageView.layer.cornerRadius = self.imageView.frame.size.width / 2;
self.imageView.clipsToBounds = true

UIViewのviewDidLayoutSubviewsメソッドのcornerRadiusを変更することを忘れないでください。

例:

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    self.imageView.layer.cornerRadius = self.imageView.frame.size.width / 2;
    self.imageView.clipsToBounds = true
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.