Red de conocimiento informático - Conocimiento informático - Cómo obtener la parte visible de UITableView

Cómo obtener la parte visible de UITableView

1.UITableView almacena su NSIndexPath, por lo que no hay ningún objeto para esa parte. Usando el código siguiente puedes iterar sobre la tabla y realizar un índice en la parte visible (no sé por qué quieres ver la parte que está actualmente en la pantalla, pero da igual).

for (NSIndexPath* i in [yourTableViewName indexPathsForVisibleRows])

{

NSUInteger sectionPath = [i indexAtPosition:0];

// Aquí hay un código personalizado que se ejecutará varias veces para cada parte de cada fila visible en el grupo

}

2.

O muy fácil La forma es usar valueForKeyPath y aprovechar la clase NSSet: NSSet *visibleSections = [NSSet setWithArray:[[self.tableView indexPathsForVisibleRows] valueForKey:@"section"]];

Básicamente. Tiene una serie de valores de sección en las filas visibles y luego la completa en una colección para eliminar duplicados.

3.

He encontrado la solución. En el primer paso, se mostrará cada sección, cree una sección UIView - (UIView *)tableView:(UITableView

*)tableView viewForHeaderInSection:(NSInteger), que se almacenará en la matriz.

Cuando me desplazo en TableView quiero liberar la parte invisible, así que necesito saber qué parte es visible o no, mediante el código de función detecto este propósito y si la vista es visible entonces suéltela. -(BOOL)isVisibleRect:(CGRect)rect containerView:(UIScrollView*)containerView

{

CGPoint punto = contenedorView.contentOffset

CGFloat zy = punto; .y ;

CGFloat py = rect.origin.if (rect.origin.y > por) {

return FALSE;

devuelve VERDADERO;

}

(rect es parte de UIView; containerView es UITableView)

Con este método, puedo obtener la visibilidad de UITableView parte, pero me gustaría ver una manera de hacerlo usando la API proporcionada directamente por el SDK.

4. Extraiga parte de la lista de filas visibles: NSArray *indexPathsForVisibleRows = [tableView indexPathsForVisibleRows];

NSMutableIndexSet * indexSet = [NSMutableIndexSet indexSet];

for ( NSIndexPath *indexPath en indexPathsForVisibleRows ) {

[indexSet addIndex.indexPath.section];

}

NSLog(@"indexSet %@",indexSet) ;

// indexSet [Número de índice: 5 (en 1 rango), índice: (9-13)]

O: NSArray *indexPathsForVisibleRows = [detailTableView indexPathsForVisibleRows];

NSMutableSet *sectionSet = [NSMutableSet set];

for ( NSIndexPath *indexPath in indexPathsForVisibleRows ) {

[sectionSet addObject.[NSNumber numberWithInt: indexPath.section]];

}

NSLog(@"sectionSet %@",sectionSet);

// sectionSet {(13, 11, 9 , 10, 12 )}

5. Otra solución es usar la etiqueta de 1 bit en la vista del encabezado de la sección de la siguiente manera #define _TBL_TAG_SECTION(_TAG) ((_TAG)|(1< <30))<. /p>

#define _TBL_TAG_CLEAR(_TAG) ((_TAG)& amp;((1<<30)-1))

#define _TBL_TAG_IS_SECTION(_TAG) ( (_TAG)>>30 )

- (UIView*)tableView: (UITableView *)tableView viewForHeaderInSection:(NSInteger)section

{

// vista de encabezado de asignación

UIView *header = [[UIView alloc] initWithFrame.CGRectMake(0, 0, 1, 1)];

header.tag = _TBL_TAG_SECTION(sección);

return encabezado;

}

- (void)scrollViewDidScroll:( UIScrollView *)scrollView

{

CGRect r = CGRectMake(scrollView. contentOffset.x, scrollView.contentOffset.y,

CGRectGetWidth(scrollView.frame),

CGRectGetHei

ght(scrollView.frame));

for (UIView *v en [_tableView subvistas]) {

if ( CGRectIntersectsRect(r, v.frame)){

if ( _TBL_TAG_IS_SECTION(v.tag) ){

NSLog(@"etiqueta de sección visible %d",_TBL_TAG_CLEAR(v.tag));}.

}

}

}

}

6. Dos pasos para obtener la parte visible en UITableView. Solución:

1) Agregue la vista de encabezado a la matriz mutable viewForHeaderInSection 2) Actualice la propiedad scrollViewDidScroll NoteTag de la matriz para guardar el número de secciones al desplazarse por la vista de tabla

@property (no atómica, fuerte, lectura y escritura) NSMutableArray *headerArray;

