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