6

每次我将MPVolumeView子视图添加到我UIViewController的视图时,都会有一个快速动画(MPVolumeView从左到右扩展),看起来很奇怪。我正在寻找一种方法来摆脱这个动画,有人遇到过这个问题吗?

我几乎接受这是一个MPVolumeView错误,但后来我注意到苹果肯定MPVolumeView在他们的原生音乐应用程序中使用了 a,那里没有奇怪的动画......所以一定是我做错了什么。

更新:

代码非常简单,但在评论中要求,所以这里是:

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 上做了一个非常简单的项目MPVolumeView来演示这个问题,但是你必须在设备上运行它,因为它不会出现在模拟器上。或者看看这个 gif:

gif

4

2 回答 2

10

消除此行为的一种可能方法是将 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];
    }
}

这将删除所有插入的动画。因此,请确保这是您想要的,因为这太过分了。也可以只删除positionbounds动画(请参阅 参考资料removeAnimationForKey:)。

于 2015-04-10T13:11:00.583 回答
-1

我修复了你的演示代码

@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 创建一个并隐藏它,然后在按下按钮时取消隐藏。

于 2015-01-12T16:33:11.290 回答