4

我最初在页面上动态添加了 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”,但视图只是呈现了一个空矩形。在模拟器中运行代码无法渲染任何内容。

有谁知道我缺少哪些步骤来向调色板中不存在的视图添加一个类?

4

6 回答 6

23

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

  • 将 MediaPlayer 框架添加到您的项目中。如果您不这样做,则 MPVolumeView 的加载将静默失败(尽管会在控制台中记录一条消息)。
  • 在实际设备上运行。模拟器不会显示音量滑块。
  • 仔细检查您的视图是否没有自动调整到视图之外。
于 2012-08-30T13:11:15.443 回答
5

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

于 2011-06-24T17:18:08.190 回答
4

甚至更简单:

添加一个视图并将类更改为 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]; 
}
于 2014-01-15T12:38:35.500 回答
1

我稍微改变了罗曼·阿利耶夫的决定。

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

@IBOutlet weak var volume: MPVolumeView!

let volumeSetting = volume.subviews.first as? UISlider
    volumeSetting?.minimumValueImage = UIImage(named: "SoundQuiet")
    volumeSetting?.maximumValueImage = UIImage(named: "SoundLoud")
    ...
于 2019-09-08T11:32:17.693 回答
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
    }
}
于 2019-04-15T12:55:54.863 回答
-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];
}

希望能帮助到你。

于 2011-09-17T17:36:02.707 回答