第二章 弹性动画按钮的切换
核心原理:
CGAffineTransformScale 来实现我们按钮缩放的弹性动画.
思 路:给按钮的两种状态选中状态和未选中状态添加缩放动画。
第一步(承接上章)
首先找到我们上次所讲的代码。找到按钮切换状态方法(注:这里上次对按钮切换方法进行了更新) 。然后在我们三步交换btn状态代码中添加上我们的缩放动画,默认为长和宽缩放1.2倍。这里默认给切换按钮状态方法设置了动画切换和非动画切换。
-(void) changeBtn:(UIButton*) btn withAnimation:(BOOL) animation
{
if (animation) {
[UIView animateWithDuration:0.5 animations:^{
//把前一个btn 的动画效果去掉
tempBtn.transform = CGAffineTransformIdentity;
//设置前一个btn的未选中
tempBtn.selected = NO;
//设置当前选中按钮选中
btn.selected = YES;
//为当前按钮添加动画效果
btn.transform = CGAffineTransformScale(btn.transform, 1.2, 1.2);
//交换按钮
tempBtn = btn;
}];
}
else
{
tempBtn.transform = CGAffineTransformIdentity;
tempBtn.selected = NO;
btn.selected = YES;
btn.transform = CGAffineTransformScale(btn.transform, 1.2, 1.2);
tempBtn = btn;
}
}
第二步:动态设置第一个按钮的选中状态,这里通过对按钮可变数组里面的按钮数量进行计算。计算出每个按钮的位置以及大小。放置好每个按钮。但是这里需要堆第一个按钮进行选中状态处理。首先因为第一个按钮会被不定次数的修改大小。所以我们解决的办法是重新计算一个按钮大小就删除上一次的缩放动画。然后在设置按钮的大小。最后在添加上新的按钮动画,依次循环。直到不在有新的btn添加进来
注:(这里为什么不能在缩放以后,马上进行设置frame的方法。这样会改变btn内部的子视图的大小造成字体大小与btn大小不相符合)
-(void) updateBtns
{
NSInteger btnCount = self.btnArray.count;
CGFloat btnW = self.view.width / btnCount;
CGFloat btnH = 30;
CGFloat btnX ;
CGFloat btnY = 0;
//添加滑块
self.slider.width = btnW;
[self.segementView addSubview:self.slider];
for (int i = 0; i < self.btnArray.count; i++) {
UIButton* btn = self.btnArray[i];
btnX = i * btnW;
btn.tag = i;
if (btn.tag == 0) {
//设置选中状态
btn.selected = YES;
//先移除以前的动画
btn.transform = CGAffineTransformIdentity;
//在添加新的frame
[btn setFrame:CGRectMake(btnX, btnY, btnW, btnH)];
//在进行新的动画
btn.transform = CGAffineTransformScale(btn.transform, 1.2, 1.2);
}
else{
[btn setFrame:CGRectMake(btnX, btnY, btnW, btnH)];
}
}
}
附上本章项目git 地址 https://github.com/fucklichking/WJSegementContrl