我希望2个视图就好像它们是“一个视图”一样 - 意味着如果视图1在'x'n像素上移动我希望视图2在x轴上移动相同数量的像素(在任意方向上) ) - 无需计算各种偏移量等等。
我认为使用新的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轴和“硬”相互连接 - 任何方式这样做?
答案 0 :(得分: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不是一种可行的方法,因为自动布局和UIDynamics
会相互干扰。
答案 1 :(得分:2)
设置v1来源' X'到panGesture中的v2 origin'
- (void)pan:(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);
}
答案 2 :(得分:1)
解决此问题的一种简单方法是将其中一个视图作为子视图添加到另一个视图中,或者将两个视图作为子视图添加到新视图中,该视图仅用于对视图进行分组。根据您打算如何使用这些视图,这可能不适用于您。
如果您想让一个视图成为另一个视图的子视图,但希望子视图在超级视图范围之外可见,您可以在超级视图上将clipToBounds
设置为NO
。