Ответ 1
Вы можете попробовать ездить по своим подзонам и искать подкласс UISlider?
Я попробовал много методов для реализации регулярного UISlider
и управления томом устройства, но все функции Native-C, которые приводят к множеству неисслеживаемых ошибок.
Я пробовал MPVolumeView
, он работает как шарм, он даже контролирует объем устройства даже после закрытия приложения, как и приложение iPod.
Мой вопрос в том, есть ли способ настроить MPVolumeView
с конкретными цветами и изображениями, точно так же, как UISlider
?
ПРИМЕЧАНИЕ. Я хочу юридический метод, не используя частные недокументированные API.
UPDATE
Как ответ на @Alexsander Akers, поскольку подвыборы скрыты в MPVolumeView
, мне пришлось циклически переключаться через subviews, получить UISlider
и настроить его, вот код.
IBOutlet UISlider *volumeSlider; //defined in <class.h> and connected to a UISlider in Interface Builder
-(void) viewDidLoad {
....
[self setCustomSlider];
....
}
-(void) setCustomSlider{
MPVolumeView *volumeView = [[[MPVolumeView alloc] initWithFrame:[volumeSlider frame]] autorelease];
NSArray *tempArray = volumeView.subviews;
for (id current in tempArray){
if ([current isKindOfClass:[UISlider class]]){
UISlider *tempSlider = (UISlider *) current;
UIImage *img = [UIImage imageNamed:@"trackImage.png"];
img = [img stretchableImageWithLeftCapWidth:5.0 topCapHeight:0];
[tempSlider setMinimumTrackImage:img forState:UIControlStateNormal];
[tempSlider setThumbImage:[UIImage imageNamed:@"thumbImage.png"] forState:UIControlStateNormal];
}
}
[volumeSlider removeFromSuperview];
[self.view addSubview:volumeView];
}
Вы можете попробовать ездить по своим подзонам и искать подкласс UISlider?
Так как iOS 5.0 вы можете использовать UIAppearance на UISlider, даже если часть MPVolumeView.
Где угодно в вашей кодовой базе:
[[UISlider appearanceWhenContainedIn:[MPVolumeView class], nil] setMinimumTrackImage:[[UIImage imageNamed:@"nowplaying_bar_full.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(5, 25, 5, 25)] forState:UIControlStateNormal];
[[UISlider appearanceWhenContainedIn:[MPVolumeView class], nil] setMaximumTrackImage:[[UIImage imageNamed:@"nowplaying_bar_empty.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(5, 25, 5, 25)] forState:UIControlStateNormal];
[[UISlider appearanceWhenContainedIn:[MPVolumeView class], nil] setThumbImage:[UIImage imageNamed:@"nowplaying_player_nob.png"] forState:UIControlStateNormal];
Здесь приведен список некоторых других классов, которые могут быть реализованы с использованием UIAppearance: https://gist.github.com/mattt/5135521
Теперь есть способы сделать это, просто используйте:
– setMaximumVolumeSliderImage:forState:
– setMinimumVolumeSliderImage:forState:
– setVolumeThumbImage:forState:
Это несколько разные имена методов, чем те, которые используются для ванили UISlider
.
Это не позволяет вам переключаться между представлениями и потенциально иметь что-то в будущем, так как Apple меняет вещи.
Ответ в Swift:
func customSlider() {
let temp = mpVolView.subviews
for current in temp {
if current.isKind(of: UISlider.self) {
let tempSlider = current as! UISlider
tempSlider.minimumTrackTintColor = .yellow
tempSlider.maximumTrackTintColor = .blue
}
}
}
Результат:
Попробуйте использовать Уведомление, но это выглядит как Apple отказывает им.
[EDIT]