"Fill button" 动画 iOS
"Fill button" animation in iOS
您对在 iOS 应用中实现以下按钮动画有什么建议吗?
首先,你有一个像这样的图像的 imageView。
其次,你用白色覆盖它UIView
,同时,为v符号初始化一个UIImageview
,将它变成白色。
下一步,运行 动画在 0.2 秒内将白色视图从 1 缩放到 0。
完成后,您 运行 其他动画使白色 v 符号在 0.2 秒内从 1 缩放到 1.2。
这是我的想法。
好的,让我们把这个动画分成几段来弄清楚。
1) 我们需要一个白色和绿色的圆圈。
2)我们需要一个刻度图像。
3) 我们需要为白色圆圈和刻度线设置动画。
第一步
在您的界面文件中添加绿色 UIView
。这将是背景视图。我们不需要为这个视图设置动画。然后 link 绿色视图到 IBOutlet
像这样:
IBOutlet UIView *greenView;
第二步
在绿色 UIView
内添加一个白色的 UIView,并使其大小与绿色 UIView
完全相同。然后 link 白色 UIView
到头文件中的 IBOutlet
像这样:
IBOutlet UIView *whiteView;
第三步
制作或下载 'tick' 图像并将其添加到您的 Xcode
项目中。然后添加刻度图像 ABOVE 我们刚刚创建的 green/white 视图。请在视图上方打勾,并在视图中打上 NOT。然后 link 刻度图像到 IBOutlet
- 这将帮助我们检测视图何时被按下。这样做:
IBOutlet UIImageView *tickImage;
第四步
我们需要将绿色和白色 UIView
更改为圆形。我们可以用代码来做到这一点。将 #import <QuartzCore/QuartzCore.h>
框架导入头文件。
然后在您的 viewDidLoad
方法中,添加以下代码,将 green/white 视图更改为圆圈:
CGPoint greenCenter = greenView.center;
CGPoint whiteCenter = whiteView.center;
CGRect newFrameGreen = CGRectMake(greenView.frame.origin.x, greenView.frame.origin.y, 20, 20);
CGRect newFrameWhite = CGRectMake(whiteView.frame.origin.x, greenView.frame.origin.y, 20, 20);
greenView.frame = newFrameGreen;
greenView.layer.cornerRadius = newSize / 2.0;
greenView.center = greenCenter;
whiteView.frame = newFrameWhite;
whiteView.layer.cornerRadius = newSize / 2.0;
whiteView.center = whiteCenter;
第五步
为了 运行 动画,我们需要将图像视图连接到将 运行 动画的方法。您可以使用 UITapGestureRecognizer
来完成。在您的 viewDidLoad
方法中,添加以下内容:
UITapGestureRecognizer *newTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tickAnimation)];
[tickImage setUserInteractionEnabled:YES];
[tickImage addGestureRecognizer:newTap];
然后将动画方法也添加到您的实现 (.m) 文件中:
-(void)tickAnimation {
}
第六步
在头文件中创建一个 BOOL
值 - 我们将使用它来检测按钮是否处于 "ON" 或 "OFF" 状态。
BOOL animationMode;
然后在您的 viewDidLoad
方法中,将 animationMode bool 值设置为 "OFF" - 这是因为按钮将 "OFF" 或默认处于白色状态。
animationMode = NO;
现在我们可以继续看动画了。据我所知,这分为两个动画。第一个是缩小白色视图,第二个是在刻度图像上做一个微妙的弹出动画。更新 tickAnimation
方法以执行动画:
-(void)tickAnimation {
if (animationMode == NO) {
// Button is OFF or set to white, lets set it to ON.
[UIView animateWithDuration:1.0f animations:^{
whiteView.transform = CGAffineTransformMakeScale(0,0);
} completion:nil];
[UIView animateWithDuration:1.0f animations:^{
tickImage.transform = CGAffineTransformMakeScale(2,2);
} completion:nil];
[UIView animateWithDuration:1.0f animations:^{
tickImage.transform = CGAffineTransformMakeScale(0,0);
} completion:nil];
animationMode = YES;
}
else if (animationMode == YES) {
// Button is ON or set to green, lets set it to OFF.
[UIView animateWithDuration:1.0f animations:^{
whiteView.transform = CGAffineTransformMakeScale(1,1);
} completion:nil];
animationMode = NO;
}
}
这是我制作这种动画的尝试。我希望这会有所帮助:)
您可以为颜色填充设置 layer.borderWidth
属性 的动画。它在图层内部绘制,类似这样。
UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(30, 30, 100, 100)];
[self.view addSubview:button];
button.layer.borderWidth = 10;
button.layer.borderColor = [UIColor greenColor].CGColor;
button.layer.cornerRadius = 50;
CABasicAnimation *border = [CABasicAnimation animationWithKeyPath:@"borderWidth"];
[border setFromValue:[NSNumber numberWithInt:10]];
[border setToValue:[NSNumber numberWithInt:50]];
border.duration = 1.0;
button.layer.borderWidth = 50;
[button.layer addAnimation:border forKey:@"border"];
这是在 autoReverse
设置为 true 的情况下工作的非常慢的 gif 屏幕截图。
如果你喜欢Swift它看起来像这样
var button = UIButton(frame: CGRect(x: 30, y: 30, width: 100, height: 100))
self.view.addSubview(button)
button.layer.borderWidth = 10
button.layer.borderColor = UIColor.greenColor().CGColor
button.layer.cornerRadius = 50
let border:CABasicAnimation = CABasicAnimation(keyPath: "borderWidth")
border.fromValue = 10
border.toValue = 50
border.duration = 1.0
button.layer.borderWidth = 50
button.layer.addAnimation(border, forKey: "border")
您对在 iOS 应用中实现以下按钮动画有什么建议吗?
首先,你有一个像这样的图像的 imageView。
其次,你用白色覆盖它UIView
,同时,为v符号初始化一个UIImageview
,将它变成白色。
下一步,运行 动画在 0.2 秒内将白色视图从 1 缩放到 0。 完成后,您 运行 其他动画使白色 v 符号在 0.2 秒内从 1 缩放到 1.2。
这是我的想法。
好的,让我们把这个动画分成几段来弄清楚。
1) 我们需要一个白色和绿色的圆圈。 2)我们需要一个刻度图像。 3) 我们需要为白色圆圈和刻度线设置动画。
第一步
在您的界面文件中添加绿色 UIView
。这将是背景视图。我们不需要为这个视图设置动画。然后 link 绿色视图到 IBOutlet
像这样:
IBOutlet UIView *greenView;
第二步
在绿色 UIView
内添加一个白色的 UIView,并使其大小与绿色 UIView
完全相同。然后 link 白色 UIView
到头文件中的 IBOutlet
像这样:
IBOutlet UIView *whiteView;
第三步
制作或下载 'tick' 图像并将其添加到您的 Xcode
项目中。然后添加刻度图像 ABOVE 我们刚刚创建的 green/white 视图。请在视图上方打勾,并在视图中打上 NOT。然后 link 刻度图像到 IBOutlet
- 这将帮助我们检测视图何时被按下。这样做:
IBOutlet UIImageView *tickImage;
第四步
我们需要将绿色和白色 UIView
更改为圆形。我们可以用代码来做到这一点。将 #import <QuartzCore/QuartzCore.h>
框架导入头文件。
然后在您的 viewDidLoad
方法中,添加以下代码,将 green/white 视图更改为圆圈:
CGPoint greenCenter = greenView.center;
CGPoint whiteCenter = whiteView.center;
CGRect newFrameGreen = CGRectMake(greenView.frame.origin.x, greenView.frame.origin.y, 20, 20);
CGRect newFrameWhite = CGRectMake(whiteView.frame.origin.x, greenView.frame.origin.y, 20, 20);
greenView.frame = newFrameGreen;
greenView.layer.cornerRadius = newSize / 2.0;
greenView.center = greenCenter;
whiteView.frame = newFrameWhite;
whiteView.layer.cornerRadius = newSize / 2.0;
whiteView.center = whiteCenter;
第五步
为了 运行 动画,我们需要将图像视图连接到将 运行 动画的方法。您可以使用 UITapGestureRecognizer
来完成。在您的 viewDidLoad
方法中,添加以下内容:
UITapGestureRecognizer *newTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tickAnimation)];
[tickImage setUserInteractionEnabled:YES];
[tickImage addGestureRecognizer:newTap];
然后将动画方法也添加到您的实现 (.m) 文件中:
-(void)tickAnimation {
}
第六步
在头文件中创建一个 BOOL
值 - 我们将使用它来检测按钮是否处于 "ON" 或 "OFF" 状态。
BOOL animationMode;
然后在您的 viewDidLoad
方法中,将 animationMode bool 值设置为 "OFF" - 这是因为按钮将 "OFF" 或默认处于白色状态。
animationMode = NO;
现在我们可以继续看动画了。据我所知,这分为两个动画。第一个是缩小白色视图,第二个是在刻度图像上做一个微妙的弹出动画。更新 tickAnimation
方法以执行动画:
-(void)tickAnimation {
if (animationMode == NO) {
// Button is OFF or set to white, lets set it to ON.
[UIView animateWithDuration:1.0f animations:^{
whiteView.transform = CGAffineTransformMakeScale(0,0);
} completion:nil];
[UIView animateWithDuration:1.0f animations:^{
tickImage.transform = CGAffineTransformMakeScale(2,2);
} completion:nil];
[UIView animateWithDuration:1.0f animations:^{
tickImage.transform = CGAffineTransformMakeScale(0,0);
} completion:nil];
animationMode = YES;
}
else if (animationMode == YES) {
// Button is ON or set to green, lets set it to OFF.
[UIView animateWithDuration:1.0f animations:^{
whiteView.transform = CGAffineTransformMakeScale(1,1);
} completion:nil];
animationMode = NO;
}
}
这是我制作这种动画的尝试。我希望这会有所帮助:)
您可以为颜色填充设置 layer.borderWidth
属性 的动画。它在图层内部绘制,类似这样。
UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(30, 30, 100, 100)];
[self.view addSubview:button];
button.layer.borderWidth = 10;
button.layer.borderColor = [UIColor greenColor].CGColor;
button.layer.cornerRadius = 50;
CABasicAnimation *border = [CABasicAnimation animationWithKeyPath:@"borderWidth"];
[border setFromValue:[NSNumber numberWithInt:10]];
[border setToValue:[NSNumber numberWithInt:50]];
border.duration = 1.0;
button.layer.borderWidth = 50;
[button.layer addAnimation:border forKey:@"border"];
这是在 autoReverse
设置为 true 的情况下工作的非常慢的 gif 屏幕截图。
如果你喜欢Swift它看起来像这样
var button = UIButton(frame: CGRect(x: 30, y: 30, width: 100, height: 100))
self.view.addSubview(button)
button.layer.borderWidth = 10
button.layer.borderColor = UIColor.greenColor().CGColor
button.layer.cornerRadius = 50
let border:CABasicAnimation = CABasicAnimation(keyPath: "borderWidth")
border.fromValue = 10
border.toValue = 50
border.duration = 1.0
button.layer.borderWidth = 50
button.layer.addAnimation(border, forKey: "border")