2012-05-15 4 views
0

하위 뷰로 일부 단추가있는 사용자 지정 UIView가 있습니다. 나는 touchesBegan/Moved/Ended를 사용하여 사용자의 손가락으로보기를 회전시킵니다. 문제는 단추에서 뷰를 끌거나 회전하려고 시도 할 때 touches 메서드가 호출되지 않는다는 것입니다. UIControlEventTouchUpInside 이벤트에 응답하는 버튼이 필요하지만보기로 드래그 한 경우 내보기가 회전합니다. this 질문과 this 질문을 보았지만 나에게 적합한 해결책을 찾지 못했습니다.UIButton 사용자 정의 UIView 내부에 필요합니다.

- (id)initWithFrame:(CGRect)frame andRadius:(float)Radius andViews: 

(NSMutableArray *)AllViews 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     radius = Radius; 
     allViews = AllViews; 

     for(int i = 0; i < [allViews count]; i++){ 
      //the "currentView" is a UIButton 
      UIView *currentView = (UIView *)[allViews objectAtIndex:i]; 
      [currentView setFrame:CGRectMake(frame.size.width/2 - 25 + radius * cos((2 * M_PI/[allViews count]) * i), frame.size.height/2 - 25 + radius * sin((2 * M_PI/[allViews count]) * i), 50, 50)]; 
      [self addSubview:currentView]; 

     } 
     [self setBackgroundColor:[UIColor redColor]]; 
     [self setAlpha:.5]; 

    } 
    return self; 
} 

//- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event 
//{ 
// for (UIView * view in [self subviews]) { 
//  if ([view pointInside:[self convertPoint:point toView:view] withEvent:event]) { 
//   return YES; 
//  } 
// } 
// return NO; 
//} 

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    UITouch *touch = [touches anyObject]; 
    CGPoint point = [touch locationInView:self]; 

    x = point.x; 
    y = point.y; 

    NSLog(@"touchesBegan"); 
} 

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    UITouch *touch = [touches anyObject]; 
    CGPoint point = [touch locationInView:self]; 

    float X = point.x; 
    float Y = point.y; 

    float a = sqrt(X * X + Y * Y); 
    float b = sqrt(x * x + y * y); 
    float c = sqrt((x - X) * (x - X) + (y - Y) * (y - Y)); 

    float alpha = acos((a * a + b * b - (c * c))/(2 * a * b)); 
    if(alpha == NAN) 
     alpha = 0; 

    alpha = -alpha; 


    [UIView beginAnimations:@"rotate" context:nil]; 
    [UIView setAnimationDuration:0]; 
    [UIView setAnimationCurve:UIViewAnimationCurveEaseOut]; 
    self.transform = CGAffineTransformRotate(self.transform, alpha); 
    [UIView commitAnimations]; 
} 
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    UITouch *touch = [touches anyObject]; 
    CGPoint point = [touch locationInView:self]; 

    float X = point.x; 
    float Y = point.y; 

    float a = sqrt(X * X + Y * Y); 
    float b = sqrt(x * x + y * y); 
    float c = sqrt((x - X) * (x - X) + (y - Y) * (y - Y)); 

    float alpha = acos((a * a + b * b - (c * c))/(2 * a * b)); 

    alpha = -alpha; 


    [UIView beginAnimations:@"rotate" context:nil]; 
    [UIView setAnimationDuration:0.5]; 
    [UIView setAnimationCurve:UIViewAnimationCurveEaseOut]; 
    self.transform = CGAffineTransformRotate(self.transform, alpha); 
    [UIView commitAnimations]; 
    NSLog(@"touchesEnded"); 
} 

- (void)dealloc 
{ 
    [allViews release]; 
    [super dealloc]; 
} 

어떤 제안 : 여기

내 사용자 지정보기 코드?

답변

0

비슷한 문제가있는 사람을 만났을 때 내가 사용했던 해결책을 게시 할 것입니다. 단추로 사용한 다른 UIView 클래스를 무효화했습니다. touchedBegan/Moved/Ended의 각각에서, 나는 그 때, 나는 버튼 클릭에 필요한 코드를 구현 같은, 다음 사용자 정의 UIView에 명령의 사슬 위로 터치를 통과 : 나는 NSNotifications를 사용

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    [self.nextResponder touchesBegan:touches withEvent:event]; 
} 

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    [self.nextResponder touchesMoved:touches withEvent:event]; 
} 

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    UITouch *touch = [touches anyObject]; 
    CGPoint point = [touch locationInView:self]; 

    if (point.x < self.frame.size.width && point.y < self.frame.size.height) { 
     NSDictionary *userInfo = [[NSDictionary alloc] initWithObjectsAndKeys:[NSString stringWithFormat:@"%d", self.tag], @"tag", nil]; 
     [[NSNotificationCenter defaultCenter] postNotificationName:@"ChangeFilter" object:self userInfo:userInfo]; 
    } 


    [self.nextResponder touchesEnded:touches withEvent:event]; 
} 

공지 사항이를 보내 작업을 덮어 쓴 뷰가 포함 된 ViewController에 추가하십시오.

0

어쩌면 당신이 찾고있는 대답,하지만 :

난 당신이 활동이보기에 의해 선택되어야한다 "다음 버튼 이외의 손가락을 드래그 버튼에 손가락을 아래로"싶어 왜 확실하지 않다 드래그/회전 동작으로 버튼 뒤에 있습니다. 지금까지 내가 걱정하는 한, 버튼 안에 손가락을 넣으면, 뒤에서 볼 수있는 것이 아니라 버튼과 상호 작용합니다. 화면을 터치하는 동안 버튼에서 손가락을 움직이면 뒤에있는보기와 상호 작용하지 않고 버튼 누르기를 중단하고 (즉, "시작했지만"트리거하지 않은) 버튼 누르기를 중단하려고합니다.

그래서 내가 말하는 것은 왜 이것을하고 싶습니까? 어쩌면 UI 디자인을 다시 생각해 볼 필요가있을 것입니다.

절대적으로이 작업을 수행하려는 경우 touchesBegan 대신 UIGestureRecognizer을 사용하는 것이 좋습니다. 더 복잡한 시나리오를 사용할 때 더 쉽게 설정할 수 있습니다. 그러나 제스처 인식기는 모든 버전의 iOS에서 사용할 수있는 것은 아닙니다.

또는 버튼이나 원하는대로 보이게 구현하고 touchesBegan 등을 사용하여 드래그하는 등 뷰를 드래그하여 처리 할 수 ​​있습니다. 즉 실제 버튼을 사용하지 마십시오.