ビューコントローラは、_view
インスタンス変数からビューを参照します。
ビューはフレームを直接保存しません。レイヤーの`frame'を返すだけです。
_layer
ビューは、インスタンス変数からそのレイヤーを参照します。
レイヤーにもフレームは保存されません。bounds
、、、、およびからフレームposition
を計算します。サイズはの一部です。anchorPoint
transform
bounds
レイヤーは、その境界をインスタンス変数に直接格納しません。代わりに、そのlayer
インスタンス変数はプライベートC++クラスのインスタンスを参照しますCA::Layer
。このクラスのメンバーレイアウトは文書化されていません。
つまり、インスタンスにアクセスself->_view->_layer->layer
することはできますが、境界を見つけるCA::Layer
場所がわからないために行き詰まります。CA::Layer
したがって、ウォッチポイントを使用してビューのサイズの変更を検出しようとするのはかなり困難です。
にブレークポイントを設定する方が簡単です-[CALayer setBounds:]
。
シミュレーター上
ビューアドレスではなく、ブレークポイント条件でレイヤーアドレスを使用することを忘れないでください。
(lldb) po self.view
(UIView *) $1 = 0x0a034690 <UIView: 0xa034690; frame = (0 20; 768 1004); autoresize = W+H; layer = <CALayer: 0xa034780>>
(lldb) break set -F '-[CALayer setBounds:]' -c '((int*)$esp)[1] == 0xa034780'
Breakpoint created: 2: name = '-[CALayer setBounds:]', locations = 1, resolved = 1
ブレークポイントに到達すると、CALayer
インスタンスはによって参照され((int *)$esp)[1]
、新しい境界は*(CGRect *)($esp+12)
次のようになります。
(lldb) po ((int*)$esp)[1]
(int) $8 = 167987072 <CALayer:0xa034780; position = CGPoint (384 480); bounds = CGRect (0 0; 768 1004); delegate = <UIView: 0xa034690; frame = (0 -22; 768 1004); autoresize = W+H; layer = <CALayer: 0xa034780>>; sublayers = (<CALayer: 0xa033010>); backgroundColor = <CGColor 0xa034960> [<CGColorSpace 0xa02b3b0> (kCGColorSpaceDeviceRGB)] ( 1 1 1 1 )>
(lldb) p *(CGRect*)($esp+12)
(CGRect) $9 = origin=(x=0, y=0) size=(width=768, height=960)
(lldb) finish
(lldb) po 0xa034780
(int) $10 = 167987072 <CALayer:0xa034780; position = CGPoint (384 480); bounds = CGRect (0 0; 768 960); delegate = <UIView: 0xa034690; frame = (0 0; 768 960); autoresize = W+H; layer = <CALayer: 0xa034780>>; sublayers = (<CALayer: 0xa033010>); backgroundColor = <CGColor 0xa034960> [<CGColorSpace 0xa02b3b0> (kCGColorSpaceDeviceRGB)] ( 1 1 1 1 )>
デバイス上
ビューアドレスではなく、ブレークポイント条件でレイヤーアドレスを使用することを忘れないでください。
(lldb) po self.view
(UIView *) $0 = 0x1f031a10 <UIView: 0x1f031a10; frame = (0 20; 768 1004); autoresize = W+H; layer = <CALayer: 0x1f031b00>>
(lldb) break set -F '-[CALayer setBounds:]' -c '$r0 == 0x1f031b00'
Breakpoint created: 2: name = '-[CALayer setBounds:]', locations = 1, resolved = 1
ブレークポイントに到達すると、CALayer
インスタンスはによって参照され$r0
、新しいXの原点はに$r2
あり、新しいYの原点はに$r3
あり、新しいサイズは*(CGSize *)$sp
次のようになります。
(lldb) po $r0
(unsigned int) $7 = 520297216 <CALayer:0x1f031b00; position = CGPoint (384 480); bounds = CGRect (0 0; 768 1004); delegate = <UIView: 0x1f031a10; frame = (0 -22; 768 1004); autoresize = W+H; layer = <CALayer: 0x1f031b00>>; sublayers = (<CALayer: 0x1f030840>); backgroundColor = <CGColor 0x1f031ce0> [<CGColorSpace 0x1e530ad0> (kCGColorSpaceDeviceRGB)] ( 1 1 1 1 )>
(lldb) p/f $r2
(unsigned int) $14 = 0
(lldb) p/f $r3
(unsigned int) $15 = 0
(lldb) p *(CGSize *)$sp
(CGSize) $16 = (width=768, height=960)
(lldb) finish
(lldb) po 0x1f031b00
(int) $17 = 520297216 <CALayer:0x1f031b00; position = CGPoint (384 480); bounds = CGRect (0 0; 768 960); delegate = <UIView: 0x1f031a10; frame = (0 0; 768 960); autoresize = W+H; layer = <CALayer: 0x1f031b00>>; sublayers = (<CALayer: 0x1f030840>); backgroundColor = <CGColor 0x1f031ce0> [<CGColorSpace 0x1e530ad0> (kCGColorSpaceDeviceRGB)] ( 1 1 1 1 )>