Ios

iOS座標系



Ios Coordinate System



iOS座標系

参照リンク: http://www.jianshu.com/p/34dc7c2c974f



デカルトは平面直交座標系を発明し、座標系は点の位置の記述を容易にするために使用されます。 (極座標系、点は原点までの距離と角度の角度で表されます。)デカルト平面座標系に基づいて3次元座標系が表示されます。一般的に使用される3次元座標系は、左側の座標系と右側の座標系の2つのタイプに分けられます。座標系。 (親指はz軸を指し、他の4本の指はx軸からy軸をたどります)

Macでは、IOSのさまざまな座標系がインターリーブされますが、z軸の正の方向は常に観測者を指します。つまり、垂直スクリーン平面は上になります。



マック

Macでは、NSView座標系のデフォルトはRight hand coordinate system(Viewは実際には2次元座標系ですが、便宜上3次元座標系であると想定できますが、インターフェイスの変更はすべてxy平面上にあります。 )Origin in the lower left corner NSViewは、オーバーライドする方法を提供します

-(BOOL)isFlipped

これはデフォルトでNOになります。 YESが返されると、座標系は左側の座標系になり、座標原点は左上隅になります。

IOS

iOSのUIViewには、反転座標の概念はありません。Uniform use of the left-handed coordinate system, that is, the origin of the coordinates in the upper left cornerただし、フレームワークによって違いがあります。



  • UIKit(cocoa Touchレイヤーコアフレームワーク)Y軸下左手座標系

  • CALayerY軸下左座標系

  • Core Graphics(Quartz)Y軸直立右側座標系

  • OpenGL ESY軸直立右手座標系

    Core Animationは、CALayerのgeometryFlippedプロパティを介して両方のケースに適応できます。このプロパティは、Whether the coordinates of a layer are flipped vertically relative to the parent layerがBOOL型であると判断します。 YESに設定すると、サブレイヤーが垂直方向に反転します。

    OpenGL-ESは、iPhoneSDKの2Dおよび3Dレンダリングエンジンです。右手の座標系を使用します。その座標系もy軸上にあります。 z軸が考慮されていない場合、その座標系は2次元でQuartzと同じです。 (OpenGLレンダリング処理1.0、2.0から現在の3.0まで、固定パイプラインからプログラム可能なパイプラインまで、人々がコンピューター画面のデバイスディスプレイを介して最後の出力まで目を通して世界のオブジェクトを見るとき、高度なカスタム操作を提供しました、携帯電話の画面このプロセスで... ==後続の要約)

**コアグラフィックス描画を使用する座標系は、右手系の座標系です。 UIKitが提供する高レベルのメソッド(drawInRectメソッドなど)は自動的にCTMを処理するため、CGのコンテキストで自分で行う必要はありません。ただし、CG関連機能を使用する場合。 UIViewに描画するときは、CTMのFlip変換に注意する必要があります。そうしないと、インターフェイスのグラフィックが反転する現象が発生します。**


コンテキストに描画する前に座標系を反転します

CGContextTranslateCTM(context, 0, height) CGContextScaleCTM(context, 1.0, -1.0) CGContextDrawImage(context, CGRectMake(0, 0, width, height), uiImage.CGImage)

垂直反転射影行列

// The image is drawn upside down to the context CGContextDrawImage(context, CGRectMake(0, 0, width, height), uiImage.CGImage) // Set the upside down projection matrix (the original inverted image is back in the right direction) glMatrixMode(GL_PROJECTION) glLoadIdentity() glOrthof( 0, framebufferWidth, framebufferHeight, 0, -1, 1 )