2014-03-14 37 views
1

我希望2个视图的行为就好像它们是“一个视图” - 意味着视图1在'x'n个像素上移动我希望视图2移动x轴的像素数量相同(任意方向) - 无需计算各种偏移量等等。如何附加2个视图以便它们可以作为一个视图平移

我想用新的UIDynamicAnimator将是一个伟大的候选人,所以我想这

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]; 

    } 
} 

但他们相互交融 - 小视图倾斜和改变其旋转和y位置。

我本来希望 - 只有在1轴和“硬”彼此连接 - 任何方式来做到这一点?

回答

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); 
    } 
} 

作为替代方案,你可以使用自动布局,并涉及在这种方式的两种观点,你的要求得到满足。然后,当移动其中一个视图时,另一个会相应移动。但是,如果您实际上是使用UIDynamics来操作该视图层次结构中的视图,则自动布局不会自动布局,因为自动布局和UIDynamics倾向于相互干扰。

+0

而且不要忘了对上海华和上海华盈的Alpha设置平移手势识别为0 –

+0

我希望我可以添加这两个观点对同样的层面 - 但这是不可能的 - 一个视图属于一个表视图 - 另一个属于一个容器 - 所以他们确实没有任何关系或者彼此之间的知识 - 这个例子仅用于演示目的(因为我正在玩它)。目标是让两个视图一起移动 - 自动布局是不可能的 - 我现在正在做的是手动将'view2'的原点改为'x'个像素 - 但这是不稳定的,并且看起来不太好:( –

+0

In在这种情况下,我认为没有一种简单的方法可以省略手动更改原点。您可以考虑[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); 

}

相关问题