प्रदर्शन हिट के बिना 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, क्योंकि यह मेरी स्क्रॉलिंग एफपीएस को कम करता है।

यहाँ Hemoglobeपरिपत्र दिखाया जा रहा है UIImageViews:

यहां छवि विवरण दर्ज करें

क्या यह प्रभाव प्राप्त करने का कोई तरीका है? धन्यवाद।


1
cornerRadius प्रदर्शन, masksToBounds / clipsToBounds प्रभावित कर रहा है नहीं समस्या है
Calin चिटु

जवाबों:


141

बस cornerRadiusचौड़ाई या ऊँचाई के आधे भाग पर सेट करें (यह मानते हुए कि आपकी वस्तु का आकार चौकोर है)।

उदाहरण के लिए, यदि आपके ऑब्जेक्ट की चौड़ाई और ऊंचाई दोनों 50 हैं:

itemImageView.layer.cornerRadius = 25;

अद्यतन - जैसा कि उपयोगकर्ता atulkhatri बताते हैं, यदि आप नहीं जोड़ते हैं तो यह काम नहीं करेगा:

itemImageView.layer.masksToBounds = YES;

30
यह सबसे अच्छा जवाब क्यों हो सकता है? खैर, मुझे ऐसा नहीं लगता। कोनेरेडियस का उपयोग स्क्रॉल दृश्य में खराब प्रदर्शन का कारण बनता है, विशेष रूप से iPhone4 उपकरणों में।
डैनी जू

11
मुझे यह पसंद आया कि 'कोने को चौड़ाई या ऊँचाई के आधे हिस्से पर सेट करें' लेकिन सिर्फ 'itemImageView.layer.masksToBounds = YES' जोड़ना न भूलें; वरना यह काम नहीं करेगा।
अतुलखत्री

जिस तरह से डैनी जू ने टिप्पणी की, उससे टेबलव्यू स्क्रॉलिंग के प्रदर्शन में कमी आएगी, इसलिए टेबलव्यू कोशिकाओं से बचा जाना चाहिए।
atulkhatri

4
यह आपके टेबलव्यू स्क्रॉलिंग प्रदर्शन समस्या को ठीक करना चाहिए। self.imageView.layer.shouldRasterize = YES; self.imageView.layer.rasterizationScale = [UIScreen mainScreen] .scale;
हिशबॉय

Swift3 के लिए: itemImageView.layer.masksToBounds = true;
लोआस तालाग्रैंड

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

यह मेरे लिए ठीक काम करता है। :)


इस कोड का उपयोग करके वास्तव में बहुत सरल है !! धन्यवाद @ शिवम
आईओएस - रिएक्टनेटिव

10

यहां UIImageView को उप-वर्ग में IBDesignable और IBInspectable का उपयोग करके स्विफ्ट में अद्यतित विधि है।

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

मुझे इसके लिए काम करने के लिए निम्नलिखित कोड जोड़ना पड़ा (एक टेबल व्यू सेल के अंदर): ओवरराइड फंक लेआउटसुब्यू () {makeRound ()}
हर्बर्ट

1
+ 1 @ हेरबर्ट के लिए। यह पूरी तरह से मेरे लिए काम करता है जब मैं
लेआउट को

धन्यवाद!! मैंने आखिरकार ऐसा किया (उपवर्ग, लेकिन ऑब्जेक्टिव-सी में) कुछ सर्कुलर UIImageView को हैंडल करने के लिए जो सिर्फ STAY ROUND नहीं होगा।
जॉन स्टीवर्ट

7

हां, किसी भी नियंत्रण को परिपत्र बनाने के लिए layer.cornerRadius (जोड़ने की आवश्यकता #import <QuartzCore/QuartzCore.h>) देना संभव है,
लेकिन आपके मामले में इसके सेट layerके बजाय UIImageViewसर्कुलर के रूप में अपनी छवि बनाने का सबसे अच्छा तरीका है और इसे उस पर जोड़ें UIImageViewजो कि backGroundColorहै ClearColor

कोड के इस दो स्रोत को भी देखें।

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

तथा

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

यह आपके मामले में मददगार हो सकता है:


4
अंत में, मुझे लगता है कि @iPatel केवल वही है जो यहां प्रदर्शन के बारे में परवाह करता है। यदि आप स्क्रॉल करते समय उच्च प्रदर्शन चाहते हैं, तो कॉर्नरियस से सावधान रहें।
डैनी जू

मैं थोड़ा उलझन में हूँ ... आपने सर्कल व्यू प्रोजेक्ट लिंक क्यों पोस्ट किया? इसका सवाल से कोई लेना-देना नहीं है, न ही आपने जो जवाब दिया है।
user717452

@iPatel - अद्यतन: दूसरा लिंक लेखक द्वारा हटा दिया गया है और अब डाउनलोड नहीं किया जा सकता है।
त्रवदेसन

3

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;

2

यदि कुछ ऑटोलैयूट और अलग-अलग सेल हाइट्स का उपयोग करते हैं, तो यू इस तरह से बेहतर करते हैं:

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

1

मैं एक गोल छवि दृश्य वर्ग का उपयोग करता हूं ... इसलिए मैं UIImageView के बजाय इसका उपयोग करता हूं, और कुछ भी नहीं है ...

यह वर्ग सर्कल के चारों ओर एक वैकल्पिक सीमा भी खींचता है। गोल चित्रों के आसपास अक्सर एक सीमा होती है।

यह UIImageView उपवर्ग नहीं है क्योंकि 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ऑब्जेक्ट के लिए एक्सटेंशन को सामान्य बनाता है ।
स्विफ्टकोड

UIImageViewपहले से ही फैली हुई है UIView। कुछ मामलों में आपको कुछ को घेरना पड़ सकता है UIViews, इसलिए यह तरीका सभी के लिए काम करेगा।
होसाम घरीब

0

नीचे दिए गए SO लिंक से सर्कुलर इमेज व्यू और थॉट्स बनाना काफी आसान है, बस अपने सेल व्यू में अपने सेलफोररॉवएटइंडेक्सपैथ पद्धति में हर चीज को आवंटित करने के बजाय कस्टम सेल हैं।

IPhone में छवि पृष्ठभूमि के साथ बटन गोल कैसे करें?

उपरोक्त लिंक आपको बटन के लिए उदाहरण देता है बस इसे अपने छवि विचारों के लिए उपयोग करें।


0

यदि आप एक ठोस पृष्ठभूमि के रंग पर छवियों को दिखा रहे हैं, तो एक आसान समाधान बीच में एक पारदर्शी सर्कल के साथ एक ओवरले छवि का उपयोग कर सकता है।

इस तरह से आप अभी भी वर्ग छवियों का उपयोग कर सकते हैं और परिपत्र प्रभाव प्राप्त करने के लिए उनके ऊपर सर्कल छवि जोड़ सकते हैं।

यदि आपको अपनी छवियों में हेरफेर करने या उन्हें एक जटिल पृष्ठभूमि के रंग पर दिखाने की आवश्यकता नहीं है, तो यह बिना किसी प्रदर्शन हिट के एक सरल समाधान हो सकता है।


नहीं, मैं नहीं। यह सिर्फ सरल भार है, कैश स्वचालित रूप से (चुकता थंबनेल), और दिखाओ।
स्विफ्टकोड

यह वास्तव में वर्क-आउट है। मैंने पहले भी इस मुश्किल तरीके का इस्तेमाल किया था। लेकिन यह अब मेरे नए संस्करण ऐप के लिए उपयुक्त नहीं है।
डैनी जू

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

स्विफ्ट में इस एक्सटेंशन को 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

परिपत्र चित्र के लिए, नीचे दिए गए कोड का उपयोग करें।

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

अपने UIView के व्यूडायआउटआउट साक्षात्कार विधि में कोनेरेडियस को बदलना न भूलें।

उदाहरण:

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    self.imageView.layer.cornerRadius = self.imageView.frame.size.width / 2;
    self.imageView.clipsToBounds = true
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.