การตั้งค่ารัศมีมุมบน UIImageView ไม่ทำงาน


129

ฉันกำลังจะสูญเสีย ฉันใช้คุณสมบัติเลเยอร์ของ UIView เพื่อปัดมุมขององค์ประกอบหลายอย่างในแอปของฉัน อย่างไรก็ตาม UIImageView อันนี้ไม่ปฏิบัติตาม ไม่แน่ใจว่าสิ่งที่ฉันหายไป

UIImageView (เรียกว่า previewImage) มีอยู่ใน Table View Cell ฉันได้ลองตั้งค่าคุณสมบัติ 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
นอกจากว่าคุณจะเปลี่ยนมุมมองเป็นแบบ rasterize (view.layer.shouldRasterize = YES) ทุกเฟรมจะต้องทำการปิดบังพิกเซลทั้งหมด
jjxtra

@jjxtra ดังนั้นมันจะดีกว่าที่จะตั้งshouldRasterize = false?
924

หากควรเร่งให้เป็นเท็จคุณต้องจ่ายค่าใช้จ่ายในการสร้างหน้ากากทุก ๆ เฟรม ถ้า shouldRasterize เป็นจริงและเลเยอร์ของคุณเปลี่ยนทุกเฟรมคุณจะต้องจ่ายหน้ากากเหนือศีรษะและค่าใช้จ่ายแรสเตอร์ กรณีในอุดมคติคือเลเยอร์แบบสแตติก (ไม่เปลี่ยนแปลงบ่อย) พร้อมกับ shouldRasterize = true
jjxtra

30

ยังน่าสังเกตว่า

  1. หากคุณกำลังใช้ aspectFit และ cornerRadius กับ clipsToBounds / masksToBounds คุณจะไม่ได้รับมุมโค้งมน

เช่นถ้าคุณมีสิ่งนี้

theImageView.contentMode = .scaleAspectFit

และ

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

หรือ

theImageView.layer.masksToBounds = true

มันจะไม่ทำงาน คุณจะต้องกำจัดโค้ดของ widthFit

//theImageView.contentMode = .scaleAspectFit
  1. ตรวจสอบให้แน่ใจว่าความกว้างและความสูงของมุมมองภาพเหมือนกัน

กล่าวโดยย่อ: กำหนดอัตราส่วนภาพ 1: 1 หากคุณต้องการใช้ AspectFit
djdance

22

สิ่งนี้น่าจะใช้ได้

cell.previewImage.clipsToBounds = YES;

cell.previewImage.layer.cornerRadius = 20;

3
ไม่แน่ใจว่าclipsToBoundsเป็นวิธีการในชั้นเรียนในภายหลัง เชื่อว่ามันmasksToBoundsเป็นข้างต้น
Alfie Hanssen

4
@AlfieHanssen layer มี masksToBounds :, views มีคลิป ToBounds:
Kevin


4

ในเครื่องมือสร้างส่วนต่อประสาน Xcode การเลือกคุณลักษณะการวาด 'คลิปของผู้ดูย่อย' สำหรับมุมมองพร้อมกับการตั้งค่ารัศมีมุมในรหัสcell.previewImage.layer.cornerRadius = 20;ทำให้ฉันทำงานได้!

ดูตัวเลือก 'คลิปบทสัมภาษณ์' ใน IB



2

ลองรหัสนี้: -

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

คำตอบแบบรหัสเท่านั้นจะหมดกำลังใจ โปรดคลิกที่แก้ไขและเพิ่มคำบางคำที่สรุปว่ารหัสของคุณตอบคำถามอย่างไรหรืออาจอธิบายว่าคำตอบของคุณแตกต่างจากคำตอบ / คำตอบก่อนหน้านี้อย่างไร ขอบคุณ
นิค

1

สำหรับimageView.contentMode = .scaleAspectFillการที่cornerRadiusไม่ได้ใช้ถ้าภาพมีขนาดใหญ่มากขึ้นอยู่กับฮาร์ดแวร์

การทดสอบบางอย่างด้วยภาพพาโนรามาที่ปรับขนาดแล้ว:

  • iPhone X ขนาดภาพ 5000x1107: 🚫 4000x886: ✅
  • iPhone 6s Plus ขนาดภาพ 10,000x2215: 🚫 5,000x1107: ✅
  • iPhone 6s ขนาดภาพ 10000x2215: 🚫 5,000x1107: ✅

ขนาดภาพที่ 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 อย่างรวดเร็วด้วยรหัส: (หรือสามารถใช้เครื่องมือ "ดู UI ลำดับชั้น" ใน XCode)

self.imageView.backgroundColor = [UIColor greenColor]; 

ในสถานการณ์สมมตินี้คุณควรมั่นใจว่า UIImageView มีอัตราส่วนกว้างยาวเท่ากับรูปภาพ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.