2013-05-28 3 views
3

У меня есть UIToolBar, который должен содержать ползунки для регулировки громкости и яркости. Я использую ползунок MPVolumeView для громкости и обычный UISlider для яркости. В то время как сами движки работают отлично, их вертикальные позиции не соответствуют друг другу:Согласование вертикальных положений MPVolumeView и UISlider в UIToolBar

Mismatched UISlider and MPVolumeView

Как я могу получить их, чтобы быть на той же высоте?

Моего код:

- (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, но реализация этого кода, похоже, ничего не сделала, насколько я могу судить, и я не уверен, говорила ли речь об одной и той же проблеме.

ответ

17

Если вы создаете тривиальный подкласс MPVolumeView и переопределяете volumeSliderRectForBounds:, вы можете определить собственное выравнивание для прямоугольника прямоугольника. Я хотел бы вернуть целые границы, центры которых ползунок в кадре MPVolumeView «s

@interface KMVolumeView : MPVolumeView 

@end 

@implementation KMVolumeView 

- (CGRect)volumeSliderRectForBounds:(CGRect)bounds 
{ 
    return bounds; 
} 

@end 

Просто используйте свой подкласс в коде или в интерфейсе строителя и вы можете надежно расположить вид громкости.

0

Я закончил с использованием UISlider для обоих, используя инструкции, приведенные в ответах "Get System Volume" и "Change System Volume", чтобы сделать ползунок тома вместо использования MPVolumeView.

13

я придумал что-то, что расширяет ответ 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:, так что кнопка трансляции/маршрута также центрируется.

Мне нужно знать, почему реализация по умолчанию имеет вертикальное положение.

+1

Совершенная детали спасибо! :) – Jona

+0

Great Hack, все еще работающий на iOS8! В не понимаю логику в реализации Apple ... Если у кого-то есть идея, я бы хотел это знать! –

+0

Это действительно полезно! спасибо – Jerome

2

СВИФТ Версия: приходят форму ответа hyperspasm в:

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 
    } 
}