سؤال

وأنا أحاول لتنفيذ لون منقار في بلدي التطبيق الكاكاو. (نعم، وأنا أعلم عن NSColorPanel. أنا لا أحب ذلك كثيرا. والنقطة المتداول بلدي هو أنني أعتقد أنني يمكن أن نفعل ما هو أفضل.)

وهنا صورة للحالة الراهنة من بلدي منقار.


<الفرعية> (المصدر: ryanballantyne.name )

والآبار المحيطة عجلة الألوان هي الفئات الفرعية NSColorWell. يتم إنشاء مثيل أنها برمجيا، وأضاف إلى العرض عجلة الألوان (وهي فئة فرعية NSView) عن طريق الاتصال addSubView على الطبقة عجلة الألوان.

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

وهنا هو رمز الحدث الماوس أحاول جعل العمل:

- (void)mouseMoved:(NSEvent*)event
{
    NSLog(@"I am over here!\n");

    [super mouseMoved:event];

    NSPoint eventPoint = [self convertPoint:[event locationInWindow] fromView:nil];
    BOOL isInHandle = [grabHandle containsPoint:eventPoint];
    if (isInHandle && [NSCursor currentCursor] != [NSCursor openHandCursor])  {
        [[NSCursor openHandCursor] push];
    }
    else if (!isInHandle)  [NSCursor pop];
}

- (void)mouseEntered:(NSEvent*)event
{
    [[self window] setAcceptsMouseMovedEvents:YES];
}
- (void)mouseExited:(NSEvent*)event
{
    [[self window] setAcceptsMouseMovedEvents:NO];
    [NSCursor pop];
}

- (BOOL)acceptsFirstResponder
{
    return YES;
}
- (BOOL)resignFirstResponder
{
    return YES;
}

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

وأي أفكار؟ شكرا!

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

المحلول

وmouseEntered: وmouseExited: لا تتبع الدخول / الخروج وجهة نظرك مباشرة. تعقبهم دخول / خروج أي مجال من المجالات تتبع كنت قد أنشئت في وجهة نظركم. الطرق ذات الصلة هي -addTrackingRect:owner:userData:assumeInside: و-removeTrackingRect:. يمر [self bounds] للمعلمة الأولى إذا كنت تريد وجهة نظرك كله لتعقبها. إذا كان تطبيقك 10.5+ فقط، ربما يجب عليك استخدام NSTrackingArea بدلا من ذلك أنها تدعم بصورة مباشرة الحصول على أحداث الماوس فقط تحرك داخل منطقة تتبع.

ونضع في اعتبارنا أن 1) تتبع rects لها نفس السلوك الغريب نوعا ما rects المؤشر ث / ص / ر استدارة جهات النظر، و2) إذا كان التغيير ساق (وليس مجرد الإطار الخاص بك) عليك ربما تحتاج إلى إعادة تأسيس المستطيل التتبع، لذلك حفظ العلامة في تتبع المستطيل لإزالته لاحقا.

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