Ho quattro UIViews su un (schermo diviso in quartili) UIScrollViewFinding oggetto più vicino al CGPoint
Sulle quartili, ho un paio di oggetti (UIImageViews), su ogni quartile.
Quando l'utente tocca lo schermo, voglio trovare l'oggetto più vicino al CGPoint specificato?
Qualche idea?
Ho il CGPoint e il frame (CGRect) degli oggetti all'interno di ciascun quartile.
UPDATE:
hRuler http://img.skitch.com/20100824-c333thq3rjcak9f5q5djjugjhw.preview.jpgPins rosso sono UIImageViews.
// UIScrollView
NSLog(@" UIScrollView: %@", self);
// Here's the tap on the Window in UIScrollView's coordinates
NSLog(@"TapPoint: %3.2f, %3.2f", tapLocation.x, tapLocation.y);
// Find Distance between tap and objects
NSArray *arrayOfCGRrectObjects = [self subviews];
NSEnumerator *enumerator = [arrayOfCGRrectObjects objectEnumerator];
for (UIView *tilesOnScrollView in enumerator) {
// each tile may have 0 or more images
for (UIView *subview in tilesOnScrollView.subviews) {
// Is this an UIImageView?
if ([NSStringFromClass([subview class]) isEqualToString:@"UIImageView"]) {
// Yes, here are the UIImageView details (subView)
NSLog(@"%@", subview);
// Convert CGPoint of UIImageView to CGPoint of UIScrollView for comparison...
// First, Convert CGPoint from UIScrollView to UIImageView's coordinate system for reference
CGPoint found = [subview convertPoint:tapLocation fromView:self];
NSLog(@"Converted Point from ScrollView: %3.2f, %3.2f", found.x, found.y);
// Second, Convert CGPoint from UIScrollView to Window's coordinate system for reference
found = [subview convertPoint:subview.frame.origin toView:nil];
NSLog(@"Converted Point in Window: %3.2f, %3.2f", found.x, found.y);
// Finally, use the object's CGPoint in UIScrollView's coordinates for comparison
found = [subview convertPoint:subview.frame.origin toView:self]; // self is UIScrollView (see above)
NSLog(@"Converted Point: %3.2f, %3.2f", found.x, found.y);
// Determine tap CGPoint in UIImageView's coordinate system
CGPoint localPoint = [touch locationInView:subview];
NSLog(@"LocateInView: %3.2f, %3.2f",localPoint.x, localPoint.y);
//Kalle's code
CGRect newRect = CGRectMake(found.x, found.y, 32, 39);
NSLog(@"Kalle's Distance: %3.2f",[self distanceBetweenRect:newRect andPoint:tapLocation]);
}
console debug
Ecco il problema. Ogni riquadro è 256x256. Il primo CGPoint di UIImageView convertito nel sistema di coordinate di UIScrollView (53.25, 399.36) dovrebbe essere spento con tapPoint (30,331). Perché la differenza ?? L'altro punto a destra del punto toccato sta calcolando più vicino (distanza saggio) ??
<CALayer: 0x706a690>>
[207] TapPoint: 30.00, 331.00
[207] <UIImageView: 0x7073db0; frame = (26.624 71.68; 32 39); opaque = NO; userInteractionEnabled = NO; tag = 55; layer = <CALayer: 0x70747d0>>
[207] Converted Point from ScrollView: 3.38, 3.32
[207] Converted Point in Window: 53.25, 463.36
[207] Converted Point: 53.25, 399.36 *** Looks way off!
[207] LocateInView: 3.38, 3.32
[207] Kalle's Distance: 72.20 **** THIS IS THE TAPPED POINT
[207] <UIImageView: 0x7074fb0; frame = (41.984 43.008; 32 39); opaque = NO; userInteractionEnabled = NO; tag = 55; layer = <CALayer: 0x7074fe0>>
[207] Converted Point from ScrollView: -11.98, 31.99
[207] Converted Point in Window: 83.97, 406.02
[207] Converted Point: 83.97, 342.02
[207] LocateInView: -11.98, 31.99
207] Kalle's Distance: 55.08 ***** BUT THIS ONE's CLOSER??????
Questo è fondamentalmente andando richiedere un po 'di matematica. Le tue UIImageViews hanno le stesse dimensioni? –
Sì, lo sono. CGRect 26.624 71.68 32 39. Tutte le stesse dimensioni. – Jordan
Aggiunto aggiornamento con codice Image e Kalle. C'è qualcosa di strano quando converto il CGPoint di UIImageView nel sistema di coordinate UIScrollViews che butta via le coordinate e il codice di Kalle. Qualcuno può vedere cosa mi manca? – Jordan