匹配 UIToolBar 中的 MPVolumeView 和 UISlider 垂直位置

Posted

技术标签:

【中文标题】匹配 UIToolBar 中的 MPVolumeView 和 UISlider 垂直位置【英文标题】:Matching MPVolumeView and UISlider vertical positions in a UIToolBar 【发布时间】:2013-05-28 08:53:12 【问题描述】:

我有一个 UIToolBar,旨在包含用于控制音量和亮度的滑块。我对音量使用 MPVolumeView 滑块,对亮度使用普通 UISlider。虽然滑块本身工作正常,但它们的垂直位置不匹配:

如何让它们处于相同的高度?

我的代码:

- (void) createToolbar

toolBar = [[UIToolbar alloc] init];
toolBar.frame = CGRectMake(0, 0, self.view.frame.size.width, 44);

UISegmentedControl *modeSelector = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObjects:@"Play", @"Rec", nil]];
[modeSelector setSegmentedControlStyle:UISegmentedControlStyleBar];
[modeSelector addTarget:self action:@selector(changePlayMode) forControlEvents:UIControlEventValueChanged];
modeSelector.selectedSegmentIndex = 0;
UIBarButtonItem *modeSelectorAsToolbarItem = [[UIBarButtonItem alloc] initWithCustomView:modeSelector];

brightnessSlider = [[UISlider alloc] initWithFrame:CGRectMake(0, 0, 150, 30)];
brightnessSlider.minimumValue = 0;
brightnessSlider.maximumValue = 1;
brightnessSlider.value = [[UIScreen mainScreen] brightness];
brightnessSlider.continuous = YES;
[brightnessSlider addTarget:self action:@selector(adjustBrightness:) forControlEvents:UIControlEventValueChanged];
UIBarButtonItem *brightSliderAsToolbarItem = [[UIBarButtonItem alloc] initWithCustomView:brightnessSlider];

MPVolumeView *volView = [[MPVolumeView alloc] initWithFrame:CGRectMake(0, 0, 150, 30)];
volView.showsRouteButton = NO;
UIBarButtonItem *volSliderAsToolbarItem = [[UIBarButtonItem alloc] initWithCustomView:volView];

UIBarButtonItem *flexibleSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
UIBarButtonItem *toc = [[UIBarButtonItem alloc] initWithTitle:@"Contents" style:UIBarButtonItemStyleBordered target:self action:@selector(goToToC)];
[toolBar setItems:[NSArray arrayWithObjects:modeSelectorAsToolbarItem, flexibleSpace, brightSliderAsToolbarItem, volSliderAsToolbarItem, flexibleSpace, toc, nil] animated:NO];

toolBar.autoresizingMask |= UIViewAutoresizingFlexibleWidth;

[[self view] addSubview:toolBar];


(更改 CGRectMake 坐标似乎没有任何作用。)

问题“Custom MPVolumeView Thumb Image not vertically centered since ios 5.1”中的评论似乎建议使用“修复拇指对齐”技巧解释here,但据我所知,实现该代码似乎没有做任何事情,而且我我不确定它是否在谈论同样的问题。

【问题讨论】:

【参考方案1】:

如果创建MPVolumeView 的普通子类并覆盖volumeSliderRectForBounds:,则可以为滑块矩形定义自己的对齐方式。我喜欢返回整个边界,使滑块在MPVolumeView 的框架中居中

@interface KMVolumeView : MPVolumeView

@end

@implementation KMVolumeView

- (CGRect)volumeSliderRectForBounds:(CGRect)bounds

    return bounds;


@end

只需在代码或界面构建器中使用您的子类,您就可以可靠地定位体积视图。

【讨论】:

我只想指出,Apple 现在说“你不能继承 MPVolumeView 类”。 developer.apple.com/documentation/mediaplayer/mpvolumeview @EricArmstrong 这可能只是一个过时的注释,因为 MPVolumeView 是在 iOS 2.0 中引入的,而这些自定义 API 是在 iOS 6.0 中引入的。【参考方案2】:

我想出了一些东西,扩展了 kmikael 的答案:

@interface SystemVolumeView : MPVolumeView

@end

@implementation SystemVolumeView

- (CGRect)volumeSliderRectForBounds:(CGRect)bounds 
    CGRect newBounds=[super volumeSliderRectForBounds:bounds];

    newBounds.origin.y=bounds.origin.y;
    newBounds.size.height=bounds.size.height;

    return newBounds;


- (CGRect) routeButtonRectForBounds:(CGRect)bounds 
    CGRect newBounds=[super routeButtonRectForBounds:bounds];

    newBounds.origin.y=bounds.origin.y;
    newBounds.size.height=bounds.size.height;

    return newBounds;


@end

此实现的不同之处在于它仍然使用默认的水平值,但会覆盖垂直值以保持 MPVolumeView 在其容器中垂直居中。它还覆盖了-routeButtonRectForBounds:,这样airplay/route 按钮也会居中。

我想知道为什么默认实现的垂直位置不稳定。

【讨论】:

伟大的黑客,仍在 iOS8 上工作!在不了解 Apple 实现中的逻辑......如果有人有想法,我想知道它!【参考方案3】:

SWIFT 版本: 来自过度痉挛的答案:

import Foundation

class SystemVolumeView: MPVolumeView 
    override func volumeSliderRect(forBounds bounds: CGRect) -> CGRect 
        var newBounds = super.volumeSliderRect(forBounds: bounds)
        newBounds.origin.y = bounds.origin.y
        newBounds.size.height = bounds.size.height
        return newBounds
    
    override func routeButtonRect(forBounds bounds: CGRect) -> CGRect 
        var newBounds = super.routeButtonRect(forBounds: bounds)
        newBounds.origin.y = bounds.origin.y
        newBounds.size.height = bounds.size.height
        return newBounds
    

【讨论】:

【参考方案4】:

我最终只使用了 UISlider,使用 "Get System Volume" 和 "Change System Volume" 答案中提供的说明来制作音量滑块,而不是使用 MPVolumeView。

【讨论】:

以上是关于匹配 UIToolBar 中的 MPVolumeView 和 UISlider 垂直位置的主要内容,如果未能解决你的问题,请参考以下文章

UIToolbar 更多和配置视图?

未检测到 UIToolBar 上 UIToolBar 上的模态视图中的 UIButton 触摸未检测到

如何使 UINavigationController 中的 UIToolbar 更高?

UIToolbar 中的 UISearchBar 不会显示取消按钮

如何在 UIToolbar 中的 UIProgressView 上方添加标签?

弹出窗口中的 UIToolbar