سؤال

أنا أقوم بإنشاء NSCell فئة فرعية ترسم بعض الكائنات مباشرة على العرض (باستخدام drawInRect:fromRect:operation:fraction:respectFlipped:hints:) ويرسم أيضًا NSButton المثال ببساطة باستخدام NSView addSubview: محدد.

على الرغم من أن الكائنات المرسومة باستخدام الطريقة الأولى يتم رسمها بشكل صحيح، إلا أنني أواجه مشكلات في رسمها NSButton بشكل صحيح.المشكلة هي أن بلدي NSButton سيتم رسم المثيلات في الأماكن الصحيحة، ولكن عدة مرات.

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

كيف يمكنك أن تفعل هذا؟هل أنبح الشجرة الخطأ؟

هذا هو الكود المناسب:

- (void)drawInteriorWithFrame:(NSRect)cellFrame inView:(NSView *)controlView
{    
    NSRect _controlRect = cellFrame;

    float _Y = cellFrame.origin.y;

    NSRect _accessoryRect = NSMakeRect(_controlRect.size.width - 70.0f, _Y + 9.0f, 50.0f, 23.0f);

    _switch = [self _choiceSwitch];

    [_switch setFrame:_accessoryRect];
    [controlView addSubview:_switch];
}
هل كانت مفيدة؟

المحلول

قصة طويلة قصيرة: الأصدقاء لا يسمحون للأصدقاء addSubview, أثناء الرسم.

هذا أمر أساسي، و لا وأوضح بشكل خاص جانب من جوانب إدارة واجهات التحكم، ولكن من المهم التعامل معها.

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

من السهل أن تُحاصر في هذا الزقاق، السبب، مثل، مهلا، أضفت NSImageView في initWithFrame ويبدو أن كل شيء على ما يرام… ولكنها مجرد نوع من ليس كيف من المفترض أن تفعل ذلك, ، أعتقد ... وعندما تبدأ في التصنيف الفرعي NSControl، وما إلى ذلك.هو عندما تبدأ في إدراك السبب.

محدث: إليك كتابة جيدة حقًا حول تصميم عناصر التحكم المخصصة مع ال على قدم المساواة مع مشروع عينة كبيرة مرفق - والذي يجسد نوع تنظيم التعليمات البرمجية الذي يمكن أن يساعد في تجنب هذا النوع من المشكلات.على سبيل المثال..ستلاحظ في فئة وحدة التحكم كيف يبقي كل زر منفصلاً وفريدًا ومستقلاً عن أعمال طرق العرض الأخرى...

for (int butts = 0; butts < 3; butts++) {
    NSRect buttFrame = NSMakeRect(0, butts * 10, 69, 10);
    ExampleButt *butt = [[ExampleButt alloc]initWithFrame:buttFrame];
    [mainView addSubview:butt];
}

enter image description here

نصائح أخرى

"رسم" NSButton من المؤكد أن إضافة مثيلها إلى التسلسل الهرمي للعرض في كل مرة تقوم فيها برسم الخلية نفسها فكرة سيئة.بدلاً من ذلك، قم بإنشاء NSButtonCell وقم بتكوينه حسب ذوقك.ثم في الخاص بك -[NSCell drawInteriorWithFrame:inView:] استخدم خلية ivar لرسم مظهرها.

إذا كنت ترغب في الحصول على قابلة للنقر NSButton مثيل في كل خلية من عرض الجدول، حاول تجنب الاتصال بـ addSubview: عندما يكون ذلك ممكنا.في كل مرة تقوم فيها بذلك، قد يؤدي عرض التحكم إلى إبطال تخطيطه وإعادة رسم كل شيء من الصفر مما يؤدي إلى نوع من التكرار في حالتك.

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