PruitIgoe
PruitIgoe

Reputation: 6384

Objective-C: Get closest NSView to dragged NSView

If I have a NSView with 10 subviews, and I drag one of the subviews, what is the easiest way to determine which of the remaining views is closes to the dragged one? My code is working but I somehow feel I'm using a monkey wrench to fine tune a violin. Is there a more elegant way?

subviews is an array of the subviews of the parent view of this view (so it includes this view)
the toolTip of the sub views contain their page # formatted like "Page_#"

- (void) mouseUp: (NSEvent* ) e {

    //set up a ridiclous # for current distance
    float mtDistance = 12000000.0;

    //get this page number
    selfPageNum = [[[self toolTip] substringFromIndex:5] intValue];

    //set up pageViews array
    pageViews = [[NSMutableArray alloc] init];

    //loop through the subviews
    for (int i=0; i<[subviews count]; i++) { 

            //set up the view
            thisView = [subviews objectAtIndex:i];

            //filter for view classes
            NSString* thisViewClass = [NSString stringWithFormat:@"%@", [thisView className]];
            if ( [thisViewClass isEqual:@"Page"]) { 

                    //add to the pageViews array
                    [pageViews addObject:thisView];

                    if (self != thisView) { 
                            //get the view and self frame
                            NSRect movedViewFrame = [self frame];
                            NSRect thisViewFrame = [thisView frame];

                            //get the location area (x*y)
                            float movedViewLoc = movedViewFrame.origin.x * (movedViewFrame.origin.y * -1); 
                            float thisViewLoc = thisViewFrame.origin.x * (thisViewFrame.origin.y * -1); 

                            //get the difference between x locations
                            float mtDifference = movedViewLoc - thisViewLoc;
                            if (mtDifference < 0) { 
                                    mtDifference = mtDifference * -1;
                            }

                            if (mtDifference < mtDistance) { 
                                    mtDistance = mtDifference;
                                    closesView  = thisView;
                            }
                    }

            }//end class check
      }//end loop

//....more stuff

}

Upvotes: 0

Views: 108

Answers (1)

Jacob Jennings
Jacob Jennings

Reputation: 2836

http://en.wikipedia.org/wiki/Distance

distance formula

sqrt(pow((x2 - x1), 2) + pow((y2 - y1), 2)))

Edit: Since you only need to find the shortest distance, not exact distances, you don't need to take the square root. Thanks for the insight Abizern

pow((x2 - x1), 2) + pow((y2 - y1), 2)

Upvotes: 2

Related Questions