vistas y vistas personalizadas

Anuncio
Índice de hoy!
• Repaso
opciones diseño navegación!
- Tab, Navigation y Tablas!
- Vistas “personalizadas” – Pintar directamente en pantalla!
• Transferir
Repaso diseños de navegación y
vistas personalizadas!
al dispositivo!
• Aprovechando
las “ventajas” del hardware móvil: sensores!
- Eventos “touch”!
- Vistas web, mapas, localización: mapKit!
- Otros sensores: giróscopo, acelerómetro, cámara: motionKit!
25 Febrero!
Ana C. Murillo!
Control de navegación: “navigation
controlers”!
Barra de navegación:!
Barra de “tabs”:!
UINavigationController!
UITabBarController!
Híbrido ...!
Esquema general!
• Crear
proyecto nuevo!
- Window-based: solo ventana “base”, ninguna “subview” añadida.!
- View-based, Navigation-based y Tab-based incluyen
automáticamente una subview a la ventana principal inicializada de la
manera correspondiente en cada caso!
- (void)applicationDidFinishLaunching:(UIApplication *)application {!
... !
ó [window addSubview:[(my)viewController view]];!
//inicializa por defecto el viewController con appNameViewController (UIView) en
MainWindow.xib!
ó [window addSubview:[(my)navigationController view]]; !
//inicializa por defecto con RootViewController (que es una tableView) en MainWindow.xib!
ó [window addSubview:[(my)tabBarController view]]; //LO MISMO QUE!
[window addSubview:(my)tabBarController.view];!
[window makeKeyAndVisible];!
Esquema general!
• Crear
Vistas con tablas!
! Class: ! UITableView, UITableViewCell, UITableViewController
Protocols: UITableViewDelegate, UITableViewDataSource!
proyecto nuevo!
:UIScrollView, 1columna, varias filas/secciones!
- Window-based: solo ventana “base”, ninguna “subview” añadida.!
- View-based, Navigation-based y Tab-based incluyen
automáticamente una subview a la ventana principal inicializada de la
manera correspondiente en cada caso!
UITableViewStylePlain!
Cabecera tabla!
UITableViewStyleGrouped!
Cabecera tabla!
Cabecera sección!
Cabecera sección!
Celda!
• Y
personalizar (my) viewControllers antes de hacer el
“addsubview” (código o IB)!
Celda!
Pie sección!
Pie sección!
Sección!
//inicializar viewController!
Sección!
!
//inicializar viewController inicial y hacer “push” en la pila del navigationControler
!
Pie tabla!
Pie tabla!
//inicializar viewControllers necesarios y “rellenar” vector del tabBarControler
Vistas con tablas!
Vistas con tablas: demo!
! Class: ! UITableView, UITableViewCell, UITableViewController
Protocols: UITableViewDelegate, UITableViewDataSource!
Usually:!
UITableViewController : UIViewController <UITableViewDelegate, UITableViewDataSource>!
DataSource: Qué se ve
(datos) y sus propiedades!
• NSArray !
• Cuántas secciones y filas?!
• Data for a given [section, row]!
• Contenido de headers y footers.!
• Propiedades de “edición” de
elementos de la tabla: insert, rearrange,
delete!
Delegate: Cómo se ve y qué
ocurre con la vista (eventos)?!
• Tamaño de celdas, filas, cabeceras!
• Estilo de celdas!
• “Eventos” de celda_va_a_aparecer!
• “Eventos” de fila_seleccionada y
permisos de ser seleccionado o no!
• Auto-select/deselect filas si hace falta!
• Recarga datos antes de hacerse visible.!
• Otros: edit button, flashes scroll, deja
sitio para el teclado si hace falta!
Añadimos vista de tabla a la “agenda” base!
(más avanzado: ejemplo “The Elements”)!
Vistas personalizadas!
• Vista
(UIView): área rectangular de la pantalla!
• Dibuja
y/o maneja eventos en esa zona!
• Jerarquía
• Una
de vistas: !
superview: - (UIView *) superview !
• Varias
(o ninguna) subviews: - (NSArray *) subviews !
! El orden importa ! pila con transparencias!!
Vistas personalizadas!
• Normalmente
con I.Builder, pero a veces es necesario diseñar
vista “manual”: dibujo personalizado y/o manejar
eventos(siguiente bloque).!
• Superposición
• Podemos
utilizar transparencias para ver las sub-vistas de
abajo:!
• Al
dibujar, transparencia por defecto es: opaco 100%. !
• Para
ocultar una vista del todo: hidden property= YES!
Dibujar en pantalla!
• Accedemos
a los “pixels” de la pantalla que queremos pintar!
• Coordenadas
• CGFloat
en pantalla ! “tipo C”: !
(un float “normal”, usar siempre este tipo para
graficos)!
• CGPoint
(struct de C con dos CGFloats: x,y. Se crea con
CGPointMake(x, y) )!
• CGSize
(struct de C con dos CGFloats: width and height. Se
crea con CGSizeMake(width, height)!
• CGRect
(struct de C con un CGPoint origin y un CGSize size.
Se crea con CGRectMake(x, y, width, height)!
entre vistas: se ve la que está más arriba!
Dibujar en pantalla!
(local): alto y largo de la
vista. Se usa cuando se está
implementando una vista!
• Bounds
y center (global):
rectángulo que contiene a la
vista. Centro relativo a la superview. Se usa para posicionar la
vista dentro de su “superview”.!
• Frame
• Origen: arriba
• Frame
a la izquierda!!!
>= bounds (rotaciones)!
View B bounds: ((0,0),(200,250)) !
View B frame: ((140,65),(320,320)) !
View B center: (300, 225)!
Dibujar en pantalla!
• Subclase
de UIView: implementar el método drawRect!
Dibujar en pantalla!
• Contexto
• Determina
! - (void)drawRect:(CGRect)clipRect;!
• Sólo
• Se
• NUNCA!!
llamar directamente a drawRect:
avisar que la vista no está actualizada y necesita “redibujar”:
drawRect será llamado en el momento adecuado.!
! - (void)setNeedsDisplay ó - (void)setNeedsDisplayInRect:(CGRect)clipRect!
Dibujar en pantalla!
• Path
dónde va el dibujo (pantalla, pdf,...)!
dura una ejecución de drawRect (nunca almacenar)!
obtiene el contexto actual: !
" " CGContextRef context = UIGraphicsGetCurrentContext();!
• Estilo
del dibujo. Se pueden configurar múltiples opciones
(fuente, color, tamaño,...)!
" "
CGContextSetLineWidth(context, 1.0); !
DIBUJAR EN PANTALLA!
a dibujar: !
• Empezar
• Mover
!
del dibujo: !
el path: CGContextBeginPath(context);!
el “lápiz”, haciendo rectas y arcos: !
CGContextMoveToPoint(context, 75, 10); !
" CGContextAddLineToPoint(context, 10, 150); ...!
• Cerrar
el path: CGContextClosePath(context);!
• Establecer
!
propiedades y dibujar el path: !
[[UIColor greenColor] setFill];
!
" [[UIColor redColor] setStroke];!
" CGContextDrawPath(context, kCGPathFillStroke);!
puede almacenar un path para reutilizarlo, usando CGPath en
lugar de CGContext!
• Se
DEMO: happy!
Vistas con imágenes!
Mostrar una imagen “grande” en un “scroll view”!
UIImage *image = [UIImage imageNamed:@"smartphones.jpg"];
UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
CGRect screenBounds = [[UIScreen mainScreen] bounds];
UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:screenBounds];
[scrollView addSubview:imageView];
scrollView.contentSize = image.size;
[self.view addSubview:scrollView];!
Transferir al dispositivo!
Descargar