MPVolumeView 动画问题
MPVolumeView animation issue
每次我将 MPVolumeView
作为子视图添加到我的 UIViewController
视图时,都会有一个快速动画(MPVolumeView
从左向右扩展)看起来真的很奇怪.我正在寻找摆脱此动画的方法,有人遇到过这个问题吗?
我几乎承认这是一个 MPVolumeView
错误,但后来我注意到 Apple 肯定在他们的原生音乐应用程序中使用 MPVolumeView
,那里没有奇怪的动画...
所以一定是我做错了什么。
更新:
代码非常简单,但在评论中要求,所以这里是:
MPVolumeView *volumeView = [[MPVolumeView alloc] initWithFrame:CGRectMake(10.f, 0.f, CGRectGetWidth(self.view.frame) - 20.f, 30.f)];
[[UISlider appearanceWhenContainedIn:[MPVolumeView class], nil] setMinimumValueImage:[UIImage imageNamed:@"icon-volumeMin"]];
[[UISlider appearanceWhenContainedIn:[MPVolumeView class], nil] setMaximumValueImage:[UIImage imageNamed:@"icon-volumeMax"]];
volumeView.center = CGPointMake(0.5f * CGRectGetWidth(self.view.frame), 0.5f * CGRectGetHeight(self.view.frame));
volumeView.showsRouteButton = NO;
[self.view addSubview:volumeView];
我在 github 上做了一个非常简单的 project 来演示这个问题,但是你必须在设备上 运行 它,因为 MPVolumeView
没有出现在模拟器上。或者看看这个 gif:
:
我修复了你的演示代码
@implementation F17YViewController {
MPVolumeView *volumeView;
}
- (void)viewDidLoad {
[super viewDidLoad];
volumeView = [[MPVolumeView alloc] init];
volumeView.showsRouteButton = NO;
volumeView.hidden = true;
[[UISlider appearanceWhenContainedIn:[MPVolumeView class], nil] setMinimumValueImage:[UIImage imageNamed:@"icon-volumeMin"]];
[[UISlider appearanceWhenContainedIn:[MPVolumeView class], nil] setMaximumValueImage:[UIImage imageNamed:@"icon-volumeMax"]];
[self.view addSubview:volumeView];
}
- (void)viewWillLayoutSubviews {
[super viewWillLayoutSubviews];
volumeView.frame = CGRectMake(10.f, 0.f, CGRectGetWidth(self.view.frame) - 20.f, 30.f);
volumeView.center = CGPointMake(0.5f * CGRectGetWidth(self.view.frame), 0.5f * CGRectGetHeight(self.view.frame));
}
- (IBAction)showVolumeView:(id)sender {
volumeView.hidden = false;
}
您应该在 viewWillLayoutSubviews 中进行布局调用。
与其在每次按下按钮时创建一个新的 MPVolumeView,不如在 viewDidLoad 上创建一个并隐藏它,然后在按下按钮时取消隐藏。
消除此行为的一种可能方法是继承 MPVolumeView 并在 [super layoutSubviews]
之后执行一些额外的工作。
- (void)layoutSubviews
{
[super layoutSubviews];
[self xy_recursiveRemoveAnimationsOnView:self];
}
- (void)xy_recursiveRemoveAnimationsOnView:(UIView *)view
{
[view.layer removeAllAnimations];
for (UIView *subview in view.subviews) {
[self xy_recursiveRemoveAnimationsOnView:subview];
}
}
这将删除所有插入的动画。因此,请确保这就是您想要的,因为这太过分了。也可以只删除 position
和 bounds
动画(参见 removeAnimationForKey:
)。
每次我将 MPVolumeView
作为子视图添加到我的 UIViewController
视图时,都会有一个快速动画(MPVolumeView
从左向右扩展)看起来真的很奇怪.我正在寻找摆脱此动画的方法,有人遇到过这个问题吗?
我几乎承认这是一个 MPVolumeView
错误,但后来我注意到 Apple 肯定在他们的原生音乐应用程序中使用 MPVolumeView
,那里没有奇怪的动画...
所以一定是我做错了什么。
更新:
代码非常简单,但在评论中要求,所以这里是:
MPVolumeView *volumeView = [[MPVolumeView alloc] initWithFrame:CGRectMake(10.f, 0.f, CGRectGetWidth(self.view.frame) - 20.f, 30.f)];
[[UISlider appearanceWhenContainedIn:[MPVolumeView class], nil] setMinimumValueImage:[UIImage imageNamed:@"icon-volumeMin"]];
[[UISlider appearanceWhenContainedIn:[MPVolumeView class], nil] setMaximumValueImage:[UIImage imageNamed:@"icon-volumeMax"]];
volumeView.center = CGPointMake(0.5f * CGRectGetWidth(self.view.frame), 0.5f * CGRectGetHeight(self.view.frame));
volumeView.showsRouteButton = NO;
[self.view addSubview:volumeView];
我在 github 上做了一个非常简单的 project 来演示这个问题,但是你必须在设备上 运行 它,因为 MPVolumeView
没有出现在模拟器上。或者看看这个 gif:
我修复了你的演示代码
@implementation F17YViewController {
MPVolumeView *volumeView;
}
- (void)viewDidLoad {
[super viewDidLoad];
volumeView = [[MPVolumeView alloc] init];
volumeView.showsRouteButton = NO;
volumeView.hidden = true;
[[UISlider appearanceWhenContainedIn:[MPVolumeView class], nil] setMinimumValueImage:[UIImage imageNamed:@"icon-volumeMin"]];
[[UISlider appearanceWhenContainedIn:[MPVolumeView class], nil] setMaximumValueImage:[UIImage imageNamed:@"icon-volumeMax"]];
[self.view addSubview:volumeView];
}
- (void)viewWillLayoutSubviews {
[super viewWillLayoutSubviews];
volumeView.frame = CGRectMake(10.f, 0.f, CGRectGetWidth(self.view.frame) - 20.f, 30.f);
volumeView.center = CGPointMake(0.5f * CGRectGetWidth(self.view.frame), 0.5f * CGRectGetHeight(self.view.frame));
}
- (IBAction)showVolumeView:(id)sender {
volumeView.hidden = false;
}
您应该在 viewWillLayoutSubviews 中进行布局调用。
与其在每次按下按钮时创建一个新的 MPVolumeView,不如在 viewDidLoad 上创建一个并隐藏它,然后在按下按钮时取消隐藏。
消除此行为的一种可能方法是继承 MPVolumeView 并在 [super layoutSubviews]
之后执行一些额外的工作。
- (void)layoutSubviews
{
[super layoutSubviews];
[self xy_recursiveRemoveAnimationsOnView:self];
}
- (void)xy_recursiveRemoveAnimationsOnView:(UIView *)view
{
[view.layer removeAllAnimations];
for (UIView *subview in view.subviews) {
[self xy_recursiveRemoveAnimationsOnView:subview];
}
}
这将删除所有插入的动画。因此,请确保这就是您想要的,因为这太过分了。也可以只删除 position
和 bounds
动画(参见 removeAnimationForKey:
)。