Zoom 2, geometría de la vista

Siguiendo con las entradas relacionadas com el zoom y el Scroll en un programa Cocoa, ahora toca explicar los parámetros que marcan la visibilidad de una vista. La geometría de la vista.

Marco y límites

En el momento de definir cómo se verá una vista por la pantalla hay dos parámetros básicos: el marco (frame) y los límites (bounds). Ambos son datos del tipo NSRect, es decir nos dan un punto de origen y unas medidas de ancho y alto.

  • El marco (frame) define la situación de la vista respecto a la “supervista”, es decir la vista o ventana que contiene a la vista que estamos tratando. Así pues las coordenadas del punto de origen estan referidas a la “supervista”.
  • Los límites (bounds) definen la parte de la vista que queremos mostrar, siempre refidas al sistema de coordenadas de la propia vista.

En la documentación que proporciona Apple encontramos unas imágenes muy esclarecedoras. La primera nos muestra la relación entre el marco (derecha) y los límites (izquierda). También puede verse que en una situación normal las medidas de marco y límites coinciden.

Relación entre marco y limites

La segunda imagen nos muestra que pasa si la medida del marco es más grande que los límites, la imagen se dimensiona hasta ocupar todo el marco:

Escalado de la imagen para ocupar todo el marco

Lo mismo pasaria si los límtes fueran más grandes que el marco, solo que en ese caso la imágen aparecería más pequeña. Este comportamiento nos permitirá hacer zoom sobre una imagen con facilidad.

La combinación de los dos parametros puede dar lugar a que no toda la vista sea visible, por ejemplo:

Relación entre marco y limites

Si realmente queremos conocer que parte de la vista es realmente visible necesitamos el método visibleRect que nos devuelve un NSRect con el origen y las medidas de la parte visible.

Pruebas

Que pasa ¿No ha quedado del todo claro? Pués a mí támpoco.

Así que decidí hacer mi propio programa, muy simple, para explorar las diferentes posibilidades. Es una variación del programa de la entrada anterior. En este caso además del gráfico he añadido unos botones que dan la posibilidad de cambiar el marco y los límites de la vista. Es posible ver que pasa cuando se envia solamente la orden de cambiar el marco, solamente cambiar los límites y que pasa cuando cambiamos marco y límites dejando el otro parámetro inalterado.

Además también tenia la duda sobre que pasaba con los eventos de ratón al cambiar la vista, de forma que he añadido una pequeña etiqueta que muestra la posición del último lugar donde se ha hecho clic con el ratón.

Para cambiar el tamaño del marco se usa el método setFrameSize: que espera un parámetro del tipo NSSize (ancho y alto), por ejemplo la orden:

[self setFrameSize:NSMakeSize(400, 400)];

Cambia el tamaño a 400 puntos x 400 puntos.

De forma similar los límites se cambian con el método setBoundsSize:.

Y el código para mostrar el clic del ratón será:

- (void)mouseDown:(NSEvent *)e{
    NSPoint punto = [self convertPoint:[e locationInWindow] fromView:nil];
    NSString *texto = [NSString stringWithFormat:@"(%1.0f, %1.0f)", punto.x, punto.y];
    [coordenadas setStringValue:texto];
}

Y aquí el código completo del programa: Zoom2.zip

Resultados

Marco y limites ampliados

Marco y límites ampliados

1. Ampliar marco y límites: tenemos una imágen del mismo tamaño que la imagen original y una vista ampliada en la que podemos desplazarnos con las barras de desplazamiento. Se pueden ver elementos de la imagén que anteriormente quedaban fuera de la vista.

2. Ampliar marco: el mismo resultado que antes. Resulta que al dar la orden setSizeFrame de forma automática también se amplian los límites de la imagen.

3. Ampliar marco manteniendo los límites: tenemos ampliación de la imagén. Como se ha mantenido el marco, ahora aparece las barras de desplazamiento parapoder observar la imagén. Los elementos que antes no se veían siguen sin verse.

4. Ampliar límites: la imagen se hace más pequeña viendose los elementos que no se ven en la imagen original. No aumentan las medidas de la ventana y no se observan las barras de desplazamiento.

5. Ampliar límites manteniendo el marco: igual que el anterior.

En resumen si nos interesa es ampliar la imagen sin alterarla (hacer zoom) nos interesa ampliar el marco (frame) de la vista y mantener los límites (bounds) originales.

¿Y que pasa con el ratón? Pués algo bastante interesante. En todo momento las coordenadas que devuelve son las coordenadas referidas a los límites de la vista.

Más información

Como siempre la mjor fuente de información sobre estos temas de gráficos la puedes encontrar en Apple: View Programming Guide for Cocoa. [http://developer.apple.com/documentation/Cocoa/Conceptual/CocoaViewsGuide/index.html].

Entradas Relacionadas

Etiquetas: , ,

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s


A %d blogueros les gusta esto: