質問

私はUIButtonTypeRoundedRectのようになりますカスタムUIButtonを作成しようとしています。私のdrawRectで:,私はその後、CGContextAddArc 4つの呼び出しをCGContextMoveToPoint()への最初の呼び出しでパスを作成しています()。私はその後、ストロークパス。しかし、得られた画像内の4つの丸い角は、パスの残りの部分よりも明らかに厚い。

私は、これはアンチエイリアシングとは何かを持っていた疑いがあるので、私はCGContextSetShouldAntiAlias()でそれをオフにしようとしたが、それはさらに悪いことに見えました。私はまた、線幅を試してみましたが、弧は常に直線よりも厚いです。 AppleのUIButtonTypeRoundedRectは完全に正常に見えるので、何らかの形で解決することが可能でなければなりません。誰もが手掛かりを持っていますか?

編集:関連するコード:

CGContextRef context = UIGraphicsGetCurrentContext();
CGContextBeginPath(context);

CGContextMoveToPoint(context, rect.origin.x + kRoundedRectButtonRadius, rect.origin.y);
CGContextAddArc(context, rect.origin.x + rect.size.width - kRoundedRectButtonRadius, rect.origin.y + kRoundedRectButtonRadius, kRoundedRectButtonRadius, 3 * M_PI_2, 0, NO);
CGContextAddArc(context, rect.origin.x + rect.size.width - kRoundedRectButtonRadius, rect.origin.y + rect.size.height - kRoundedRectButtonRadius, kRoundedRectButtonRadius, 0, M_PI_2, NO);
CGContextAddArc(context, rect.origin.x + kRoundedRectButtonRadius, rect.origin.y + rect.size.height - kRoundedRectButtonRadius, kRoundedRectButtonRadius, M_PI_2, M_PI, NO);
CGContextAddArc(context, rect.origin.x + kRoundedRectButtonRadius, rect.origin.y + kRoundedRectButtonRadius, kRoundedRectButtonRadius, M_PI, 3 * M_PI_2, NO);

CGContextClosePath(context);
CGContextSetLineWidth(context, 1.7);
CGContextStrokePath(context);
役に立ちましたか?

解決

私は前に描画カスタムボタンでこれに遭遇しました。あなたが見ている行動は、の画素位置の周りにどのあなたがしてもらう中心にラインがをココアの描画ルーチンを描くという事実から生じます。私に説明してみましょう。

あなたはボタンの長方形の非常に端に秋を描いている直線。あなたの描画ルーチンが呼び出されると、Cocoaは便利なボタン長方形の正確な境界にクリッピング領域を設定しているが、あなたは、エッジに沿って線を描画するためにココアを頼むとき、ラインののちょうど半分はクリッピングの外側に描画されます四角形

湾曲部がクリッピング矩形内に完全落ち、それのいずれも離れてクリップされていないため、

あなたは丸い角の違いに気づく。

今すぐ解決のために:

あなたが描いているの線が正確に二つの画素太いあると仮定しましょう。これは、1つの画素がクリッピング矩形内描かれ、1が外部引き出される(従って無視される)ことを意味します。あなたがしなければならないのは、長方形の中心に1つのピクセルより近いあなたの線を引くです。カスタム描画ルーチンの場合は、おそらく使用しています:

NSRect myBounds = [self bounds];

そして、そこから自分のコーナーポイントを計算します。 INSEADは、使用します:

NSRect myProperBounds = NSInsetRect([self bounds], 1.0, 1.0);

そして、あなたが行くように良いことがあります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top