تطبيق السكتة الدماغية على مستقيم مستدير في الفجوات الأساسية
-
24-09-2019 - |
سؤال
لديّ تدرج يدور حول الزوايا التي أستخدمها لخلفية uitableviewcell المخصصة. أحاول تطبيق سكتة دماغية على المسار ولكن لا يمكنني فعل ذلك تمامًا ، ولا أستطيع أن أرى أين أخطئ.
CGFloat minx = CGRectGetMinX(rect) , midx = CGRectGetMidX(rect), maxx = CGRectGetMaxX(rect) ;
CGFloat miny = CGRectGetMinY(rect) , maxy = CGRectGetMaxY(rect) ;
minx = minx + 1;
miny = miny ;
maxx = maxx - 1;
maxy = maxy - 1;
CGContextMoveToPoint(c, minx, miny);
CGContextAddArcToPoint(c, minx, maxy, midx, maxy, kDefaultMargin);
CGContextAddArcToPoint(c, maxx, maxy, maxx, miny, kDefaultMargin);
CGContextAddLineToPoint(c, maxx, miny);
CGContextAddLineToPoint(c, minx, miny);
// Fill and stroke the path
CGContextClip(c);
CGContextStrokePath(c);
CGFloat locations[2] = { 0.0, 1.0 };
CGFloat mycomponents[8] = TABLE_CELL_BACKGROUND;
CGColorSpaceRef myColorspace = CGColorSpaceCreateDeviceRGB();
CGGradientRef myGradient = CGGradientCreateWithColorComponents(myColorspace, mycomponents, locations, 2);
CGContextDrawLinearGradient(c, myGradient, CGPointMake(minx,miny), CGPointMake(minx,maxy), 0);
CGGradientRelease(myGradient);
CGColorSpaceRelease(myColorspace);
يربط هذا الكود المستطيل اليمين ويطبق التدرج ، لكنه لا يضرب الصف. أين خطأي؟
تعديل:وفقًا لتوصيات SUBW ، قمت بتغيير الكود ليكون:
CGContextRef c = UIGraphicsGetCurrentContext();
CGColorSpaceRef myColorspace = CGColorSpaceCreateDeviceRGB();
CGGradientRef myGradient = nil;
CGFloat components[8] = TABLE_CELL_BACKGROUND;
CGContextSetFillColorWithColor(c, [[UIColor redColor] CGColor]);
CGContextSetStrokeColorWithColor(c, [[UAColor redColor] CGColor]);
CGContextSetLineWidth(c, 2);
CGFloat minx = CGRectGetMinX(rect) , midx = CGRectGetMidX(rect), maxx = CGRectGetMaxX(rect) ;
CGFloat miny = CGRectGetMinY(rect) , maxy = CGRectGetMaxY(rect) ;
minx = minx + 1;
miny = miny ;
maxx = maxx - 1;
maxy = maxy - 1;
CGContextMoveToPoint(c, minx, miny);
CGContextAddArcToPoint(c, minx, maxy, midx, maxy, kDefaultMargin);
CGContextAddArcToPoint(c, maxx, maxy, maxx, miny, kDefaultMargin);
CGContextAddLineToPoint(c, maxx, miny);
CGContextAddLineToPoint(c, minx, miny);
// Fill and stroke the path
CGContextSaveGState(c);
CGContextClip(c);
CGFloat locations[2] = { 0.0, 1.0 };
CGFloat mycomponents[8] = TABLE_CELL_BACKGROUND;
CGColorSpaceRef myColorspace = CGColorSpaceCreateDeviceRGB();
myGradient = CGGradientCreateWithColorComponents(myColorspace, mycomponents, locations, 2);
CGContextDrawLinearGradient(c, myGradient, CGPointMake(minx,miny), CGPointMake(minx,maxy), 0);
CGContextRestoreGState(c);
CGContextStrokePath(c);
لكن المستقيم يخرج هكذا ...
... بدون حدود. إذا قمت بتغيير CGContextStrokePath(c)
ان نكون CGContextStrokeRect(c, rect)
, ، تظهر السكتة الدماغية (جعلتها حمراء للتوضيح). لكن بطريقة ما ، عند ضرب المسار ، لا أصاب بأي ضربة :(
المحلول
الرد على الرمز المنقح الخاص بك ، أقتبس الوثائق:
على عكس المسار الحالي ، فإن مسار القطع الحالي هو جزء من حالة الرسومات. لذلك ، لإعادة تعزيز المنطقة القابلة للطلاء عن طريق استعادة مسار القطع إلى حالة سابقة ، يجب عليك حفظ حالة الرسومات قبل قصك واستعادة حالة الرسومات بعد إكمال أي رسم مقص.
بعد تحديد مسار القطع الجديد ، تعيد الوظيفة إعادة تعيين المسار الحالي للسياق إلى مسار فارغ.
لذلك ، مسار الرسم الحالي هو ليس جزء من حالة الرسومات. إذن هذا ما تفعله:
- بناء مسار الرسم
- حفظ GSTATE
- أضف مسار الرسم الحالي إلى مسار القطع ؛ مسار الرسم الحالي
- رسم التدرج
- استعادة GSTATE (يتم استعادة مسار القطع السابق ؛ مسار الرسم يبقى فارغًا)
- لا شيء
يتمثل الحل في رسم المسار إلى كائن CGPath ، ثم إضافته كمسار حالي قبل القطع (بعد حفظ GSTATE) وقبل التمسيد.
يجب أن تقرر أيضًا ما إذا كنت تريد أن تكون هذه السكتة الدماغية الخارجية أو السكتة الدماغية الداخلية أو السكتة الدماغية المتمركزة. للسكتة الدماغية المتمركزة ، السكتة الدماغية في حين لم يتم قصها. للسكتة الدماغية الداخلية ، والسكتة الدماغية أثناء قصها. للسكتة الدماغية الخارجية ، عكس المسار ، ثم مقطع ، ثم السكتة الدماغية. ستحتاج إلى مضاعفة عرض خطك لكلا النموذجين الأخيرين ، حيث ستقوم بإخراج نصف السكتة الدماغية.
إذا قمت بتغيير
CGContextStrokePath(c)
ان نكونCGContextStrokeRect(c, rect)
, ، تظهر السكتة الدماغية.
لأن هذه الوظيفة تضيف مسارًا لهذا المستطيل إلى مسار الرسم الحالي قبل التمسيد.
نصائح أخرى
لست متأكدا ، ولكن ربما كنت ترسم التدرج على السكتة الدماغية؟
أنت إما ترسم التدرج على السكتة الدماغية ، و/أو تقطيع المنطقة التي تشكلها السكتة الدماغية.
أعتقد أن ما يلي قد يعمل بشكل أفضل:
CGContextSaveGState(c);
CGContextClip(c);
//gradient drawing stuff
CGContextRestoreGState(c);
CGContextStrokePath(c);
بالطبع ، عليك أيضًا ضبط لون السكتة الدماغية والعرض بشكل صحيح.