1

我有一个适用于 iPad 的选项卡式应用程序。在第一个选项卡上,我有一个单独的菜单,带有一个突出显示当前活动菜单按钮的指针。点击按钮后,指针(一个 UIImage)动画就位。

问题是,当您将突出显示的图像留在任何不是原始/默认按钮的按钮上并移至应用程序中的另一个选项卡,然后再返回时,图像已移回默认位置。但是,当您点击另一个按钮时,图像会朝错误的方向移动。我认为这是因为图像向后移动但保留了旧坐标,还是相反?与直接在 iPad 上进行测试相比,在模拟器中进行测试时有点碰碰运气,并且表现不同。

我想我需要从绝对坐标开始,并在整个过程中坚持下去。但是我无法理解如何使用 CGAffine 函数来实现它。

这是我当前的代码

- (IBAction)diplayForm1:(id)sender {

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.5];
    buttonHighlightImage.transform = CGAffineTransformMakeTranslation(0, 0);
    [UIView commitAnimations];

}

- (IBAction)diplayForm2:(id)sender {

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.5];
    buttonHighlightImage.transform = CGAffineTransformMakeTranslation(0, 80);
    [UIView commitAnimations];

}

- (IBAction)diplayForm3:(id)sender {

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.5];
    buttonHighlightImage.transform = CGAffineTransformMakeTranslation(0, 160);
    [UIView commitAnimations];

}

编辑 - - -

@Mundi 我尝试了您建议的代码。我假设 newFrame 你的意思是定义一个新的 UIImageView 和我在 .h 中所做的属性(我称之为“sfh”),然后在 .m 中定义 @synthesize。

这是我在 .m 中的代码

-(void)viewWillAppear:(BOOL)animated {

    // The "pointer" and the "old" frame are the same so I thought it pointless to do
    // selectedFormHighlight.frame = selectedFormHighlight.frame;

    // I tried anyway and also tried this and many other combinations
    selectedFormHighlight.frame = sfh.frame;

}

-(void)viewDidAppear:(BOOL)animated {

    [UIView beginAnimations:nil context:NULL];
    [UIView animateWithDuration:0.3 animations:^{
        selectedFormHighlight.frame = CGRectMake(0,0,0,0);
    }];
    [UIView commitAnimations];

}

当我运行它时,指针动画离开屏幕(左上角)并且不会回来。我已经尝试了在 viewWillAppear 和 viewDidAppear 中我能想到的所有可能的组合,但这并没有什么区别。我尝试删除 viewDidAppear 中的其他行,它仍然做同样的事情。

我认为您建议在用户从另一个屏幕返回时从原始(默认)位置为指针设置动画。我不希望这样,它应该简单地留在他们没有动画的地方。或者至少在他们没有意识到的情况下把它放回原处。唯一的动画是当他们选择点击该视图中的不同按钮时。

4

2 回答 2

0

您遇到这种情况的原因是,当视图被隐藏和重新显示时,实际的视图对象及其表示层会混淆。解决方案是更改视图属性而不是为图层设置动画。

因此,您不需要使用仿射变换。只需通过更改其frameor直接设置指针视图的新位置center

执行此操作的最新格式是基于块的动画:

[UIView animateWithDuration:0.5 animations:^{
   pointer.frame = newFrame;
}];

此外,只有一个变量不同的三种方法似乎非常低效。您可以将所需的 y 位置乘以 80。

编辑

您的按钮重置的另一个原因是,它是在实例化视图时放置的位置。只需在viewWillAppear视图控制器中设置视图的位置,然后将其动画到viewDidAppear.

于 2013-02-20T08:25:23.620 回答
0

我感谢@Mundi 的帮助,但无法让它以这种方式工作。我最终到达了以下代码。

// This initially sets the frame with a variable value that 
// corresponds to the current child view
-(void)viewDidAppear:(BOOL)animated {
    selectedFormHighlight.frame = CGRectMake(0, self.getY, 250, 4100);
}

// Button actions (converted to a single action instead of one for each button)
// This was done by referencing a tag added to each button (the button tags 
// match the children's tags)
-(IBAction)goToForm:(id)sender {
    UIButton *btn = (UIButton *)sender;
    self.currentChild = self.formViewControllers[btn.tag];
    [UIView beginAnimations.nil context:NULL];
    [UIView animateWithDuration:0.3 animations:^{
        selectedFormHighlight.frame = CGRectMake(0, self.getY, 250, 4100);
    }];
    [UIView commitAnimations];
    sfh.frame = selectedFormHighlight.frame;
}

// This returns the 'y' (vertical center position) of the pointer 
// frame for each of the child views
-(int)getY {
    switch(_currentChild.view.tag) {
        case 1:
            return -2005;
            break;
        case 2:
            return -1925;
            break;
        default:
            return -1845;
            break;
    }
}
于 2013-02-22T16:16:36.247 回答