- (UIView *) tableView: (UITableView *)tableView viewForHeaderInSection:(NSInteger)section {

UIView *headerView = [[UIView alloc] initWithFrame.CGRectMake(0, 0, tableView.bounds.size.width, 40)];

headerView.backgroundColor = [UIColor greenColor];

headerView.tag = sección;

UIView *headerView = [[UIView alloc] initWithFrame.tag = sección;

[_headerArray addObject:headerView];

devuelve headerView;

}

- (void)scrollViewDidScroll: (UIScrollView * )scrollView {

[self updateHeaderArray];

NSLog(@"----- - -----");

for (UIView *ver en _headerArray) {

NSLog(@" sección visible:%d", view.tag);

}

}

}

- (void)updateHeaderArray {

// Eliminar encabezados parciales invisibles

NSMutableArray *removeArray = [matriz NSMutableArray];

CGRect containerRect = CGRectMake(_tableView.contentOffset.x, _tableView.contentOffset.y,

_tableView.frame .size .width, _tableView.frame.size.height);

for (UIView *encabezado en _headerArray) {

if (! CGRectIntersectsRect(header.frame, containerRect)) {

[removeArray addObject:header];

}

}

[_headerArray removeObjectsInArray :removeArray];

}

7. La respuesta es mucho más simple y utiliza el conciso KVC NSArray *v.

isibleSections = [self.tableView.indexPathsForVisibleRows valueForKey:@"section"];

Esto puede proporcionarle valores de matriz duplicados, pero puede administrarlos desde allí.

上篇: Cómo llamar a Surfaceflinger entre procesosAndroid SurfaceFlinger 1.SurfaceFlinger es una función que recibe la superficie dibujada por la capa superior, la procesa y la pasa al hardware subyacente para su visualización. Es una función que procesa la superficie dibujada por la capa superior y la pasa al hardware subyacente para su visualización. 2. La siguiente figura detalla la función de SurfaceFlinger. Surface es un concepto e hilo importante en el sistema de gráficos de Android View y sus subclases (como TextView, Button) se dibujan en la superficie. Cada superficie crea un objeto de lienzo (pero las propiedades pueden cambiar en cualquier momento), que se utiliza para administrar las operaciones de dibujo de la vista en la superficie, como dibujar puntos y líneas. Cada objeto de lienzo corresponde a un mapa de bits que almacena el contenido dibujado en la superficie. Cada superficie generalmente tiene dos búfer, un búfer frontal y un búfer posterior. El búfer posterior es el mapa de bits dibujado por el lienzo, por lo que el dibujo siempre se completa en el búfer posterior. Cuando sea necesario actualizar, el búfer posterior se actualizará. con el intercambio de búfer frontal. La ventana está unida a la superficie. La ventana está vinculada a la superficie, ViewRoot le pide a la superficie un lienzo y la vista usa ese lienzo para dibujar. Después de que la vista dibuja datos en el lienzo, ViewRoot llama a Surface.unplease. ViewRoot llamará a Surface.unlockCanvasAndPost(canvas) para programar SurfaceFlinger::composeSurfaces() para que realmente muestre el panel. SurfaceFlinger maneja la transferencia de datos de dibujo desde el lienzo al búfer frontal o posterior de la superficie, excepto SurfaceViews, donde diferentes vistas en el mismo ViewRoot comparten la misma vista. SurfaceFlinger se utiliza para transferir datos de dibujo desde el lienzo al búfer frontal o posterior de la superficie, excepto para SurfaceViews, donde diferentes vistas en el mismo ViewRoot comparten la misma superficie. Las capas son cosas que SurfaceFlinger puede componer (que debería llamarse LayerFlinger). Si miras el código, verás que hay varios tipos de capas, específicamente la capa normal (Layer.cpp), las cuales tienen todas una superficie como soporte, mientras que el LayerBuffer (mal llamado) no tiene almacenamiento de soporte. pero se puede recuperar de sus clientes…. Tenga en cuenta que el tipo GGLSurface debería haberse llamado GGLBuffer, y las múltiples capas simplemente se componen en el búfer final en su orden Z. Hay varios objetos estrechamente relacionados con el concepto de Superficie: 1. Hay varios objetos estrechamente relacionados con el concepto de Superficie: 1. Java Surface (frameworks/base/core/java/android/view/Surface.java). La aplicación llama indirectamente a este objeto (a través de SurfaceView, ViewRoot, etc.), que necesita crear la superficie (que también crea el lienzo) para poder dibujar gráficos en el objeto y, finalmente, transferirlos a la pantalla. 2. 2.Superficie C++ (frameworks/base/libs/ui/Surface.cpp.). Java Surface llama a este objeto a través de Jni e implementa las funciones de Java Surface. ISurface (y su clase derivada BnSurface). Este objeto es la interfaz entre la aplicación y el servidor. C++ Surface crea esta ISurface (BnSurface) y envía comandos, como actualizar el contenido de la superficie en la pantalla, y el servidor acepta los comandos y realiza las operaciones apropiadas. 下篇: La aventura de Fairy Tail Battle 9-9 no puede pasar