Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/113.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios MPVolumeView动画问题_Ios_Objective C_Uikit_Mpvolumeview - Fatal编程技术网

Ios MPVolumeView动画问题

Ios MPVolumeView动画问题,ios,objective-c,uikit,mpvolumeview,Ios,Objective C,Uikit,Mpvolumeview,每次我将MPVolumeView作为子视图添加到我的UIViewController视图时,都会出现一个快速的动画(MPVolumeView从左到右展开),看起来非常奇怪。我正在寻找一种摆脱这种动画的方法,有人面临过这个问题吗 我几乎承认这是一个MPVolumeView错误,但后来我注意到苹果肯定在他们的原生音乐应用程序中使用了MPVolumeView,没有奇怪的动画。。。 所以一定是我做错了什么 更新: 代码非常简单,但它是在注释中请求的,因此如下所示: MPVolumeView *volum

每次我将
MPVolumeView
作为子视图添加到我的
UIViewController
视图时,都会出现一个快速的动画(MPVolumeView从左到右展开),看起来非常奇怪。我正在寻找一种摆脱这种动画的方法,有人面临过这个问题吗

我几乎承认这是一个
MPVolumeView
错误,但后来我注意到苹果肯定在他们的原生音乐应用程序中使用了
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上做了一个非常简单的演示来演示这个问题,但是您必须在设备上运行它,因为
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;
}
您应该在ViewWillLayoutSubView中执行布局调用


与其每次按下按钮都创建一个新的MPVolumeView,不如在ViewDiLoad中创建一个并隐藏它,然后在按下按钮时取消隐藏。

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

这将删除所有插入的动画。因此,请确保这是你想要的,因为这是相当过分的。您也可以删除
位置
边界
动画(请参见
删除动画forkey:
)。

Hi@Shai,感谢您对我的问题感兴趣,我添加了代码I,您添加视图的方法是什么?当按钮“触动内部”时,在
iAction
中调用。它是在主线程上调用的,你可以在github Hi上看到源代码,@dariaa请看这个问题,和你的问题一样。任何有效的解决方案。你发现了吗?这是一个丑陋的解决办法。一定是其他原因导致了这场灾难issue@user132490请您解释一下为什么这是一个丑陋的解决方法,而不是声称这是另一个问题?在viewDidLoad中设置框架应该总是很好的,必须在viewWillLayoutSubviews中设置框架是丑陋的,实际上解决不了任何问题。如果在未将volumeView设置为hidden的情况下运行此代码,您将看到仍然会出现奇怪的动画。你只是在隐藏奇怪的动画,因为它发生在视图隐藏时。如果我隐藏动画,你怎么能看到它?下载演示,用我的代码替换viewcontroller代码,告诉我你看到了一个动画。如果你没有“volumeView.hidden=true”这一行,那么你就会看到动画谢谢,这正是我需要的