深く理解する編UScrlerView

3924 ワード

回転:http://www.mamicode.com/info-detail-1144770.html
次に、自分の考えを整理して、深く理解します。 UScrrollView
 
基本点: 
1.UScrrollViewはUID Viewです。
UICViewはそれぞれ一つのboundsとframeがあります。界面をレイアウトするときは,ビューのframeを処理する必要がある。これにより、ビューのサイズを設定することができます。ビューのframeとboundsのサイズはいつも同じですが、彼らのオリジナルは異なる可能性があります(boundsの原点は(0,0)点(view自体の座標システムです。デフォルトは常に0点、0点です。setbounds関数を呼び出しない限り、frameの原点は任意です。(親ビューの座標位置に対して)。   この二つの仕事原理を理解することはUScrrollViewを理解するための鍵です。
 
2.UID Viewの boundsとframe工作原理
ここに概念があります ラスター化 和 組み合わせ ,   私の簡単な理解:
ラスター化 :  簡単に言えば、図形描画命令のセットを作成して、画像を生成します。(これらの画像は画面に描かれていません。自分のビューで次のステップに残しておきます。)
組み合わせ :  ラスター化した後、スクリーンは実際には空です。何も見えません。でも、実際にはもう表示されました。この時、これらの写真は次々に描きました。スクリーンの大きさの写真を作ります。これは組み合わせです。この時、スクリーンにはあなたの描いたものが見えます。もう一つは、ビュー階層(view hierarchy)が、組み合わせに対してどのようにして重要な役割を果たしていますか?ビューの画像は、その親ビューの画像の上に組み合わせられています。そして、組み合わせられた画像を親ビューの親ビューの写真の上に組み合せます。最終的なビューの階層の一番上の部分はウィンドウです。その組み合わせの写真は私達が見たものです。
 
結び:上の2つの絵の形と過程を知ってからboundsがなぜ一般的に(0,0)なのか、Frameが親コントロールを軸としているのか、ちょっと分かります。
 
ラスター化のステップでは、ビューはすぐに起こる組み合わせのステップには関心がなく、この時点でビューは自分のcontentを描くことだけに関心があります。この描画は各ビューのDRawRect:メソッドで行われます。 DRawRect:メソッドが呼び出される前に、ビューのために空白の画像を作成してcontentを作成します。この画像の座標システムはビューのboundsです。ほぼ各ビューのboundsのorigginは{0,0}です。したがって、削除画像の左上に何かを描くと、boundsのoriggin({x:0,y:0}に描きます。一つの絵の右下のところにものを描く時、あなたは必ず「x:width,y:height」のところに描きます。あなたの絵がビューのboundsを超えたら、超えた部分は削除された画像の一部ではなく、廃棄されます。
 
組み合わせのステップでは、各ビューは自分のラスター画像を自分の親ビューのラスター画像の上に結合します。ビューのframeは、自分の親ビューにおける描画位置を決定し、frameのorigginは、ビューのラスタ画像の左上の角度が親ビューのラスター画像の左上の角度に対してオフセット量を示している。だから、一つのオリジンは{x:20、y:15}のframeで描いた写真の左側は父のビューから20時で、上は父のビューから15時です。ビューのframeとboundsの長方形の大きさはいつも同じですので、ラスター画像の組み合わせはピクセルがそろっています。これはラスター化画像が引張または縮小されないことを確認した。
 
結び:boundとframeの大きさが同じで、位置が違う深い原因です。
 
組み合わせると、ビュー画像の左上の角がframeのorigginによってオフセットされ、親ビューの画像に描画されます。
//     X  =      frameX  -        X 
CompositedPosition.x = View.frame.origin.x - Superview.bounds.origin.x( 0);
//     Y  =      frameY  -        Y 
CompositedPosition.y = View.frame.origin.y - Superview.bounds.origin.y(      0);
 
 
3.UScrrollViewのConttent Offset 仕事の原理
 
IOSという組み合わせの原理のために、UScrrollViewの作業原理はこのように持ち出されました。
コンビネーションポイントの位置(Compsited Position.x、 Compsited Position.yは、親ビューにサブビューを組み合わせた位置です。
(余談です。UID Viewは全部そうです。ラスター化と組み合わせの原理は同じです。)
上の公式によると、 
View.frame.origgin.xの値と Superview.bounds.origgin.yの値は、 すべての結合点の値を変更できます。
 
例を言えば分かりやすいでしょう。
UIView *view = [[UIView alloc] init];
view.frame = CGRectMake(10,10,100,100);
view.background = [UIColor redcolor];
[self.view addSubviews:view];

UIButton *btn = [[UIButton alloc] init]
btn.frame = (10, 10,10,10);
[view addSubviews:btn];

UIButton *btn2 = [[UIButton alloc] init]
btn.frame = (20, 20,10,10);
[view addSubviews:btn2];

UIButton *btn3 = [[UIButton alloc] init]
btn.frame = (30, 30,10,10);
[view addSubviews:btn3];

/*       
         :  ,view      100 * 100      ,     , btn,btn2,btn3      10 * 10      
(    ,       ,)

      , view    view,  view   (       ?   Superview.bounds.origin ,     (10 ,10)     VIew  (0 , 0)),      view  。   button     。

    。btn        ?    view  (10,10)(20,20)(30,30)  ,
      btn.frame.origin.x, - view.bound.origin.x
  ,    view.bound.origin ,  view bound ,    (-10,-10),  draw:rect         ,      ,3 btn      view  {0,0}  ,                 ? UIScrollView       !!!


*/
 
 
 
UICScrrollViewの仕事原理は、scroll view.boundsのorigginを変えることです。(実は自然に考えられます。なぜView.frame.origgin.xを変えないのですか?リンゴが好きですか?道理容後に説明します。)
 
 
 
そのcontentOffsetプロパティを設定すると、scroll view.boundsのorigginが変わります。実は、contentOffsetは実際に存在していません。コードはこのように見えます。
 
【UIコントロールのまとめ】【UScrrollView】深く理解するためのUScrlerView】