Получение NSPoint для подпредставления mouseUp в NSWindow - PullRequest
2 голосов
/ 08 ноября 2011

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

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

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

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

В NSLeftMouseUp я проверяю, в какой вид мы хотим переместить объявление. Что я не могу понять, так это как получить 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)];

    }

}
 ...

1 Ответ

2 голосов
/ 09 ноября 2011

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

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

NSPoint eventLocation = [theSubView convertPoint:p fromView:nil];
...