الرسوم المتحركة البسيطة عن طريق تأخير الرسم
-
22-08-2019 - |
سؤال
وأنا أحاول لتنفيذ بعض خط بسيط جدا رسم الرسوم المتحركة لبلدي التطبيق فون. وأود أن رسم مستطيل على وجهة نظري بعد تأخير. أنا باستخدام performSelector
لتشغيل لي طريقة الرسم.
-(void) drawRowAndColumn: (id) rowAndColumn
{
int rc = [rowAndColumn intValue];
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetLineWidth(context, 2.0);
CGContextSetStrokeColorWithColor(context, currentColor.CGColor);
CGRect rect = CGRectMake(rc * 100, 100, 100, 100);
CGContextAddRect(context, rect);
CGContextDrawPath(context, kCGPathFillStroke);
}
ما ثم يتم استدعاؤه عن طريق:
int col = 10;
[self performSelector:@selector(drawRowAndColumn:)
withObject:[NSNumber numberWithInt:col]
afterDelay:0.2];
ولكن يبدو أنه عندما يتم إرسال رسالة drawRowAndColumn:
في الواقع، لم يعد لديه حق الوصول إلى CGContextRef
صالحة، وأنا على أخطاء مثل:
<Error>: CGContextAddRect: invalid context
إذا كنت محل performSelector
مع دعوة مباشرة إلى drawRowAndColumn
، أنه يعمل بشكل جيد. لذلك كان أول فكرتي لتمرير أيضا في CGContextRef
عبر performSelector
، لكنني لا يمكن أن يبدو لمعرفة كيفية تمرير الوسائط المتعددة في نفس الوقت (وهذا سؤال جيد آخر).
ما هو الخطأ في رمز أعلاه؟
المحلول
وأنت لا يمكن أن مجرد رسم في أي وقت من هذا القبيل. تحتاج إلى تنفيذ أسلوب drawRect:
من UIView ووضع التعليمات البرمجية الرسم في هناك.
للحصول على drawRect:
لاطلاق النار تحتاج إلى السماح الكاكاو تعرف أن وجهة النظر يحتاج إلى الانتباه. لذلك يمكنك الاتصال setNeedsDisplay
، أو setNeedsDisplayInRect:
.
وترجمة مباشرة محاولتك هذه الطريقة التي كنت أدعو setNeedsDisplay باستخدام performSelector: withObject: afterDelay - ولكن هذا ربما لا يكون وسيلة جيدة للقيام الرسوم المتحركة
. وهذا يعتمد ما كنت أحاول حقا القيام به - ولكن هل يمكن النظر، على سبيل المثال، وضع كود الرسم في drawRect
كما اقترحت، ولكن بدء عرض مخفي. هل يمكن أن ثم استدعاء setHidden: NO باستخدام performSelector لجعله يبدو بعد تأخير - أو هل يمكن أن يديروا على نحو سلس في خلال البدء لا يخفى، ولكن مع ألفا من 0، ثم تغيير ألفا إلى 1 داخل كتلة UIView الرسوم المتحركة (هناك الكثير حول هذا في مستندات).