2011-01-31 4 views
2

일종의 인벤토리에있는 UIView 하위 클래스가 있습니다. 하나를 탭하면 다른 드래그 가능한 버전이 그 위에 놓입니다. 다른 사람들을 드래그하는 동안 인벤토리 버전을 유지하고 싶습니다. 복제물을 만드는 코드는 움직이지만 손가락을 드래그하면 움직이지 않습니다.touchesBegan 후에 만든 UIView 끌기

새로 만든 버전을 놓았다가 드래그하면 예상대로 움직입니다. 원래의 접촉 (속임수를 만든)이 반응 체인에서 draggable 버전을 갖고 있지 않았기 때문에 이것이라고 생각합니다.

약간의 코드 ... 내 고정 "아이콘"의

... 내의 ViewController에서

- (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event 
{ 
    [self.viewController placeDraggableItem:self.item WithPoint:self.frame.origin]; 
} 

... 내 DraggableItem에서

- (void)placeDraggableItem:(Item *)item WithPoint:(CGPoint)point 
{ 
    DraggableItem *draggableItem = [[DraggableItem alloc] initWithImage:[UIImage imageNamed:item.graphic]]; 
draggableItem.frame = CGRectMake(point.x, scrollView.frame.origin.y + point.y, 64.0f, 64.0f); 
    [self.view addSubview:draggableItem]; 
    [draggableItem release]; 
} 

...

- (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event 
{ 
    currentPoint = [[touches anyObject] locationInView:self]; 
} 

- (void) touchesMoved:(NSSet*)touches withEvent:(UIEvent*)event 
{ 
    CGPoint activePoint = [[touches anyObject] locationInView:self]; 
    CGPoint newPoint = CGPointMake(self.center.x + (activePoint.x - currentPoint.x), self.center.y + (activePoint.y - currentPoint.y)); 

    float midPointX = CGRectGetMidX(self.bounds); 
    if (newPoint.x > self.superview.bounds.size.width - midPointX) 
     newPoint.x = self.superview.bounds.size.width - midPointX; 
    else if (newPoint.x < midPointX) // If too far left... 
     newPoint.x = midPointX; 

    float midPointY = CGRectGetMidY(self.bounds); 
    if (newPoint.y > self.superview.bounds.size.height - midPointY) 
     newPoint.y = self.superview.bounds.size.height - midPointY; 
    else if (newPoint.y < midPointY) // If too far up... 
     newPoint.y = midPointY; 

    self.center = newPoint; 
} 

이제 d raggable 버전이 작동합니다. 드래그 가능한 버전은 첫 번째 터치를 처음 릴리스 한 후에 이동할 수 있습니다. 그러나 나는 새로 만든 UIView가 원래 "아이콘"으로 만들어진 터치에 응답해야한다고 생각합니다.

아이디어가 있으십니까?

이 질문은이 질문과 비슷하다고 생각합니다 : How to "transfer" first responder from one UIView to another?하지만이 경우 터치를 수신해야하는보기는 이미 있습니다. 새로 만든보기에 터치해야합니다.

답변

2

내가 새로 만든보기를 건드리지 않을 방법이 없다는 것을 의미하지는 않습니다. draggable 뷰가 터치를 처리하기를 원한다고 생각합니다. 드래그 할 수없는 뷰를 생성하는 동시에 0의 알파 값을 가진 draggable 뷰를 만들고, touchesBegan을 1로 설정합니다. -draggable 뷰는 터치를 처리 할 필요가 없으며이를 전달하기 위해 터치를 처리하도록 만드는 것이 적절하지 않습니다.

+0

이것은 실제로 그것을 보는 꽤 좋은 방법이며 아마도 내가하는 일보다 조금 더 논리적입니다. 유일한 차이점은 내가 그 (것)들을 모두 배치하고 드래그하여 드래그하면 새로운 것을 드래그하면 아래에 드롭된다는 것입니다. – rob5408