Para aclarar el propósito de esta pregunta: Sé CÓMO crear vistas complicadas con ambas subvistas y usando drawRect. Estoy tratando de entender completamente cuándo y por qué usar uno sobre el otro.
También entiendo que no tiene sentido optimizar tanto antes de tiempo, y hacer algo de la manera más difícil antes de hacer un perfil. Considere que me siento cómodo con ambos métodos, y ahora realmente quiero una comprensión más profunda.
Gran parte de mi confusión proviene de aprender a hacer que el rendimiento de desplazamiento de la vista de tabla sea realmente suave y rápido. Por supuesto, la fuente original de este método es del autor detrás de twitter para iPhone (anteriormente tweetie). Básicamente dice que para hacer que el desplazamiento de la tabla sea suave, el secreto es NO usar subvistas, sino hacer todo el dibujo en una vista personalizada. Básicamente, parece que el uso de muchas subvistas ralentiza el procesamiento porque tienen mucha sobrecarga y se vuelven a componer constantemente sobre sus vistas principales.
Para ser justos, esto se escribió cuando el 3GS era bastante nuevo, e iDevices se ha vuelto mucho más rápido desde entonces. Aún así, este método se sugiere regularmente en las páginas web y en otros lugares para tablas de alto rendimiento. De hecho, es un método sugerido en el Código de muestra de tabla de Apple , se ha sugerido en varios videos de WWDC ( Dibujo práctico para desarrolladores de iOS ) y en muchos libros de programación de iOS .
Incluso hay herramientas increíbles para diseñar gráficos y generar código de Core Graphics para ellos.
Así que al principio me hacen creer "hay una razón por la que existe Core Graphics. ¡Es RÁPIDO!"
Pero tan pronto como creo que tengo la idea de "Favorecer Core Graphics cuando sea posible", empiezo a ver que drawRect a menudo es responsable de la poca capacidad de respuesta en una aplicación, es extremadamente costosa en cuanto a memoria y realmente grava la CPU. Básicamente, que debería " Evitar anular drawRect " (WWDC 2012 iOS App Performance: Graphics and Animations )
Así que supongo que, como todo, es complicado. ¿Tal vez puedan ayudarme a mí mismo y a otros a comprender cuándo y por qué usar drawRect?
Veo un par de situaciones obvias para usar Core Graphics:
- Tienes datos dinámicos (ejemplo del gráfico de acciones de Apple)
- Tiene un elemento de interfaz de usuario flexible que no se puede ejecutar con una simple imagen de tamaño variable
- Está creando un gráfico dinámico, que una vez renderizado se usa en varios lugares
Veo situaciones para evitar Core Graphics:
- Las propiedades de su vista deben ser animadas por separado
- Tiene una jerarquía de visualización relativamente pequeña, por lo que no vale la pena ganar ningún esfuerzo adicional percibido con CG
- Desea actualizar partes de la vista sin volver a dibujar todo
- El diseño de sus subvistas necesita actualizarse cuando cambia el tamaño de la vista principal
Así que otorga tu conocimiento. ¿En qué situaciones recurres a drawRect / Core Graphics (que también podría lograrse con subvistas)? ¿Qué factores te llevan a esa decisión? ¿Cómo / por qué se recomienda dibujar en una vista personalizada para el desplazamiento suave de las celdas de la tabla? ¿Qué pasa con las imágenes de fondo simples (cuando las creas con CG vs usando una imagen PNG redimensionable)?
Es posible que no se necesite una comprensión profunda de este tema para crear aplicaciones que valgan la pena, pero no me encanta elegir entre técnicas sin poder explicar por qué. Mi cerebro se enoja conmigo.
Actualización de preguntas
Gracias a todos por la información. Algunas preguntas aclaratorias aquí:
- Si está dibujando algo con gráficos básicos, pero puede lograr lo mismo con UIImageViews y un png pre-renderizado, ¿siempre debe seguir esa ruta?
- Una pregunta similar: Especialmente con herramientas rudas como esta , ¿cuándo debería considerar dibujar elementos de interfaz en gráficos básicos? (Probablemente cuando la visualización de su elemento es variable. Por ejemplo, un botón con 20 variaciones de color diferentes. ¿Algún otro caso?)
- Dado mi entendimiento en mi respuesta a continuación, ¿podrían lograrse las mismas ganancias de rendimiento para una celda de tabla capturando efectivamente un mapa de bits de instantánea de su celda después de su renderizado UIView complejo y mostrándolo mientras se desplaza y oculta su vista compleja? Obviamente algunas piezas tendrían que ser resueltas. Solo un pensamiento interesante que tuve.