Pregunta

Estoy usando el kit de método de entrada e intento colocar una ventana debajo de un texto.

_currentClient es un IMKTextInput instancia

candidatos es un IMKCandidates instancia

// 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];

Ahora sé que el windowInsertionPoint La variable está bien, cuando depuro puedo ver su valor, por ejemplo:Punto NS:{647,365}

Sin embargo, cuando uso esto, la ventana del candidato simplemente se muestra en la esquina inferior izquierda de la pantalla.No he trabajado antes con la colocación de cosas en la pantalla, por lo que se agradece la ayuda.

Si paso valores estáticos arbitrarios a setCandidateFrameTopLeft, se coloca en la pantalla.Las siguientes obras:

[candidates setCandidateFrameTopLeft:NSMakePoint(401, 354)];

¿Es un problema de puntero?

¿Fue útil?

Solución

Vale, la solución a esto es que soy un idiota.Aquí está el código que necesitas:

NSRect tempRect;
NSDictionary* clientData = [_currentClient attributesForCharacterIndex:0 lineHeightRectangle:&tempRect];
NSPoint windowInsertionPoint = NSMakePoint(NSMinX(tempRect), NSMinY(tempRect));

La documentación para Atributos IMKTextInputParaCharacterIndex dice

líneaRect:Al regresar, un rectángulo que enmarca un rectángulo de un píxel de ancho con la altura de la línea.Este rectángulo está orientado de la misma manera que la línea.

Esto significa que devuelve un NSRect a la variable que le pasó para el lineHeightRectangle valor.El punto importante es que la ubicación de ese NSRect es la ubicación del personaje que estás buscando.Entonces, entonces solo necesitas hacer un punto desde ese rectángulo y usar NSMinY para el valor Y.El rectángulo tiene solo un píxel de ancho, por lo que Mín/Máx para X son básicamente iguales.

Otros consejos

Probablemente ya no tengas este problema, pero esto también funciona en el futuro:

            [candidates show:kIMKLocateCandidatesBelowHint];
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top