Получение NSPoint подвида при наведении курсора мыши в NSWindow

#cocoa #subview #mouseup

#cocoa #подвид #наведение курсора мыши

Вопрос:

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

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

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

В 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:

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

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

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