如何通过Xcode Designer添加MPVolumeView?

时间:2011-05-16 17:09:19

标签: 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.view addSubview:volumeView];
        [volumeView release];
    } else {
        [volumeView removeFromSuperview];
        volumeView = nil;
    }
}

但出于某种原因,我开始在动态添加卷组件时收到应用程序崩溃的报告。

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

我首先将“对象”从模板拖到“对象”调色板中,然后我发现无法将其添加到视图中。所以我废弃了这个想法,然后将'View'对象直接拖到.xib视图上。

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

有没有人知道我缺少哪些步骤将类添加到调色板中尚未存在的视图中?

6 个答案:

答案 0 :(得分:23)

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

  • 将MediaPlayer框架添加到您的项目中。如果不加载,MPVolumeView的加载将无声地失败(尽管有一条消息记录到控制台)。
  • 在实际设备上运行。模拟器不会显示音量滑块。
  • 仔细检查您的视图是否未从视图中自动恢复。

答案 1 :(得分:5)

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

答案 2 :(得分:4)

更简单:

添加视图并将Class更改为MPVolumeView并在.h

中声明
    #import <MediaPlayer/MediaPlayer.h>

@interface MyView : UIViewController {
    MPVolumeView *_mpVolumeview;
}

在.m中只需分配它。

- (void)viewDidLoad {
    [super viewDidLoad];
    [MPVolumeView alloc];

    // set properties using the declared object in .h
    // Example
    [mpVolumeview setShowsVolumeSlider:NO]; 
}

答案 3 :(得分:1)

我稍微更改了Roman Aliyev’s的决定。

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

@IBOutlet weak var volume: MPVolumeView!

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

答案 4 :(得分:0)

找到了另一个解决方案。

  • 通过Xcode Interface Builder添加UISlider。
  • 配置其在IB中的外观。
  • 通过以下方式以编程方式将其替换为MPVolumeView:
class PlayerView: UIView {
    @IBOutlet weak var volumeViewMock: UISlider!

    override func awakeFromNib() {
        super.awakeFromNib()
        self.volumeViewMock.replaceWithMPVolumeView()
    }
}

extension UISlider {
    func replaceWithMPVolumeView() {
        // do this only once
        guard !self.isHidden else { return }

        let volumeView = MPVolumeView()
        volumeView.showsRouteButton = false

        // get the slider of volumeView and configure it in the same way as the IB slider
        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)

        // frame of volumeView and frame of the IB slider should be the same
        volumeView.translatesAutoresizingMaskIntoConstraints = false
        NSLayoutConstraint.activate([
            volumeView.topAnchor.constraint(equalTo: self.topAnchor),
            volumeView.bottomAnchor.constraint(equalTo: self.bottomAnchor),
            volumeView.leadingAnchor.constraint(equalTo: self.leadingAnchor),
            volumeView.trailingAnchor.constraint(equalTo: self.trailingAnchor),
            ])

        // hide the IB slider
        self.isHidden = true
    }
}

答案 5 :(得分:-1)

现在还不确定你是否已经弄明白了。我刚刚创建了一个带有音量滑块的应用程序。这就是我所做的(来自MPVolumeView):

  • 添加了一个UIView并根据需要调整大小并将其放置在.xib视图中。
  • 将班级更改为MPVolumeView
  • 在我的.h文件中添加了以下内容:
#import 

@interface MyView : UIViewController {
    MPVolumeView *_mpVolumeViewParentView;
}
@property (nonatomic, retain) IBOutlet MPVolumeView *mpVolumeViewParentView;

@end
  • 在我的.m文件中添加了以下内容:
#import "MyView.h"

@implementation MyView

@synthesize mpVolumeViewParentView = _mpVolumeViewParentView;

- (void)viewDidLoad {
    [super viewDidLoad];
    [[self mpVolumeViewParentView] setBackgroundColor:[UIColor clearColor]];
    MPVolumeView *myVolumeView = [[MPVolumeView alloc] initWithFrame:[[self mpVolumeViewParentView] bounds]];
    [[self mpVolumeViewParentView] addSubview:myVolumeView];
    [myVolumeView release];
}
- (void)dealloc {
    [_mpVolumeViewParentView release];
    [super dealloc];
}

希望它有所帮助。