Получение NSPoint подвида на mouseUp в NSWindow

У меня есть приложение, в котором я создаю два подпредставления главного окна, подпредставления относятся к классу Page, и в каждом подпредставлении я размещаю еще одно подпредставление класса с именем Ad. Я перетаскиваю классы объявлений между подвидами страницы. Первоначально я просто сбрасывал кадр представления класса Ad, но я действительно хочу поместить его туда, где происходит событие NLSleftMouseUp.

Мой процесс для этого заключается в регистрации всех подвидов Page в массиве по мере их создания. Затем я создал подкласс NSWindow и назначил этот класс моему главному окну в IB. Я передаю массив просмотров страниц этому классу.

Я думаю перезаписать метод sendEvent, проверяя, является ли событие NSLeftMouseDown, NSLeftMouseDragged или NSLeftMouseUp. NLSleftMouseDown должен проверить и посмотреть, является ли нажатое подпредставление самым глубоким подпредставлением иерархии окон - класс окна-> Класс страницы-> Класс объявлений, поскольку я хочу перемещать рекламу, а не страницы. Я перебираю массив, а затем проверяю метод потомка NSView (Ad), по которому щелкнули, чтобы увидеть, является ли он потомком перечисляемого NSView (Page). (Надеюсь, это имело смысл). Затем я стягиваю и его раму.

В NLSleftMouseDragged я изменяю курсор, чтобы он напоминал перетаскиваемую рекламу.

В NLSleftMouseUp я проверяю, в какое представление мы хотим переместить рекламу. Чего я не могу понять, так это того, как получить NSPoint для NSLeftMouseUp в этом представлении, я могу получить его для окна, но x/y этой точки будет далеко для принимающего подпредставления... как мне получить NSPoint в подвиде?

...
} else if ([e type] == NSLeftMouseUp) {

    //get which view we are going to drop the ad on
    landingView = [[self contentView] hitTest:[e locationInWindow]];

    /****ui question here for Mike:
     if the mouseup event is not on a page class, should the mouse remain the dragcursor image here or should 
     we change it back to the mouse icon and stop this process****/

    if ([[landingView className] isEqual:@"Page"]) { 

        //get ad rect
        float adX = thisAdFrame.origin.x + 10.0;
        float adY = thisAdFrame.origin.y + 20.0;

        //get nspoint of mouse up event
        NSPoint p = [e locationInWindow];

        [landingView addSubview:theSubView];
        [theSubView setFrame:NSMakeRect(p.x, p.y, thisAdFrame.size.width, thisAdFrame.size.height)];

    }

}
 ...

person PruitIgoe    schedule 08.11.2011    source источник


Ответы (1)


Возможно, вы захотите взглянуть на методы NSViews -convertPoint:fromView: и -convertPointFromBacking:, подобные этим, которые помогают преобразовывать прямоугольники, точки и т. д. в другую систему координат.

Указание nil для fromView: преобразует его из окна этого представления. Этот код будет применяться к вам:

NSPoint eventLocation = [theSubView convertPoint:p fromView:nil];
person Alex Zielenski    schedule 08.11.2011