2011-04-19 98 views
1

我只是一個菜鳥,我似乎無法找到錯誤。這是用於縮放,旋轉和移動UIImageView的一段代碼。我可以移動UIImageView,但是當我嘗試旋轉或縮放UIImageView時,它只是崩潰。我確實將setMultipleTouchEnabled設置爲YES。錯誤消息:「index 1 beyond bounds」

的崩潰是因爲:[NSArray objectAtIndex:]: index 1 beyond bounds [0 .. 0]

我認爲錯誤是在這部分文本:在先進的

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 

    NSArray *allTouches = [touches allObjects]; 

    UITouch* t; 
    if([[event allTouches] count]==1){ 
     if (CGRectContainsPoint([Birdie frame], [[allTouches objectAtIndex:0] locationInView:self.view])) { 
      t=[[[event allTouches] allObjects] objectAtIndex:0]; 
      touch1=[t locationInView:nil]; 
     } 
    }else{ 
     t=[[[event allTouches] allObjects] objectAtIndex:0]; 
     touch1=[t locationInView:nil]; 
     t=[[[event allTouches] allObjects] objectAtIndex:1]; 
     touch2=[t locationInView:nil]; 
    } 
} 

-(double)distance:(CGPoint)point1 toPoint:(CGPoint)point2 
{ 
    double deltaX, deltaY; 
    deltaX = point1.x - point2.x; 
    deltaY = point1.y - point2.y; 
    return sqrt(deltaX * deltaX + deltaY * deltaY); 
} 

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 

    CGPoint currentTouch1; 
    CGPoint currentTouch2; 
    NSArray *allTouches = [touches allObjects]; 
    UITouch* t; 
    float scale,rotation; 

    if([[event allTouches] count]==1){ 
     t=[[[event allTouches] allObjects] objectAtIndex:0]; 
     if (CGRectContainsPoint([Birdie frame], [[allTouches objectAtIndex:0] locationInView:self.view])) 
     { 
      touch2=[t locationInView:nil]; 
      Birdie.center=CGPointMake(Birdie.center.x+touch2.x-touch1.x,Birdie.center.y+touch2.y-touch1.y); 
      touch1=touch2; 
     } 
    } 
    else if([[event allTouches] count]==2) 
    { 
     t=[[[event allTouches] allObjects] objectAtIndex:0]; 
     currentTouch1=[t locationInView:nil]; 

     t=[[[event allTouches] allObjects] objectAtIndex:1]; 
     currentTouch2=[t locationInView:nil]; 

     double distance1 = [self distance:currentTouch1 toPoint:currentTouch2]; 
     double distance2 = [self distance:touch1 toPoint:touch2]; 

     if (distance2 == 0) 
     { 
      //handle the case where distance is zero 
     } 
     else { 
      scale =distance1/distance2;} 

     rotation=atan2(currentTouch2.y-currentTouch1.y, currentTouch2.x-currentTouch1.x)-atan2(touch2.y-touch1.y,touch2.x-touch1.x); 
     if(isnan(scale)){ 
      scale=1.0f; 
     } 
     NSLog(@"rotation %f",rotation); 

     NSLog(@"scale %f",scale); 

     if (CGRectContainsPoint([Birdie frame], [[allTouches objectAtIndex:0] locationInView:self.view]) && 
      CGRectContainsPoint([Birdie frame], [[allTouches objectAtIndex:1] locationInView:self.view])) 
     { 

      Birdie.transform=CGAffineTransformScale(Birdie.transform, scale,scale); 
      Birdie.transform=CGAffineTransformRotate(Birdie.transform, rotation); 
     } 
     else // In case of scaling or rotating the background imageView 
     { 
      imageView.transform=CGAffineTransformScale(imageView.transform, scale,scale); 
      imageView.transform=CGAffineTransformRotate(imageView.transform, rotation); 
     } 

     touch1=currentTouch1; 
     touch2=currentTouch2; 
    } 
} 

謝謝!

回答

4

當你做這樣的判斷:

if (CGRectContainsPoint([Birdie frame], [[allTouches objectAtIndex:0] locationInView:self.view]) && 
      CGRectContainsPoint([Birdie frame], [[allTouches objectAtIndex:1] locationInView:self.view])) 

請確保您有在allTouches確實是兩個觸摸對象。

+0

那是把戲,非常感謝你! – Tim 2011-04-19 18:42:14

2

如果您正在使用thew的tableview工作然後記得設置此:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    if(tableview == self.table1) 
    { 
     return [mydictionaryObject count]; 
    } 

} 
+2

如果if條件爲false,則應該有另一個'return'。 – 2011-06-09 22:31:44