66785


<https://developer.apple.com/design/resources/> に `0.5`
を指定しているところがあるので、同じようにできないか？
と聞かれ、`AutoLayout`（厳密には`UIView`）では、できない認識だったので、「できないな」と思ったのですが、公式のデザインリソースがそんなことをするのもおかしいと思い、よく見てみると、Inner
Shadows の Y に `0.5` と `-0.5`が指定されていました。

他にも <https://stackoverflow.com/a/37671379/1979953> で `CAGradientLayer`
を操作していますが、`0.5`をしている箇所がありました。

`CALayer`なら小数点を指定してもよいものなのでしょうか？


CC BY-SA 4.0
2020-05-19T02:24:13.400
66759
2020-05-19T16:36:42.980
9008
question
swift ios
レイヤーなら小数点を指定できる？


まずCGRect、CGPoint、CGSizeなどビューの座標系の値に整数でない数値を指定できるかについていうと、指定できます。

相手がUIViewでもCALayerでも関係ありません。意味があるかどうかは別として（後述します）、0.5ポイント単位の座標や長さ、もっと細かい単位の数値を指定することもできます。

次に整数ではない値を指定した場合にどのような効果があるかを説明します。

参考資料としてこちらの[ドキュメント](https://developer.apple.com/library/archive/documentation/2DDrawing/Conceptual/DrawingPrintingiOS/GraphicsDrawingOverview/GraphicsDrawingOverview.html#//apple_ref/doc/uid/TP40010156-CH14-SW7)、または[こちらの回答](https://stackoverflow.com/questions/8016618/how-
to-get-a-1-pixel-line-with-nsbezierpath)の図を見ると分かりやすいと思います。

[![画像の説明をここに入力](https://i.stack.imgur.com/pT3gg.png)](https://i.stack.imgur.com/pT3gg.png)

上の画像は前者のAppleのドキュメントに載っている図です。

iPhone 4が発売される前は１ポイントが画面の１ピクセルに対応していました。そのとき１ポイントの幅を持つ縦の線を描画することを考えます。

iOSのネイティブの描画システムでは指定した座標が中央に来るように線がひかれます（上記の図の右の例）。

この場合１ポイントを１ピクセルとして描画しようとすると左右のピクセル境界に調整されて２ピクセルの幅の線になってしまいます。合わせて１ピクセルの線を２ピクセルとして描画しているのでアンチエイリアスがかかります。

そうすると、１ピクセルのソリッドな線を描画したい場合には不適切でぼやけた２ピクセルの線が描画されてしまうことになります。  
それを避けて、１ピクセルのソリッドな線を描画するにはOriginの座標を0.5ポイント、オフセットすると１ピクセルの幅の線がちょうどピクセル境界に一致するので１ピクセルのソリッドな線が描画されます（上の図の左の例。左端を0としてx方向を2.5ポイントと指定すると（`x:
2.5, y: 0, width: 1, height: 5`）2.5ポイントの中央を通る１ピクセルの線、が描けます）。

iPhone 4以降のRetina
Displayでは１ポイントは２ピクセル以上になるので0.5ポイントのオフセットをしなくてもピクセル境界に合致した線が描画できます。

ただし、今度は物理的な画面で１ピクセルの極細線を描画したい場合に整数値ではできないので、0.5ポイント以下の幅や長さを指定する（DisplayのScaleの値を使って割ることが多い）ことで、１ピクセルの描画が実現できます。

まとめると、ネイティブの描画システムの特性を利用してピクセルの境界に合致してアンチエイリアスを避けたり、１ピクセルの細かい描画をしたい場合に整数ではない値を指定します。


CC BY-SA 4.0
2020-05-19T16:36:42.980
66785
2020-05-19T16:36:42.980
5519
66759
answer