Así que me estoy haciendo algunas animaciones personalizadas en mi navigationcontroller y la forma en que se empuja y se despliega la viewControllers.

Todo funciona suave. Tan pronto como me agregue el código siguiente (En una subclase de UINavigationController), me enfrento a un enorme impacto en el rendimiento. Después de la adición de una sombra todas las animaciones vuelto muy perezoso. Es esta espera o estoy haciendo algo mal en el código?

//This code gets called once during NavigationController initialization.
[self.view setClipsToBounds:NO];
[self.view.layer setCornerRadius:5];
[self.view.layer setShadowOffset:CGSizeMake(0, 20)];
[self.view.layer setShadowColor:[[UIColor yellowColor] CGColor]];
[self.view.layer setShadowRadius:20.0];
[self.view.layer setShadowOpacity:1];

EDICIÓN:

Cambiado mi sombra radio a 1 y sigue lento

  • Para todos los que vale la pena, este es cubierto de manera explícita en la WWDC 2010 Sesión 425: Core Animation, en la Práctica, Parte 2 aquí.
InformationsquelleAutor aryaxt | 2012-04-03

4 Comentarios

  1. 48

    Usted debe esperar una desaceleración de la adición de una sombra. Un shadowRadius de 20 es muy alto y va a ser especialmente lento.

    La otra clave para mejorar la sombra de la velocidad de renderizado: establecer el shadowPath de la propiedad. Puede ayudar dramáticamente.

    • configuración de ShadowPath hizo el truco, Mi sombra radio es de 10 y todavía funciona bien.
    • sólo me salvó la vida 🙂
    • Más consejos para el rendimiento en las sombras: stackoverflow.com/questions/10133109/…
    • es más eficiente manera de que puedo probar… idea con shouldRasterize trabajo no es tan rápida como puede ser necesaria. esta respuesta es mucho mejor! no entiendo por qué @williamcotton responder a ganar tanto votos…
    • shadowPath hizo el truco. el rendimiento se siente un millón de veces mejor!
    • configuración de ShadowPath hizo el truco, pero ¿por qué?

  2. 83
    self.view.layer.shouldRasterize = YES;
    self.view.layer.rasterizationScale = UIScreen.mainScreen.scale;

    Hace poco estuve teniendo algunos problemas con el lento CALayer sombras, y que la simple línea de código arreglado todo para mí!

    • impresionante, esto hace que su rendimiento sea el mejor, ahora puedo tener cualquier tamaño de shadowRadius sin tener un impacto en el rendimiento
    • De esta forma se ignora la retina las imágenes que usted puede tener para usted anotación. Para solucionar este problema, agregue la línea siguiente: auto.vista.la capa.rasterizationScale = [UIScreen pantalla principal].escala;
    • Estoy teniendo un problema similar con un formato tableview donde cada celda contiene un par de UILabels así como una vista con las esquinas redondeadas. He añadido una sombra a la capa que contiene el formato tableview y el desplazamiento entrecortada. Sin embargo, la configuración de shouldRasterize = YES resuelto el entrecorta pero pixelada de la vista (visiblemente borrosa) así que no es una solución aceptable. He encontrado el uso de shadowPath en lugar de shadowOffset hizo el truco.
    • Trabajó como un sharm
    • podría ser peor si la vista varía. shouldRasterize = SÍ sólo es una buena solución cuando la vista no cambia, de modo mapa de bits es genereated una vez y se almacenan en caché y volver a utilizar UIScrollView
    • eso es impresionante!
    • Por favor, tenga en cuenta que esto aumenta su consumo de RAM
    • Impresionante! Exactamente lo que yo buscaba! Gracias.

  3. 15

    Utilizando shadowPath en lugar de shadowOffset.

    theView.layer.shadowPath = [UIBezierPath bezierPathWithRect:theView.bounds].CGPath;

    Comprobar este post: iphone – Animación del rendimiento es muy pobre, al ver la sombra en

    • Trabajó como un encanto, mejor que shouldRasterize que borrosa la vista y de todas las subcapas.
    • es más eficiente manera de que puedo probar… idea con shouldRasterize trabajo no es tan rápida como puede ser necesaria. esta respuesta es mucho mejor! no entiendo por qué @williamcotton responder a ganar tanto votos…
    • shadowPath es bastante bueno y rápido, pero ¿cómo se puede mantener la actualización del marco en el diseño automático?
    • Esto es sólo si usted no tiene las esquinas redondeadas o la transparencia en sus puntos de vista. No todos los puntos de vista es rectangular. shouldRasterize es más genérico y no tenemos que lidiar con cualquier curva de caminos, dijo.
    • hacerlo en vista del layoutSubviews, tal vez usted necesita subclase algunos puntos de vista
  4. 2

    Sí, las sombras son muy caros (especialmente una sombra que es mucho, juegas con la radio y te darás cuenta de que hace una gran diferencia en el grado de desaceleración que la experiencia). Una forma de mejorar el rendimiento es hacerlo una vez a un CGImageContext y solo mostrar la imagen en lugar de tener la capa de re-procesar la sombra cada vez que se vuelve a dibujar (pero esto no funciona si la sombra tiene que animar o algo).

    • Usted piensa que podría funcionar mejor para usar un png y añadirlo a mi UIView?
    • Si que es una posibilidad (es decir, usted sabe la forma/tamaño/lo que sea de la sombra de antemano), a continuación, que sin duda le dan un mejor rendimiento. La fusión de imágenes es mucho más rápido que el procesamiento de sombras.
    • Prerendered a una imagen funcionará mientras usted no necesita cambiar la forma de la sombra.

Dejar respuesta

Please enter your comment!
Please enter your name here