tab icon guidelines buttons bar ios objective-c uitextview core-text

icon - ¿Cómo renderizar documentos de gran tamaño en iOS?



status bar ios (3)

Estoy trabajando en un Proyecto Reader, actualmente analizo el archivo XML y lo convierto como una cadena atribuida y lo represento en CoreText ( Código de muestra de Apple usado).

El tamaño del archivo XML es superior a 6 MB. Los textos se representan correctamente, pero no puedo representar las imágenes y tablas (como las tablas html).

Al mismo tiempo necesito gestionar el rendimiento. También probé UITextView , pero solo muestra una cantidad de un cuarto de textos, después de lo cual el texto desaparece.

¿Hay alguna otra tecnología para representar textos, imágenes y tablas?

PS - El cliente no quiere UIWebView .


Cuando trabaje en archivos tan grandes, puede mostrar datos varias veces. Aquí hay varias soluciones:

  • Pagine su presentación por página: divida su archivo en 10 partes (digamos, ése es un ejemplo) y muestre la primera parte en un UITextView. Agregue dos instancias de UIButton para que el lector pueda cambiar de página. En el cambio de página, cargue la primera / siguiente parte en su UITextView. Esto no será particularmente desconocido para los usuarios porque estás reproduciendo la forma natural en que leen un libro electrónico. Para determinar en cuántas partes debe dividir sus datos, tenga en cuenta que el usuario no quiere cambiar de página continuamente, debe ajustar esto con atención.
  • Pagina tu pantalla "sin problemas": paginas por página como se explicó anteriormente, pero siempre tratarás con dos UITextView incrustados en un ScrollView. De la misma manera que iOS reutiliza las celdas en una UITableView y carga los datos de la celda a pedido (carga lenta), implemente este mecanismo reutilizable con dos instancias de UITextView: para ir rápidamente, puede intentar implementar el mecanismo con una UITableView estándar.

¡Espero que esto ayude!


No ha elaborado la estructura del documento codificado en su archivo XML. Podría ser muy elaborado con una estructura jerárquica similar a HTML o podría ser simple: párrafos lineales de texto entremezclados con imágenes y tablas.

Suponiendo que esto último me gustan los enfoques de _sweepy y Reconquistador. Pero podría intentar usar un UITableView y crear tipos de celdas para cada construcción de documento: párrafo, imagen, tabla. El párrafo y la imagen serían sencillos de implementar utilizando las vistas de UILabel y UIImage para representar el contenido. Las tablas pueden ser más difíciles, pero es probable que aproveche un UIWebView o WKWebView para renderizar solo la tabla.

Necesitaría analizar su XML en alguna estructura o almacén de respaldo donde pueda buscar una construcción de documento dada por índice lineal. Suponiendo un gran documento me inclino hacia SQLite o CoreData.

El desplazamiento sería suave. La tabla cargaría celdas a medida que se hacían visibles y las descargaría a medida que se desplazaban fuera de la pantalla.


UIScrollView es probablemente la única posibilidad. Divida su documento en partes y colóquelo en UIScrollView subvistas apropiadas de las clases UITextView, UIImageView y UITableView. Para reducir el impacto de la memoria, deje solo aquellas subvistas que son realmente visibles.

- (void)scrollViewDidScroll:(UIScrollView *)scrollView { [self removeSubViews]; [self addSubViews]; } - (void)removeSubViews { for (UIView *subView in documentScrollView.subviews) { [subView removeFromSuperview]; } } - (void)addSubViews { NSArray* visibleSubViews = [self getAllSubViewsThatAreVisible]; for (UIView *subView in visibleSubViews) { [documentScrollView addSubview:subView]; } } - (NSArray*)getAllSubViewsThatAreVisible { NSMutableArray* arrayOfSubViews = [[NSMutableArray alloc] init]; NSArray* arrayOfVisibleComponents = [self getAllVisibleComponents]; for (NSDictionary *component in arrayOfVisibleComponents) { //there you have to create new UITableView, UITextView, or UIImageView according to what is needed and put this new component into arrayOfSubViews } return arrayOfSubViews; } - (NSArray*)getAllVisibleComponents { //this is hard to tell how it should be written as I do not know your data. Lets assume, that you have an array of NSDictionary objects. Check all objects in this array, whether they can be visible or not. You shall know their future coordinates in scrollView, while in scrollView, you get visible part by usig property named contentOffset, which will give you top left corner coordinate and by using also property frame.size, you get whole visible rectangle }

Después de hacer esto y probarlo, puede optimizarlo al no eliminar todas las subvistas y dejar allí las que aún están visibles. La segunda optimización sería dividir el conjunto de componentes de acuerdo con la coordenada Y, por lo que no tendrá que iterar todo el conjunto siempre. La tercera optimización puede ser que no volverá a dibujar después de cada desplazamiento pequeño, sino que colocará incluso algunos componentes que en realidad no son visibles, pero que están cerca del área visible y después del desplazamiento, primero compruebe si es necesario volver a dibujar.