it-swarm.dev

UIImageView التعميم في UITableView دون ضرب الأداء؟

لدي 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;

لدي الآن مساحة تبلغ 50 × 50 مترًا بحدود رمادية باهتة ، لكنني أرغب في جعلها دائرية بدلاً من المربعة. يستخدم التطبيق Hemoglobe صورًا دائرية في طرق عرض الجدول ، وهذا هو التأثير الذي أود تحقيقه. ومع ذلك ، لا أرغب في استخدام cornerRadius ، حيث إن هذا يحط من تمرير FPS الخاص بي.

إليك Hemoglobe يعرض التعميم UIImageViews:

enter image description here

هل هناك أي طريقة للحصول على هذا التأثير؟ شكر.

78
swiftcode

ما عليك سوى تعيين cornerRadius على نصف العرض أو الارتفاع (على افتراض أن مربع العرض الخاص بك هو مربع).

على سبيل المثال ، إذا كان عرض وطريقة عرض الكائن الخاصين هما 50:

itemImageView.layer.cornerRadius = 25;

تحديث - كما يشير المستخدم atulkhatri ، لن ينجح ذلك إذا لم تقم بإضافة:

itemImageView.layer.masksToBounds = YES;
135
tagabek

لإضافة الحدود

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/

37
yazh

استخدم هذا الكود .. سيكون هذا مفيدًا ..

    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();

انه يعمل بشكل جيد بالنسبة لي. :)

14
shivam

إليك طريقة أكثر حداثة في Swift باستخدام IBDesignable و IBInspectable إلى فئة فرعية UIImageView

@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()
    }
}
10
Antzi

نعم ، من الممكن إعطاء layer.cornerRadius (تحتاج إلى إضافة #import <QuartzCore/QuartzCore.h>)
لإنشاء أي عنصر تحكم دائري ، ولكن في حالتك بدلاً من تعيين layer من UIImageView ، إنها أفضل طريقة لإنشاء صورتك على شكل دائري وإضافتها على UIImageView والتي لها backGroundColor هي ClearColor.

راجع أيضًا هذا المصدر الثاني للشفرة.

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

و

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

قد يكون هذا مفيدًا في حالتك:

7
iPatel

قم بتعيين ارتفاع وعرض UIImageView ليكون هو نفسه على سبيل المثال :Height=60 & Width = 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;
3
Amritansh Upadhyay

إذا كنت تستخدم بعض عمليات التحرير التلقائي وارتفاع الخلايا المختلفة ، فمن الأفضل أن تفعل ذلك بهذه الطريقة:

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

يمكنني استخدام فئة "صورة مستديرة"

يرسم هذا الفصل أيضًا حدًا اختياريًا حول الدائرة. غالبًا ما توجد حدود حول الصور المدورة.

إنها ليست فئة فرعية UIImageView لأن UIImageView لديها آلية التقديم الخاصة بها ، ولا تستدعي طريقة drawRect ..

جهة تعامل :

#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
Moose

حل قابل للاستخدام في Swift باستخدام extension:

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

الاستعمال:

self.venueImageView.circleMe()
1
Hossam Ghareeb

إذا قمت بعرض الصور على لون خلفية صلب ، فقد يكون الحل السهل هو استخدام صورة تراكب مع دائرة شفافة في المنتصف.

وبهذه الطريقة لا يزال بإمكانك استخدام الصور المربعة وإضافة صورة الدائرة فوقها للحصول على التأثير الدائري.

إذا لم تكن بحاجة إلى التعامل مع صورك أو إظهارها بلون الخلفية المعقدة ، فقد يكون هذا حلًا بسيطًا بدون أي نجاح في الأداء.

0
Eyal

إنشاء طريقة عرض صورة دائرية وسهلة للغاية من خلال الرابط SO أدناه ، ما عليك سوى استخدام خلايا مخصصة لعرض الجدول بدلاً من تخصيص كل شيء في طريقة cellForRowAtIndexPath الخاصة بك.

كيفية جعل زر جولة مع خلفية الصورة في IPhone؟

يمنحك الرابط أعلاه مثالاً على الأزرار ، استخدمه فقط في عرض صورك.

0
Saify

في Swift ، داخل طريقة 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
lifeisfoo

في 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
Aqib Mumtaz