2010-12-10 25 views
20

¿Alguien puede ayudarme aquí? Nuevo como desarrollador de iPhone. Estoy tratando de mostrar una imagen .png en un círculo en lugar de un rectángulo que es el estándar para iPhoneUIImage en un círculo

+0

http://stackoverflow.com/a/21329347/501487 – aToz

+0

http://stackoverflow.com/questions/7399343/making-a-uiimage-to-a-circle-form/21954535#21954535 –

Respuesta

9

Use un UIImageView y configure la esquinaRadius para que tenga la mitad de alto y ancho. view.layer.cornerRadius = cornerRadius;

UIImage rounded corners

51

Bueno, todos los archivos PNG son rectángulos '' pero si usted quiere tener la apperence de un círculo u otro objeto no rectángulo en la pantalla, puede hacerlo mediante el uso de transparacy. Para asegurarse de que los píxeles transparentes de la imagen también sean transparentes en el iPhone, puede configurar el color de fondo del UIImageView para borrar. Esto se puede hacer en Interface Builder arrastrando el regulador de opacidad en el fondo selector de colores hasta el fondo, o en el código de la siguiente manera:

UIImage *image = [UIImage imageNamed:@"yourRoundImage.png"]; 
UIImageView *imageView = [[UIImageView alloc] initWithImage:image]; 
imageView.backgroundColor = [UIColor clearColor]; 
[self.view addSubview: imageView]; 

Si simplemente desea agregar esquinas redondeadas, para hacer un círculo, también se puede utilizar la propiedad CornerRadius como éste si ha añadido el marco QuartzCore a su proyecto:

#import <QuartzCore/QuartzCore.h> 
UIImage *image = [UIImage imageNamed:@"yourRoundImage.png"]; 
UIImageView *imageView = [[UIImageView alloc] initWithImage:image]; 
imageView.layer.cornerRadius = image.size.width/2; 
imageView.layer.masksToBounds = YES; 
[self.view addSubview: imageView]; 
+0

¡Una solución que funciona bien! Sin embargo, si tiene mucha imagen – Vinzius

+5

La línea cornerRadius debe ser 'imageView.layer.cornerRadius = imageView.frame.size.width/2;' – guptron

+0

no funciona en caso de ipad –

24

tratar este código

yourImageView.layer.cornerRadius = yourImageView.frame.size.height /2; 
yourImageView.layer.masksToBounds = YES; 
yourImageView.layer.borderWidth = 0; 

esta imagen de la demostración como ios 7 imagen de círculo gracias

+0

intenté esto funciona bien gracias @waseem – iOSDevp

+0

imagen gracias;) – animaonline

+0

perfecto! Gracias – malhal

2

Cambiar la esquinaRadio de la vista de la imagen funciona bien si solo tiene un par de imágenes en su vista. Sin embargo, si la vista de la imagen está en una vista de tabla, el rendimiento se verá afectado.

Algunas de las otras opciones:

  1. que el círculo elementos de imagen en el servidor o manualmente si se encuentran agrupados en la aplicación, con partes transparentes de la región exterior del círculo.
  2. Si el fondo de la vista de la imagen no cambia, cree una imagen de superposición que tenga la parte del círculo interno transparente, y el resto sea el mismo que el fondo. Establezca también backgroundColor de la vista de imagen para borrar Color.
  3. Al recibir las imágenes, edítelas en código para que sean un círculo, en una cadena de fondo.
4

Pruebe esto para conseguir esquinas redondeadas de la imagen de visión y también para colorear las esquinas:

self.imgView.layer.cornerRadius =self.imgView.frame.size.height/2; 
self.imgView.layer.masksToBounds = YES; 
self.imgView.layer.borderColor = [UIColor colorWithRed:148/255. green:79/255. blue:216/255. alpha:1.0].CGColor; 
self.imgView.layer.borderWidth=2; 

Condición *: La altura y la anchura de la imageView debe ser el mismo para obtener las esquinas redondeadas.

12

Mi contribución con una extensión rápida utiliza para configurar una UIImageView como círculo

extension UIImageView{ 

    func asCircle(){ 
     self.layer.cornerRadius = self.frame.width/2; 
     self.layer.masksToBounds = true 
    } 

} 

Sólo tiene que llamar MyImageView.asCircle()

+2

Sí, he implementado la misma solución exacta en mi código, excepto que he hecho una extensión de UIView, ya que puedo llamar al mismo método incluso para otros objetos (como botones ...). – Andrej

0

Voy a añadir una extensión de poco más universal a UIImageView que trabajará con imágenes no cuadrados . Tenga en cuenta que funcionará más lento que el método cornerRadius.

extension UIImageView { 
    @IBInspectable public var asEllipse:Bool { 
     get { 
      if let mask = self.layer.mask { 
       return mask.name == kMaskLayerName 
      } 
      return false; 
     } 

     set { 
      if (newValue) { 
       let ellipseMask = CAShapeLayer() 
       ellipseMask.name = kMaskLayerName 
       ellipseMask.path = CGPathCreateWithEllipseInRect(self.bounds, nil) 
       ellipseMask.strokeColor = UIColor.clearColor().CGColor 
       ellipseMask.fillColor = UIColor.whiteColor().CGColor 
       self.layer.mask = ellipseMask 
      } else if self.asEllipse { 
       self.layer.mask = nil 
      } 
     } 
    } 

} 

private let kMaskLayerName="EllipseMaskLayer" 
+0

¿Por qué es esto más lento que 'cornerRadius'? –

+0

Supongo que son las asignaciones de objetos las que lo ralentizan: una instancia de 'CAShapeLayer', una de' CGPath' y dos de 'UIColor'. A pesar de haber probado que para las imágenes de celda en un 'tableView' en un iPhone 5 en adelante no hay una desaceleración notable cuando se desplaza. TBH No he realizado una investigación de optimización adecuada en Instruments. – user3099609

0

Swift 4: Esto debería mostrar su .png en un círculo.

  1. Arrastre (ctrl + clic) un IBOutlet de una imagen hacia su código.

enter image description here

CornerRadius El radio de usar en la elaboración de las esquinas redondeadas para el fondo de la capa. Animable. https://developer.apple.com/documentation/quartzcore/calayer/1410818-cornerradius

propiedad clipsToBounds Valor booleano que determina si las subvistas están confinadas a los límites de la vista. https://developer.apple.com/documentation/uikit/uiview/1622415-clipstobounds

2.Inside viewDidLoad(), Use la propiedad de instancia layer.cornerRadius y clipsToBounds.

profileImage.layer.cornerRadius = 50 
profileImage.clipsToBounds = true