وضع نافذة NSPoint وIMKCandidate
-
11-12-2019 - |
سؤال
أنا أستخدم مجموعة أدوات الإدخال وأحاول وضع نافذة أسفل بعض النص.
_currentClient هو IMKTextInput
مثال
المرشحين هو IMKCandidates
مثال
// Get the current location to place the window
NSRect tempRect = NSMakeRect(0, 0, 0, 0);
NSDictionary* clientData = [_currentClient attributesForCharacterIndex:0 lineHeightRectangle:&tempRect];
NSPoint* windowInsertionPoint = (NSPoint*)[clientData objectForKey:@"IMKBaseline"];
...
[candidates setCandidateFrameTopLeft:*windowInsertionPoint];
[candidates showCandidates];
الآن، أعلم أن windowInsertionPoint
المتغير جيد، عندما أقوم بتصحيح الأخطاء أستطيع أن أرى قيمته، على سبيل المثال:نس بوينت:{647,365}
ولكن عندما أستخدم هذا، تظهر نافذة المرشح فقط في الزاوية اليسرى السفلية من الشاشة.لم أعمل مع وضع الأشياء على الشاشة من قبل، لذا نقدر المساعدة.
إذا قمت بتمرير قيم ثابتة عشوائية إلى setCandidateFrameTopLeft
, ، يتم وضعه على الشاشة.الأعمال التالية:
[candidates setCandidateFrameTopLeft:NSMakePoint(401, 354)];
هل هي مشكلة المؤشر؟
المحلول
حسنًا، الحل لهذا هو أنني أحمق.إليك الكود الذي تحتاجه:
NSRect tempRect;
NSDictionary* clientData = [_currentClient attributesForCharacterIndex:0 lineHeightRectangle:&tempRect];
NSPoint windowInsertionPoint = NSMakePoint(NSMinX(tempRect), NSMinY(tempRect));
الوثائق ل IMKTextInput attributesForCharacterIndex يقول
خط مستقيم:في المقابل، مستطيل يحيط بمستطيل بعرض بكسل واحد مع ارتفاع الخط.يتم توجيه هذا المستطيل بنفس الطريقة التي يتم بها توجيه الخط.
هذا يعني أنه يُرجع NSRect إلى المتغير الذي قمت بتمريره إليه lineHeightRectangle
قيمة.النقطة المهمة هي أن موقع NSRect هو موقع الشخصية التي تبحث عنها.لذا، فأنت بحاجة فقط إلى تحديد نقطة من هذا المستطيل واستخدام NSMiNY للقيمة Y.يبلغ عرض المستطيل بكسل واحد فقط، لذا فإن Min/Max لـ X متماثلان بشكل أساسي.
نصائح أخرى
ربما لا تملك هذه المشكلة بعد الآن، ولكن هذا يعمل أيضا، للمستقبل: giveacodicetagpre.