0

我想知道UIImageViews当它们相互接触时如何在 Xcode 中交换两个位置。

例子:

if (CGRectIntersectsRect(view1.frame, view2.frame)) {
   [UIView animateWithDuration:0.2 animations:^{
     CGRect view1Frame = view1.frame;
     view1.frame = view2.frame;
     view2.frame = view1Frame;
   }];
}

不幸的是,这不起作用,因为变量每次都会记住旧位置。你能帮我解决这个问题吗?

4

5 回答 5

0

也许这有助于指向 CGRect 结构的指针

CGRect *view1Frame

应替换为:

CGRect view1Frame = view1.frame;

我不想更深入地研究 Structs 和 Objects,因为它们之间的线条可能会模糊:D 但在这种情况下,您只需使用 CGRect 而不使用指针。您甚至通常会收到来自 xcode 的警告...

感谢和问候

于 2013-07-05T22:19:02.783 回答
0

您可以从图层的表示层获取当前位置。

CGPoint currentPos1 = [view1.layer.presentationLayer position];
NSLog(@"%f %f",currentPos1.x,currentPos1.y);
CGPoint currentPos2 = [view2.layer.presentationLayer position];
NSLog(@"%f %f",currentPos2.x,currentPos2.y);

之后你可以做动画来交换它们......

于 2013-07-06T00:36:01.093 回答
0

我的怀疑是你调用了这个方法两次,因为它们两次重叠,动画只是在撤销自己。试试这个:

BOOL animationDone = NO;

if (CGRectIntersectsRect(view1.frame, view2.frame) && !animationDone) { 
    [UIView animateWithDuration:0.2 animations:^{
     CGRect view1Frame = view1.frame;
     view1.frame = view2.frame;
     view2.frame = view1Frame;
     animationDone = YES;
    }];
}
于 2013-07-06T07:32:47.023 回答
0

尝试以下操作:

CGRect view1Frame = view1.frame;
CGRect view2Frame = view2.frame;

if (CGRectIntersectsRect(view1.frame, view2.frame)) {
   [UIView animateWithDuration:0.2 animations:^{
     view1.frame = view2Frame;
     view2.frame = view1Frame;
   }];
}

我认为这应该可以工作我没有测试它但通常这应该没问题...请让我知道...

另外:如果您想直接更改块内的变量,以便在离开块后它们具有其他值,您需要使用 __block 声明它们(有关块的详细信息,我推荐苹果文档http://developer.apple.com/library/ ios/#documentation/cocoa/conceptual/Blocks/Articles/bxVariables.html#//apple_ref/doc/uid/TP40007502-CH6-SW6

问候

于 2013-07-08T16:57:31.533 回答
0

您可以使用元组来做到这一点:)

(view1.frame, view2.frame) = (view2.frame, view1.frame)
于 2018-03-15T16:47:50.580 回答