Objective c 如何通过Xcode设计器添加MPVolumeView?

Objective c 如何通过Xcode设计器添加MPVolumeView?,objective-c,cocoa-touch,mpvolumeview,Objective C,Cocoa Touch,Mpvolumeview,我最初在页面上动态添加了MPVolumeView #import "MediaPlayer/MPVolumeView.h" . . -(IBAction) handleVolumeButtonClicked:(id) sender { if (volumeView == nil) { volumeView = [[MPVolumeView alloc] initWithFrame:CGRectMake(25, 378, 270, 30)]; [self.v

我最初在页面上动态添加了MPVolumeView

#import "MediaPlayer/MPVolumeView.h"
.
.
-(IBAction) handleVolumeButtonClicked:(id) sender {
    if (volumeView == nil) {
        volumeView = [[MPVolumeView alloc] initWithFrame:CGRectMake(25, 378, 270, 30)];
        [self.view addSubview:volumeView];
        [volumeView release];
    } else {
        [volumeView removeFromSuperview];
        volumeView = nil;
    }
}
但出于某种原因,我开始在动态添加卷组件时收到应用程序崩溃的报告

为了解决这个问题,我决定尝试通过XCode设计器将组件添加到视图中,但后来我意识到我不知道如何做到这一点

我先将“对象”从模板拖到对象选项板,但后来发现无法将其添加到视图中。所以我放弃了这个想法,然后将“视图”对象直接拖到.xib视图上

添加组件后,我尝试将“自定义类”更改为“MPVolumeView”,但视图只是呈现了一个空矩形。在模拟器中运行代码无法呈现任何内容


有人知道我在向视图添加调色板中不存在的类时遗漏了哪些步骤吗?

您应该尝试在iOS设备上运行应用程序,而不是在模拟器上运行。在模拟器上,MPVolumeView以白色文本显示“无可用卷”。如果视图的背景色设置为白色(Interface Builder中的默认值),则视图将显示为空。

不确定您现在是否已经解决了这个问题。我刚刚成功创建了一个带有音量滑块的应用程序。以下是我所做的(来自):

  • 添加了UIView,并根据需要将其调整大小并定位到.xib视图中
  • 将类更改为
    MPVolumeView
  • 将以下内容添加到my.h文件中:
  • 将以下内容添加到my.m文件中:

希望有帮助。

添加通用UIView并将自定义类设置为MPVolumeView确实有效。确保执行以下操作:

  • 将MediaPlayer框架添加到项目中。如果不这样做,则MPVolumeView的加载将以静默方式失败(尽管会在控制台上记录一条消息)

  • 在实际设备上运行。模拟器不会显示音量滑块
  • 再次检查您的视图是否未从视图中自动调整大小
甚至更简单:

添加视图并将类更改为MPVolumeView,并在.h中声明

    #import <MediaPlayer/MediaPlayer.h>

@interface MyView : UIViewController {
    MPVolumeView *_mpVolumeview;
}

找到了另一个解决方案

  • 通过Xcode接口生成器添加UISlider
  • 在IB中配置其外观
  • 以编程方式将其替换为MPVolumeView,方法如下:
class PlayerView:UIView{
@IBOutlet弱var VolumeWimLock:UISlider!
重写func awakeFromNib(){
super.awakeFromNib()
self.volumeViewMock.replaceWithMPVolumeView()
}
}
伸缩滑轨{
func replaceWithMPVolumeView(){
//只做一次
守卫!self.ishiden else{return}
设volumeView=MPVolumeView()
volumeView.showsRouteButton=false
//获取volumeView的滑块,并以与IB滑块相同的方式对其进行配置
guard let volumeViewSlider=volumeView.subviews.first as?UISlider else{return}
volumeViewSlider.minimumValueImage=self.minimumValueImage
volumeViewSlider.maximumValueImage=self.maximumValueImage
volumeViewSlider.tintColor=self.tintColor
volumeViewSlider.minimumTrackTintColor=self.minimumTrackTintColor
volumeViewSlider.maximumTrackTintColor=self.maximumTrackTintColor
volumeViewSlider.thumbTintColor=self.thumbTintColor
guard let parentView=self.superview else{return}
parentView.addSubview(volumeView)
//volumeView的帧和IB滑块的帧应相同
volumeView.TranslatesAutoResizezingMaskintoConstraints=false
NSLayoutConstraint.activate([
volumeView.topAnchor.constraint(等式:self.topAnchor),
volumeView.bottomAnchor.constraint(等式:self.bottomAnchor),
volumeView.leadingAnchor.constraint(等同于:self.leadingAnchor),
volumeView.trailingAnchor.constraint(等式:self.trailingAnchor),
])
//隐藏IB滑块
self.ishiden=true
}
}
我稍微改变了决定

您可以将MPVolumeView设置为UISlider的子类

@IBOutlet weak var volume: MPVolumeView!

let volumeSetting = volume.subviews.first as? UISlider
    volumeSetting?.minimumValueImage = UIImage(named: "SoundQuiet")
    volumeSetting?.maximumValueImage = UIImage(named: "SoundLoud")
    ...

模拟器不会显示音量幻灯片!谢谢你,谢恩·阿尼!请注意,如果它不工作-将此MPVolumeView添加到层次结构中的每个视图-从当前UIView直到根窗口。这对我很有帮助。您是否将通过编程创建的MPVolumeView作为子视图添加到在interface builder中创建的现有MPVolumeView中?对不起,那没有任何意义。现在您有了两个嵌套的卷视图,一个是通过编程创建的,另一个覆盖了另一个。对不起,这里的其他答案都比这个好得多;任何人都不应该这样做。@RoLYroLLs我认为现在是编辑你的答案的时候了。
    #import <MediaPlayer/MediaPlayer.h>

@interface MyView : UIViewController {
    MPVolumeView *_mpVolumeview;
}
- (void)viewDidLoad {
    [super viewDidLoad];
    [MPVolumeView alloc];

    // set properties using the declared object in .h
    // Example
    [mpVolumeview setShowsVolumeSlider:NO]; 
}
@IBOutlet weak var volume: MPVolumeView!

let volumeSetting = volume.subviews.first as? UISlider
    volumeSetting?.minimumValueImage = UIImage(named: "SoundQuiet")
    volumeSetting?.maximumValueImage = UIImage(named: "SoundLoud")
    ...