لماذا تعرض قواعد الأقواس الكوارتز أكثر سمكا من الخطوط المستقيمة؟

StackOverflow https://stackoverflow.com/questions/900053

سؤال

أحاول إنشاء uibutton مخصص يجب أن تبدو وكأنها uibuttontyperoundedrect. في درجتي: أخلق مسارا مع أول مكالمة واحدة إلى cgcontextmovetopoint () ثم أربعة مكالمات إلى cgcontextaddarcc (). ثم ضرب المسار. ومع ذلك، في الصورة الناتجة الزوايا الأربعة مدورة أكثر سمكا بوضوح من بقية المسار.

لقد اشتبهت في أن هذا لديه علاقة مع مكافحة التعرج، لذلك حاولت تبديله مع cgcontextsetshouldantialias ()، ولكن بعد ذلك بدا الأمر سوءا. لقد حاولت أيضا تجريب عرض الخط، لكن الأقواس هي أكثر سمكا دائما من الخطوط المستقيمة. تبدو أبل uibuttyperoundEdrect بشكل جيد تماما، لذلك يجب أن يكون من الممكن حلها بطريقة أو بأخرى. هل لدى أي شخص فكرة؟

تحرير: الرمز المناسب:

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 بتعيين منطقة لقطة مريحة على الحدود الدقيقة للمستطيل الزر، ولكن عندما تسأل Cocoa رسم خط على طول الحافة، يتم رسم نصف الخط بالضبط خارج مستطيل لقطة.

لاحظت الفرق في الزوايا المستديرة لأن الجزء المنحني يقع بالكامل داخل مستطيل لقطة، لذلك لا يتم قص أي منه.

الآن للحل:

دعونا نفترض أن الأسطر التي ترسمها هي بالضبط اثنين بكسل اثنين. هذا يعني أن بكسل واحد يرسم داخل مستطيل القطع، ويتم رسمه خارج (وبالتالي يتم تجاهله). كل ما عليك فعله هو رسم خطوطك بكسل واحد أقرب إلى وسط المستطيل. في حالة روتين رسم مخصص، ربما تستخدم:

NSRect myBounds = [self bounds];

ثم حساب نقاط الزاوية الخاصة بك من هناك. انعشاد، استخدم:

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

ويجب أن تكون جيدا للذهاب.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top