سؤال

أنا مرتبك لماذا يتعطل تطبيقي مع هذا الخطأ.

لقد قمت بتنفيذ طريقة DisplayLayer (لتقديم Calayer). في المرة الأولى التي تدير فيها هذه الطريقة أشياء تعمل بشكل جيد. لكن المكالمات اللاحقة لهذه هي عند حدوث الخطأ.

يبدو أن الخطأ يحدث عندما يتم تعيين Self.bgcolor إلى لون ملء السياق. ومن المثير للاهتمام ... إذا قمت بإنشاء BGColor مباشرة قبل هذا الخط، والأشياء تعمل. ولكن كما تقف، يتم إنشاء BGColor عند تهيئة هذه الفئة (حاوية طريقة DisplayLayer).

-(void)displayLayer:(CALayer *)caLayer
{
  UIGraphicsBeginImageContext(caLayer.frame.size);
  CGContextRef context = UIGraphicsGetCurrentContext();    
  CGContextSetFillColorWithColor(context, self.bgColor);
  CGContextFillRect(context, CGRectMake(0, 0, 320, 25)); 
  [self drawText:context];
  // get image buffer
  UIImage *imageBuffer = UIGraphicsGetImageFromCurrentImageContext();
  UIGraphicsEndImageContext();
  // set layer contents to image buffer
  caLayer.contents = (id)[imageBuffer CGImage];
}
هل كانت مفيدة؟

المحلول

لم أفعل الكثير من برامج iPhone حتى الآن، ولم أستخدم أبدا متغير مثيل CGColor، فماذا أفعله هو:

@interface {
    ....
    UIColor *bgColor;
    ....
}
@property (nonatomic, retain) UIColor *bgColor;
...
@end

@implementation
@synthesize bgColor;
- (id)init {
    ...
    self.bgColor = [UIColor blackColor];
    ...
}
-(void)displayLayer:(CALayer *)caLayer {
    ...
    CGContextSetFillColorWithColor(context, self.bgColor.CGColor);
    ...
}
...
@end

Uicolor Blackcolor] بإرجاع كائن AutoreLeased، وقمت بتعيينها على متغير مثيلك دون الإبقاء عليه.

باستخدام Self.BGColor بدلا من BGColor فقط في INIT (INIX) وإنشاء العقار للاحتفاظ بقيمته، ستتأكد من الاحتفاظ باللون ويمكن استخدامها في DisplayLayer لاحقا.

كما ذكرت أنني لا أملك أي خبرة باستخدام CGColors مباشرة، ولهذا السبب أنا أستخدم Uicolor في التعليمات البرمجية أعلاه. يرجى ضبط حسب الحاجة.

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