为 uibutton 将 3 行动画化为 iOS 中的箭头
Animate 3 lines into arrow in iOS for a uibutton
有谁知道如何通过将 CGAfflineRotation 应用于 3 个视图来将 3 条平行线动画化为右箭头,就像在导航菜单栏中发生的那样以打开侧边菜单。
我真的需要这些方面的帮助,这样至少我可以有一个开始的想法。
这是尝试绘制它的样子:-
_______
_______ \
_______ to ___________\
/
/
任何想法或建议都会有所帮助。
正如你所说,你应该使用CGAffineRotation
。我给出了您想要的简单示例,所有内容都应该打包到适当的方法中,视图应该包含一些基本的 autolayouts
/layoutFrames
等。我只是快速发布可能的轮换解决方案写在viewDidAppear
,应该改什么
另一种选择是使用 firstView.layer.anchorPoint
并将其设置到适当的位置。
#define degreesToRadians(x) (M_PI * x / 180.0)
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
// let's create these 3 views as a lines
UIView *firstView = [[UIView alloc] initWithFrame:CGRectMake(50, 50, 50, 1)];
[firstView setBackgroundColor:[UIColor blackColor]];
[self.view addSubview:firstView];
UIView *secondView = [[UIView alloc] initWithFrame:CGRectMake(50, 53, 50, 1)];
[secondView setBackgroundColor:[UIColor blackColor]];
[self.view addSubview:secondView];
UIView *thirdView = [[UIView alloc] initWithFrame:CGRectMake(50, 56, 50, 1)];
[thirdView setBackgroundColor:[UIColor blackColor]];
[self.view addSubview:thirdView];
// now we can perform rotation, mind the degree and offsets in transform.
[UIView animateWithDuration:1 animations:^{
CGAffineTransform transform = CGAffineTransformMakeTranslation(24, 1);
transform = CGAffineTransformRotate(transform, degreesToRadians(45));
transform = CGAffineTransformTranslate(transform, -24, 1);
firstView.transform = transform;
transform = CGAffineTransformIdentity;
transform = CGAffineTransformMakeTranslation(24, -1);
transform = CGAffineTransformRotate(transform, degreesToRadians(-45));
transform = CGAffineTransformTranslate(transform, -24, -1);
thirdView.transform = transform;
} completion:^(BOOL finished) {}];
}
用 CALayer Animation 比 UIView Animation 更容易做这样的动画。您需要添加三个子图层:top_line、middle_line 和 bottom_line。然后在每一层和正确的位置画线(Hint:画线使用CAShapeLayer
)。最后把top_line和bottom_line层旋转一个合适的角度,你可能还需要改变锚点和层的位置。最后一步很棘手,也许只是用不同的角度和锚点值做一些试验,直到找到最合适的。
当你成功制作了这样的动画后,尝试制作反向动画。然后创建一个嵌入了这两个动画的自定义 UIButton。恭喜!您有一个带有炫酷动画的汉堡包按钮,可以在任何地方重复使用!
有谁知道如何通过将 CGAfflineRotation 应用于 3 个视图来将 3 条平行线动画化为右箭头,就像在导航菜单栏中发生的那样以打开侧边菜单。
我真的需要这些方面的帮助,这样至少我可以有一个开始的想法。
这是尝试绘制它的样子:-
_______
_______ \
_______ to ___________\
/
/
任何想法或建议都会有所帮助。
正如你所说,你应该使用CGAffineRotation
。我给出了您想要的简单示例,所有内容都应该打包到适当的方法中,视图应该包含一些基本的 autolayouts
/layoutFrames
等。我只是快速发布可能的轮换解决方案写在viewDidAppear
,应该改什么
另一种选择是使用 firstView.layer.anchorPoint
并将其设置到适当的位置。
#define degreesToRadians(x) (M_PI * x / 180.0)
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
// let's create these 3 views as a lines
UIView *firstView = [[UIView alloc] initWithFrame:CGRectMake(50, 50, 50, 1)];
[firstView setBackgroundColor:[UIColor blackColor]];
[self.view addSubview:firstView];
UIView *secondView = [[UIView alloc] initWithFrame:CGRectMake(50, 53, 50, 1)];
[secondView setBackgroundColor:[UIColor blackColor]];
[self.view addSubview:secondView];
UIView *thirdView = [[UIView alloc] initWithFrame:CGRectMake(50, 56, 50, 1)];
[thirdView setBackgroundColor:[UIColor blackColor]];
[self.view addSubview:thirdView];
// now we can perform rotation, mind the degree and offsets in transform.
[UIView animateWithDuration:1 animations:^{
CGAffineTransform transform = CGAffineTransformMakeTranslation(24, 1);
transform = CGAffineTransformRotate(transform, degreesToRadians(45));
transform = CGAffineTransformTranslate(transform, -24, 1);
firstView.transform = transform;
transform = CGAffineTransformIdentity;
transform = CGAffineTransformMakeTranslation(24, -1);
transform = CGAffineTransformRotate(transform, degreesToRadians(-45));
transform = CGAffineTransformTranslate(transform, -24, -1);
thirdView.transform = transform;
} completion:^(BOOL finished) {}];
}
用 CALayer Animation 比 UIView Animation 更容易做这样的动画。您需要添加三个子图层:top_line、middle_line 和 bottom_line。然后在每一层和正确的位置画线(Hint:画线使用CAShapeLayer
)。最后把top_line和bottom_line层旋转一个合适的角度,你可能还需要改变锚点和层的位置。最后一步很棘手,也许只是用不同的角度和锚点值做一些试验,直到找到最合适的。
当你成功制作了这样的动画后,尝试制作反向动画。然后创建一个嵌入了这两个动画的自定义 UIButton。恭喜!您有一个带有炫酷动画的汉堡包按钮,可以在任何地方重复使用!