L'impostazione del raggio dell'angolo su UIImageView non funziona


129

Sono un po 'perplesso. Ho usato la proprietà layer di UIView per arrotondare gli angoli di più elementi nella mia app. Tuttavia, questo UIImageView semplicemente non è conforme. Non sono sicuro di cosa mi sto perdendo.

UIImageView (chiamato previewImage) è contenuto in una cella di visualizzazione tabella. Ho provato a impostare la posizione multipla della proprietà cornerRadius (nella cella stessa e nel controller che crea la cella) senza risultati.

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.
}

C'è qualcosa nel modo in cui vengono caricate le celle che mi manca?

Risposte:


377

Devi impostare la masksToBoundsproprietà del layer su YES:

cell.previewImage.layer.masksToBounds = YES;

Questo perché il UIImageViewcontrollo crea una pseudo-sottoview per contenere l' UIImageoggetto.


19
A meno che non si rasterizzi anche la vista (view.layer.shouldRasterize = YES), ogni fotogramma richiederà una ri-maschera di tutti i pixel.
jjxtra,

@jjxtra quindi è meglio impostare shouldRasterize = false?
user924

Se shouldRasterize è falso, paghi ogni overhead della creazione della maschera. Se shouldRasterize è vero e il tuo layer cambia ogni fotogramma, paghi la maschera in testa e la rasterizzazione in testa. Il caso ideale è un livello statico (che non cambia molto spesso) con shouldRasterize = true.
jjxtra,

30

Vale anche la pena notare che

  1. Se stai usando aspectFit AND cornerRadius con clipsToBounds / masksToBounds, non otterrai gli angoli arrotondati.

cioè se hai questo

theImageView.contentMode = .scaleAspectFit

e

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

o

theImageView.layer.masksToBounds = true

Esso non funziona . dovrai sbarazzarti del codice aspectFit

//theImageView.contentMode = .scaleAspectFit
  1. Assicurarsi che la larghezza e l'altezza per la vista immagine siano uguali

In breve: impostare le proporzioni 1: 1 se si desidera utilizzare AspectFit
djdance l'

22

Questo dovrebbe funzionare

cell.previewImage.clipsToBounds = YES;

cell.previewImage.layer.cornerRadius = 20;

3
Non sono sicuro che clipsToBoundssia un metodo nella classe successiva. Credi sia masksToBoundscome sopra.
Alfie Hanssen,

4
I livelli di @AlfieHanssen hanno maschereToBounds: le visualizzazioni hanno clipToBounds:
Kevin

11

Credo che devi impostare:

cell.previewImage.layer.masksToBounds = YES;
cell.previewImage.layer.opaque = NO;

4

In Xcode Interface Builder, selezionando l'attributo Disegno 'Clip Subviews' per la vista insieme all'impostazione del raggio d'angolo nel codice cell.previewImage.layer.cornerRadius = 20;fa il lavoro per me!

Vedi l'opzione "Clip Subviews" in IB


2

Prova questo pezzo di codice qui sotto

cell.previewImage.layer.cornerRadius = 20;
cell.previewImage.clipsToBounds = YES;

2

Prova questo codice: -

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

Le risposte di solo codice sono scoraggiate. Fai clic su Modifica e aggiungi alcune parole che riassumono in che modo il tuo codice risponde alla domanda, o forse spiega in che modo la tua risposta differisce dalla risposta / risposte precedenti. Grazie
Nick,

1

Per imageView.contentMode = .scaleAspectFillil cornerRadiusnon viene applicata se l'immagine è molto grande, a seconda dell'hardware.

Alcuni test con immagini panoramiche ridimensionate:

  • iPhone X, dimensioni dell'immagine 5000x1107: 🚫 4000x886: ✅
  • iPhone 6s Plus, dimensioni immagine 10000x2215: 🚫 5000x1107: ✅
  • iPhone 6s, dimensioni immagine 10000x2215: 🚫 5000x1107: ✅

Le dimensioni di ImageView sono 160x100. È interessante notare che l'hardware più recente non è necessariamente più capace.

Sentiti libero di modificare questo post con più risultati del test!


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 Risposta:

Affinché il raggio dell'angolo funzioni, aggiungi l'immagine a UIViewe quindi devi impostare la masksToBoundsproprietà dell'immagine su true:

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

Nota: sostituire 20 con quello desiderato cornerRadius


0

Niente dalle risposte precedenti funziona?

Può accadere che la dimensione di UIImageView sia maggiore della dimensione dell'immagine. Il raggio dell'angolo può essere impostato bene, ma in questo caso non è visibile.

Controllo rapido delle dimensioni di UIImageView in base al codice: (o può utilizzare lo strumento "Visualizza gerarchia dell'interfaccia utente" in XCode)

self.imageView.backgroundColor = [UIColor greenColor]; 

In questo scenario, è necessario assicurarsi che UIImageView abbia le stesse proporzioni dell'immagine.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.