Получаване на NSPoint на subview на mouseUp в NSWindow

Имам приложение, в което създавам два подизгледа на главния прозорец, подизгледите са от клас, наречен Page, и на всеки подизглед поставям друг подизглед на клас, наречен Ad. Плъзгам рекламните класове между подизгледите на страницата. Първоначално просто нулирах рамката на изгледа на рекламния клас, но това, което наистина искам да направя, е да я поставя там, където се случва събитието NSLeftMouseUp.

Моят процес за това е да регистрирам всички подизгледи на страници в масив, докато се създават. След това направих подклас на NSWindow и присвоих този клас на главния ми прозорец в IB. Предавам масива от изгледи на страници към този клас.

Мисля, че презаписвам метода sendEvent, като проверявам дали събитието е NSLeftMouseDown, NSLeftMouseDragged или NSLeftMouseUp. NSLeftMouseDown трябва да провери и да види дали кликнатият подизглед е най-дълбокият подизглед на йерархията на прозореца - прозорец->Клас на страница->Клас на реклама, тъй като искам да премествам реклами, а не страници. Преминавам през масива и след това проверявам метода 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)];

    }

}
 ...

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