iOS 7提供了一套功能强大的物理引擎,可以模拟真实物理世界的各类效果,其中一个有趣的效果就是弹簧效果。如果将描述弹簧效果的时间函数曲线应用到动画中,就形成iOS 7中常见的弹簧动画。Apple提供了一个轻松为视图添加弹簧动画的方法,下面就使用该方法,为UITextfield对象添加一个从屏幕顶部降落下来的弹簧动画,使它像弹簧一样来回跳动。
打开BNRHypnosisViewController.m,首先在类扩展中添加一个UITextField属性textField。然后修改loadView方法,调整UITextField对象的起始位置,移动到屏幕顶部以外,再将该对象赋给textField属性,代码如下:
@interface BNRHypnosisViewController () <UITextFieldDelegate>
@property (nonatomic, weak) UITextField *textField;
@end
@implementation BNRHypnosisViewController
// 这里省略其他方法
- (void)loadView
{
CGRect frame = [UIScreen mainScreen].bounds;
BNRHypnosisView *backgroundView =
[[BNRHypnosisView alloc] initWithFrame:frame];
CGRect textFieldRect = CGRectMake(40, 70, 240, 30);
CGRect textFieldRect = CGRectMake(40, -20, 240, 30);
UITextField *textField = [[UITextField alloc] initWithFrame:textFieldRect];
// 设置UITextField对象的边框样式,便于查看它在屏幕上的位置
textField.borderStyle = UITextBorderStyleRoundedRect;
[backgroundView addSubview:textField];
self.textField = textField;
self.view = backgroundView;
}
@end
UITextField对象的动画最好在视图刚出现在屏幕上时就开始执行,因此动画代码应该写在viewDidAppear:中。
在BNRHypnosisViewController.m中覆盖viewDidAppear:方法,使用弹簧动画将UITextField对象再移动到之前的位置,代码如下:
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
[UIView animateWithDuration:2.0
delay:0.0
usingSpringWithDamping:0.25
initialSpringVelocity:0.0
options:0
animations:^{
CGRect frame = CGRectMake(40, 70, 240, 30);
self.textField.frame = frame;
}
completion:NULL];
}
用于添加弹簧动画的方法看起来参数较多,但实际上每个参数的含义都非常直观:
构建并运行应用。UITextField对象会从屏幕顶部降落下来,然后像弹簧一样来回跳动,最后停止在与之前相同的位置。