Objective c 如何通过Xcode设计器添加MPVolumeView?
我最初在页面上动态添加了MPVolumeViewObjective 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
#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的加载将以静默方式失败(尽管会在控制台上记录一条消息)
- 在实际设备上运行。模拟器不会显示音量滑块
- 再次检查您的视图是否未从视图中自动调整大小
#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")
...