2014-03-14 2 views
1

두 개의보기가 마치 "하나의보기"처럼 작동하도록합니다. 즉,보기 1이 'x'픽셀 위로 이동하면보기 2가 계속 이동하게됩니다. x 축은 모든 종류의 오프셋을 계산할 필요없이 동일한 양의 픽셀을 (임의의 방향으로) 표시합니다. 작은 뷰 경사를하고 회전 및 y 위치를 변경 - 두 개의보기를 하나의보기로 이동하기 위해 두 개의보기를 붙이는 방법

나는 그래서이

UIView *v1 = [[UIView alloc] initWithFrame:CGRectMake(320-150, 150, 150, 100)]; 
v1.backgroundColor = [UIColor blackColor]; 
[self.view addSubview:v1]; 

self.v1 = v1; 
UIView *v2 = [[UIView alloc] initWithFrame:CGRectMake(self.view.bounds.size.width, 
                 0, 
                 self.view.bounds.size.width, 
                 self.view.bounds.size.height)]; 
v2.backgroundColor = [UIColor redColor]; 
[self.view addSubview:v2]; 
self.v2 = v2; 

UIPanGestureRecognizer *p = 
[[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(pan:)]; 
[v1 addGestureRecognizer:p]; 

self.animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view]; 

UIAttachmentBehavior *att = 
[[UIAttachmentBehavior alloc] initWithItem:self.v1 
          offsetFromCenter:UIOffsetZero 
          attachedToItem:self.v2 
          offsetFromCenter:UIOffsetMake(0, 
             self.v1.center.y - self.v2.center.y)]; 
att.damping = 0; 
[self.animator addBehavior:att]; 
self.att = att; 

-(void)pan:(UIPanGestureRecognizer *)gesture { 
    if(gesture.state == UIGestureRecognizerStateChanged) { 
     CGPoint p = [gesture locationInView:self.view]; 
     // move only on x axis but keep on same y point 
     self.v1.center = CGPointMake(p.x, self.v1.center.y); 
     [self.animator updateItemUsingCurrentState:self.v1]; 

    } 
} 

을 시도하지만 그들은 서로 상호 작용하는 좋은 후보가 될 것입니다 새로운 UIDynamicAnimator를 사용하여 생각했다.

나는 하나의 축에서만 "하드"가 서로 연결되어 있기를 바랄 것입니다.

답변

2

컨텍스트에 대한 자세한 내용이 제공되지 않는다면 두 개의 뷰의 상대적인 거리가 일정하게 유지되기를 원한다고 가정합니다. 이것이 사실이라면, 나는 왜 당신이 UIDynamicAnimator을 고려하는지 확신 할 수 없다. 대신 두 개의 뷰를 컨테이너 뷰에 포함시킨 다음 두 개의 뷰 대신 개별적으로 컨테이너의 원점을 조작 할 수 있습니다. 이 방법을 채택하면 다른 뷰를 움직일 때 한 뷰의 원점을 다시 계산하는 것에 대해 걱정할 필요가 없으며 그 반대의 경우도 마찬가지입니다.

self.containerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 200, 100)]; 
UIView *v1 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)]; 
UIView *v2 = [[UIView alloc] initWithFrame:CGRectMake(100 0, 100, 100)]; 
[self.containerView addSubview:v1]; 
[self.containerView addSubview:v2]; 

// now, changing the origin of containerView will move v1 and v2 simultaniously 
- (void)pan:(UIPanGestureRecognizer *)gesture 
{ 
    if(gesture.state == UIGestureRecognizerStateChanged) 
    { 
     CGPoint p = [gesture locationInView:self.view]; 
     // move only on x axis but keep on same y point 
     self.containerView.center = CGPointMake(p.x, self.containerView.center.y); 
    } 
} 

대신에 autolayout을 사용하여 두 가지보기를 요구 사항이 충족 될 수 있도록 연결할 수 있습니다. 그런 다음보기 중 하나를 움직이면 다른보기가 그에 따라 이동합니다. 그러나 실제로보기 계층에서보기를 조작하기 위해 UIDynamics을 사용하는 경우 autolayout은 autolayout과 UIDynamics이 서로 간섭하는 경향이 있으므로 이동하는 방법이 아닙니다.

+0

그리고 내가 추가 할 수 있으면 좋겠다 0 –

+0

에 수퍼와 수퍼의 알파에 팬 제스처 인식기를 설정하는 것을 잊지 마세요 두 뷰가 같은 계층에 있지만 뷰 뷰에 속한 뷰와 컨테이너 뷰에 속한 뷰는 서로 연결되어 있지 않으며 서로 지식이 없습니다. 예제는 데모 용도로만 사용되었습니다. 나는 그것으로 놀고 있었다). 목표는 두보기가 함께 움직이는 것입니다. 자동 선택은 불가능합니다. 현재 'view2'의 원점을 수동으로 'x'픽셀로 변경하는 중입니다. 그러나 고르지 않아 좋지 않습니다. ( –

+0

그 경우 원점을 수동으로 변경하는 것을 생략하는 쉬운 방법이 없다고 생각합니다. [KVO] (https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/KeyValueObserving/KeyValueObserving)를 고려해 볼 수 있습니다. html) ([간단한 설명은 여기에있다.] (http://nshipster.com/key-value-observing/))을 사용하여 범위의 뷰 원점이 언제 바뀌는지를 관찰 할 수있다. 그러나 그것이 'UITableViewCell'이라면 세포 재사용 때문에 문제가 생길 수 있습니다. –

1

쉽게 해결할 수있는 방법 중 하나는보기 중 하나를 다른보기로 하위보기로 추가하거나 두보기를 하위보기로 새보기에 추가하는 것입니다.이보기는보기를 그룹화하는 데만 사용됩니다. 당신이보기를 사용하려는 방법에 따라 이것은 당신에게 적용되지 않을 수도 있습니다.

하나의보기를 다른보기의 하위보기로 만들고 싶지만 수퍼 뷰의 경계 외부에서 하위보기를 표시하려면 수퍼 뷰에서 clipToBoundsNO으로 설정할 수 있습니다.

2

panGesture에서 v1 시작점 'X'를 v2 시작점 'X'로 설정합니다.

- (무효) 팬 : (UIPanGestureRecognizer *) 제스처 {

CGPoint point = [gesture locationInView:self.view]; 

CGRect boundsRect = CGRectMake(15, 40, 285, self.view.frame.size.height-60); 

if (CGRectContainsPoint(boundsRect, point)) 
{ 
    v1.center = point; 
} 



v2.frame = CGRectMake(v1.frame.origin.x, v2.frame.origin.y, v2.frame.size.width, v2.frame.size.height); 

}

관련 문제