Преобразование между какао и углеродными координатами? - PullRequest
2 голосов
/ 15 ноября 2010

Я ищу надежный (я имею в виду работу во всех конфигурациях с несколькими муниторами) алгоритм преобразования точки / прямоугольника какао в углеродный эквивалент и обратной операции.

Я гуглил, но не смог найти что-то, что работает правильно.

Заранее спасибо за помощь.

С уважением,

Ответы [ 3 ]

3 голосов
/ 15 марта 2011

После нескольких итераций я попал в следующую категорию на NSScreen:

+ (NSScreen*) screenWithPoint: (NSPoint) p
{
    for (NSScreen *candidate in [NSScreen screens])
        if (NSPointInRect(p, [candidate frame]))
            return candidate;
    return nil;
}

+ (NSScreen*) screenWithMenuBar
{
    return [self screenWithPoint:NSZeroPoint];
}

+ (float) menuScreenHeight
{
    return NSMaxY([[self screenWithMenuBar] frame]);
}

+ (CGPoint) carbonPointFrom: (NSPoint) cocoaPoint
{
    return CGPointMake(cocoaPoint.x, [self menuScreenHeight] - cocoaPoint.y);
}

+ (NSPoint) cocoaPointFrom: (CGPoint) carbonPoint
{
    return NSMakePoint(carbonPoint.x, [self menuScreenHeight] - carbonPoint.y);
}

Это прекрасно работает даже с несколькими дисплеями.

1 голос
/ 11 октября 2013

Отправленный код из кода Apple от UIElementInspector, оказывается, глючит, поскольку он не учитывает происхождение не основного экрана. Исправленный (и переработанный) код выглядит так:

+ (CGPoint)carbonScreenPointFromCocoaScreenPoint:(NSPoint)cocoaPoint {
  NSScreen* foundScreen = nil;
  NSRect screenFrame;
  for (NSScreen* screen in [NSScreen screens]) {
    screenFrame = [screen frame];
    if (NSPointInRect(cocoaPoint, screenFrame)) {
      foundScreen = screen;
      break;
    }
  }
  if (! foundScreen) return CGPointMake(0.0, 0.0);
  return CGPointMake(cocoaPoint.x, 
    screenFrame.origin.y + screenFrame.size.height - cocoaPoint.y);
}
0 голосов
/ 22 августа 2013

Или возьмите код Apple из примера проекта UIElementInspector:

+ (CGPoint)carbonScreenPointFromCocoaScreenPoint:(NSPoint)cocoaPoint
{
    NSScreen *foundScreen = nil;
    CGPoint thePoint;

    for (NSScreen *screen in [NSScreen screens])
    {
        if (NSPointInRect(cocoaPoint, [screen frame]))
        {
            foundScreen = screen;
        }
    }

    if (foundScreen)
    {
        CGFloat screenHeight = [foundScreen frame].size.height;
        thePoint = CGPointMake(cocoaPoint.x, screenHeight - cocoaPoint.y - 1);
    }
    else
    {
        thePoint = CGPointMake(0.0, 0.0);
    }

    return thePoint;
}
...