2010-08-08 4 views
30

Cuando el depurador se detiene en un punto de interrupción, no puedo encontrar el marco de ninguno de mis UIViews allí.iPhone: ¿es posible inspeccionar el marco de una UIView en el depurador de Xcode?

¿Es posible hacer esto?

EDITAR: iniciando una recompensa debido a la falta de respuesta. Para que quede claro, lo que estoy buscando es una forma de ver el marco sin agregar un código de depuración adicional.

Además, si la respuesta es "no, no puedes hacerlo", la recompensa será la mejor explicación de por qué puedes ver algunos miembros de la clase pero no otros.

Respuesta

43

Sí, puede hacerlo. Mientras realiza la depuración, encuentre la UIView de interés en el inspector de variables. Mantenga presionada la tecla Control y seleccione "Imprimir descripción en la consola". Por ejemplo, he hecho esto en el Ivar _view de un UIViewController y apareció el siguiente en la consola:

Printing description of _view:
<UIView: 0x25b460; frame = (0 0; 320 480); autoresize = W+H; layer = <CALayer: 0x26b740>>

+0

Con Xcode 4, con frecuencia no se puede acceder a la vista de esa manera, o si se puede obtener un resultado en blanco en la salida, todos los errores en Xcode/clang/lldb. TAMBIÉN, esta respuesta no le permitirá acceder a los otros detalles, como "view.bounds". Consulte las otras respuestas a continuación – Adam

+1

O puede escribir 'po [view_ivar frame], y verá: $ 1 = 0x00173c50 ; capa = ; contentOffset: {0, 0}> – Gin

+0

Puede hacer clic con el botón derecho, en lugar de hacer clic en – onmyway133

0

A veces están fuera del alcance en el momento en que llegas allí.

imprimirlas en la consola:

NSLog('Frame: %d, %d, %d, %d', frame.origin.x, frame.origin.y, frame.size.width, frame.size.height); 
+0

Claro, hay muchas maneras de hacerlo si lo codifico antes de tiempo. Lo que quiero es una forma de hacerlo que no requiera una codificación previa. De modo que en medio de una corrida, si quiero ver el marco de visión X, puedo. –

+2

si va por este camino, también intente NSStringFromCGRect (rect CGRect) –

+0

¿De nuevo en 2010 esos eran ints? Me pregunto cuándo los cambiaron a carrozas. – braden

30

Si vas al panel depurador, puede escribir esto en mientras usted está en un punto de ruptura:

(gdb) print (CGRect) [self frame] 
$1 = { 
    origin = { 
    x = 0, 
    y = 0 
    }, 
    size = { 
    width = 100, 
    height = 100 
    } 
} 

Al utilizar el console debugger puede presionar la tecla de flecha hacia arriba para recorrer los comandos anteriores. Al presionar regresar sin ingresar un comando, se repite el último comando.

+0

mi cd de xcode al usar lldb en lugar de gdb y ejecutarlo en el simulador ... y mató mi OSX Desktop al mismo tiempo: D wow – Infinite

+0

También funciona con una subclase 'UIView' personalizada con el método 'description' reemplazado. – fabb

3
po [[[[UIApplication sharedApplication]windows] objectAtIndex:0] recursiveDescription] 

imprimirá toda la vista heirachy pero sólo parece funcionar en el BGF y no llvm

1

encontrado una respuesta de LLDB. Por ejemplo, esto funciona

(lldb) print (CGRect)[((UIView *)[[[self backIV] subviews] objectAtIndex:1]) frame] 
19

cambio de formato @ respuesta de EPage_Ed porque el original no modificable para su caso específico:

Al (LLDB), escriba:

print (CGRect)[view frame] 

O bien, para los límites:

print (CGRect)[view bounds] 
+0

Esto me da error: uso del identificador no declarado 'CGRect' error: 1 error al analizar la expresión – Lee

+0

Probablemente tu versión de xcode se rompió - apple rompió el anulador recientemente y no solucionó la próxima versión mucho más tarde – Adam

0

Para obtener una información de marco similar al depurador como un NSString, use NSStringFromCGRect (someView.marco)

6
NSLog(@"My view frame: %@", NSStringFromCGRect(myView.frame)); 
3

Curiosamente, utilizando el método de obtención de volver marco de la vista funciona:

print (CGRect)[view frame] 

Esto da el resultado esperado:

(CGRect) $2 = origin=(x=0, y=20) size=(width=320, height=48) 

Pero si intenta utilizar la notación de punto , que escucho a menudo referido como proporcionado simplemente por 'azúcar sintáctico':

print (CGRect)view.frame 

se obtiene el siguiente error:

error: C-style cast from '<unknown type>' to 'CGRect' is not allowed 
2

En Xcode, ir a la consola y escriba:

po viewName 

Si la ejecución es código dentro de la vista, puede simplemente:

po self 

Esto dará como resultado algunos detalles de vista, como esto:

<UIView: 0x9cca0f0; frame = (0 0; 320 480); layer = <CALayer: 0x9ccabe0>> 
4

en Xcode 5.1.1, puede flotar sobre una variable que es un UIView y verá el siguiente tipo de popover:

enter image description here

Si hace clic en el botón 'i', el siguiente tipo de salida será impreso en la consola del depurador:

<UIImageView: 0xa49ca90; frame = (0 0; 640 360); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0xa46c1c0>> 

Ésta es otra manera de inspeccionar el marco de una UIView.

0

Prefiero el formulario corto para imprimir, es decir, 'p' para imprimir el marco en lldb. Por ej.

p (CGRect)[view frame] 
Cuestiones relacionadas