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.

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:

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:

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 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: Documentación, Gráficos, Zoom