UIImageView पर कॉर्नर रेडियस सेट करना काम नहीं कर रहा है


129

मैं थोड़ा नुकसान में हूं। मैंने अपने ऐप में कई तत्वों के कोनों को गोल करने के लिए UIView की लेयर प्रॉपर्टी का उपयोग किया है। हालाँकि, यह एक UIImageView केवल अनुपालन नहीं कर रहा है। यकीन नहीं हो रहा है कि मैं क्या याद कर रहा हूँ।

UIImageView (जिसे प्रीव्यूमैज कहा जाता है) एक टेबल व्यू सेल में निहित है। मैंने कोनेरेडियस की संपत्ति को कई स्थानों पर स्थापित करने की कोशिश की है (सेल में ही और नियंत्रक में जो सेल बनाता है) कोई फायदा नहीं हुआ।

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

@jjxtra इसलिए इसे सेट करना बेहतर है shouldRasterize = false?
user924

यदि आप को झूठा साबित करना है तो आप मुखौटा निर्माण को हर सीमा पर चुकाते हैं। अगरRasterize सच है और आपकी परत हर फ्रेम को बदलती है, तो आप मास्क ओवरहेड और रैस्टराइज़ेशन ओवरहेड का भुगतान करते हैं। आदर्श मामला एक स्थिर (बहुत बार नहीं बदल रहा) परत है जिसके साथ shouldRasterize = true है।
jjxtra

30

यह भी ध्यान देने योग्य है

  1. यदि आप क्लिपटॉब / मास्क मास्क के साथ एस्पेक्टफिट और कॉर्नररेडियस का उपयोग कर रहे हैं , तो आपको गोल कोने नहीं मिलेंगे।

यानी अगर आपके पास यह है

theImageView.contentMode = .scaleAspectFit

तथा

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

या

theImageView.layer.masksToBounds = true

यह काम नहीं करेगा । आपको पहलू कोड से छुटकारा पाना होगा

//theImageView.contentMode = .scaleAspectFit
  1. सुनिश्चित करें कि छवि दृश्य के लिए चौड़ाई और ऊंचाई समान है

संक्षेप में: सेट पहलू अनुपात 1: 1 यदि आप एस्पेक्टफिट का उपयोग करना चाहते हैं
djdance

22

यह काम करना चाहिए

cell.previewImage.clipsToBounds = YES;

cell.previewImage.layer.cornerRadius = 20;

3
सुनिश्चित नहीं है कि clipsToBoundsबाद के वर्ग पर एक विधि है। मानो masksToBoundsऊपर जैसा है।
अल्फी हंससेन

4
@AlfieHanssen लेयर्स में मास्क होते हैं: दृश्य में क्लिप होते हैंसुविधाएँ:
केविन


4

Xcode इंटरफ़ेस बिल्डर में, कोड में कोने त्रिज्या सेट करने के साथ-साथ दृश्य के लिए 'क्लिप साक्षात्कार' ड्राइंग विशेषता का चयन cell.previewImage.layer.cornerRadius = 20;मेरे लिए काम करता है!

IB में 'क्लिप सबव्यू ’विकल्प देखें



2

इस कोड को आज़माएं: -

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

कोड-केवल उत्तर हतोत्साहित किए जाते हैं। कृपया संपादित करें पर क्लिक करें और कुछ शब्दों को जोड़ते हुए कहें कि आपका कोड प्रश्न को कैसे संबोधित करता है, या शायद समझाएं कि आपका उत्तर पिछले उत्तर / उत्तरों से कैसे भिन्न है। धन्यवाद
निक

1

के लिए करता है, तो छवि बहुत बड़ी है पर लागू नहीं होता, हार्डवेयर पर निर्भर करता है।imageView.contentMode = .scaleAspectFillcornerRadius

आकार के चित्रमाला के साथ कुछ परीक्षण:

  • iPhone X, छवि का आकार 5000x1107: 8 4000x886: 5000
  • iPhone 6s Plus, छवि का आकार 10000x2215: 110 5000x1107: image
  • iPhone 6s, छवि का आकार 10000x2215: 110 5000x1107: size

इमेज व्यू आयाम जहां 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

स्विफ्ट 4.2 उत्तर:

काम करने के लिए कोने की त्रिज्या के लिए, छवि को एक में जोड़ें UIViewऔर फिर आपको छवि की masksToBoundsसंपत्ति सेट करने की आवश्यकता है true:

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

नोट: 20 को वांछित से बदलें cornerRadius


0

पिछले उत्तरों में से कुछ भी काम नहीं कर रहा है?

ऐसा हो सकता है कि UIImageView का आकार छवि के आकार से बड़ा हो। कॉर्नर त्रिज्या को अच्छी तरह से सेट किया जा सकता है लेकिन उस मामले में दिखाई नहीं देता है।

कोड द्वारा UIImageView आकार की त्वरित जांच: (या XCode में "यूआई पदानुक्रम देखें" टूल का उपयोग कर सकते हैं)

self.imageView.backgroundColor = [UIColor greenColor]; 

इस परिदृश्य में आपको आश्वस्त करना चाहिए कि UIImageView में छवि के समान पहलू अनुपात है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.