تطبيق السكتة الدماغية على مستقيم مستدير في الفجوات الأساسية

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

سؤال

لديّ تدرج يدور حول الزوايا التي أستخدمها لخلفية 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);

يربط هذا الكود المستطيل اليمين ويطبق التدرج ، لكنه لا يضرب الصف. أين خطأي؟

alt text http://grab.by/26ye



تعديل:وفقًا لتوصيات 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);

لكن المستقيم يخرج هكذا ...

ALT TEXT http://grab.by/2714

... بدون حدود. إذا قمت بتغيير CGContextStrokePath(c) ان نكون CGContextStrokeRect(c, rect), ، تظهر السكتة الدماغية (جعلتها حمراء للتوضيح). لكن بطريقة ما ، عند ضرب المسار ، لا أصاب بأي ضربة :(

ALT TEXT http://grab.by/27am

هل كانت مفيدة؟

المحلول

الرد على الرمز المنقح الخاص بك ، أقتبس الوثائق:

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

بعد تحديد مسار القطع الجديد ، تعيد الوظيفة إعادة تعيين المسار الحالي للسياق إلى مسار فارغ.

cgContextClip

لذلك ، مسار الرسم الحالي هو ليس جزء من حالة الرسومات. إذن هذا ما تفعله:

  1. بناء مسار الرسم
  2. حفظ GSTATE
  3. أضف مسار الرسم الحالي إلى مسار القطع ؛ مسار الرسم الحالي
  4. رسم التدرج
  5. استعادة GSTATE (يتم استعادة مسار القطع السابق ؛ مسار الرسم يبقى فارغًا)
  6. لا شيء

يتمثل الحل في رسم المسار إلى كائن CGPath ، ثم إضافته كمسار حالي قبل القطع (بعد حفظ GSTATE) وقبل التمسيد.

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

إذا قمت بتغيير CGContextStrokePath(c) ان نكون CGContextStrokeRect(c, rect), ، تظهر السكتة الدماغية.

لأن هذه الوظيفة تضيف مسارًا لهذا المستطيل إلى مسار الرسم الحالي قبل التمسيد.

نصائح أخرى

لست متأكدا ، ولكن ربما كنت ترسم التدرج على السكتة الدماغية؟

أنت إما ترسم التدرج على السكتة الدماغية ، و/أو تقطيع المنطقة التي تشكلها السكتة الدماغية.

أعتقد أن ما يلي قد يعمل بشكل أفضل:

CGContextSaveGState(c);
CGContextClip(c);

//gradient drawing stuff

CGContextRestoreGState(c);
CGContextStrokePath(c);

بالطبع ، عليك أيضًا ضبط لون السكتة الدماغية والعرض بشكل صحيح.

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