Изменение текста Цвет элементов в UIActionSheet - iOS 8
Я использовал следующий код для изменения цвета текста элементов, которые я добавляю в UIActionSheet
.:
- (void)willPresentActionSheet:(UIActionSheet *)actionSheet {
for (UIView *subview in actionSheet.subviews) {
if ([subview isKindOfClass:[UIButton class]]) {
UIButton *button = (UIButton *)subview;
[button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
}
}
}
Он отлично работает в iOS7
, но в iOS8
приведенный выше код не меняет цвет текста элементов.
Теперь у меня вопрос, как изменить цвет текста элементов, которые я добавляю в UIActionSheet
, используя iOS8
?
Дополнительная информация:
Я добавил точку останова, чтобы увидеть, выполняются ли следующие строки из приведенного выше кода или нет:
UIButton *button = (UIButton *)subview;
[button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
Эти строки не выполняются. Итак, if([subview isKindOfClass:[UIButton class]])
всегда false
для всех элементов actionSheet.subviews
. Итак, я думаю, что представление о герархии
UIActionSheet
было изменено.
Ответы
Ответ 1
Простой способ, если вы хотите использовать UIActionSheet
вместо UIAlertController
, чтобы поддерживать более старые версии iOS.
UIActionSheet
фактически использует UIAlertController
в iOS 8 и имеет частное свойство _alertController
.
SEL selector = NSSelectorFromString(@"_alertController");
if ([actionSheet respondsToSelector:selector])
{
UIAlertController *alertController = [actionSheet valueForKey:@"_alertController"];
if ([alertController isKindOfClass:[UIAlertController class]])
{
alertController.view.tintColor = [UIColor blueColor];
}
}
else
{
// use other methods for iOS 7 or older.
}
Ответ 2
Чтобы изменить цвет названия кнопки, вы должны использовать UIAlertController
и установить tintColor
основного view
.
Пример настройки цвета названия кнопок на черный:
UIAlertController *actionSheetController = [UIAlertController alertControllerWithTitle:@"How would you like to proceed?" message:@"" preferredStyle:UIAlertControllerStyleActionSheet];
UIAlertAction *finish = [UIAlertAction actionWithTitle:@"Finish" style:UIAlertActionStyleDefault handler:^(UIAlertAction * action)
{
[self performSelector:@selector(finish:) withObject:nil];
}];
UIAlertAction *playAgain = [UIAlertAction actionWithTitle:@"Play Again" style:UIAlertActionStyleDefault handler:^(UIAlertAction * action)
{
[self performSelector:@selector(playAgain:) withObject:nil];
}];
UIAlertAction *cancel = [UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:^(UIAlertAction *action)
{
[actionSheetController dismissViewControllerAnimated:YES completion:nil];
}];
[actionSheetController addAction:finish];
[actionSheetController addAction:playAgain];
[actionSheetController addAction:cancel];
//******** THIS IS THE IMPORTANT PART!!! ***********
actionSheetController.view.tintColor = [UIColor blackColor];
[self presentViewController:actionSheetController animated:YES completion:nil];
Ответ 3
Хорошо, я столкнулся с той же проблемой, но думаю, что нашел решение:
Соответствующий способ должен быть таким, и я предполагаю, что он работает в iOS7:
[[UIButton appearanceWhenContainedIn:[UIActionSheet class], nil] setTitleColor:[UIColor blueColor] forState:UIControlStateNormal];
Но это не будет работать в iOS8 из-за того, что кнопки "Action" ActionSheets теперь основаны на UICollectionView.
Поэтому после некоторого копания я получил это вместо этого:
[[UICollectionView appearanceWhenContainedIn:[UIAlertController class], nil] setTintColor:[UIColor blueColor]];
Ответ 4
Я использую его.
[[UIView appearanceWhenContainedIn:[UIAlertController class], nil] setTintColor:[UIColor blueColor]];
Добавьте одну строку (AppDelegate) и работайте для всего UIAlertController.
Ответ 5
У меня такая же задача, и сегодня я сделал этот взлом, грязный, но он работает
class CustomAlertViewController: UIAlertController {
internal var cancelText: String?
private var font: UIFont? = UIFont(name: "MuseoSansCyrl-500", size: 12)
override func viewDidLoad() {
super.viewDidLoad()
self.view.tintColor = UIColor.blackColor()
}
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
self.findLabel(self.view) //if you need ios 9 only, this can be made in viewWillAppear
}
func findLabel(scanView: UIView!) {
if (scanView.subviews.count > 0) {
for subview in scanView.subviews {
if let label: UILabel = subview as? UILabel {
if (self.cancelText != nil && label.text == self.cancelText!) {
dispatch_async(dispatch_get_main_queue(),{
label.textColor = UIColor.redColor() //for ios 8.x
label.tintColor = UIColor.redColor() //for ios 9.x
})
}
if (self.font != nil) {
label.font = self.font
}
}
self.findLabel(subview)
}
}
}
}
Ответ 6
Для меня работала tintColor
window
.
В - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions method
напишите это:
[self.window setTintColor:[UIColor redColor]];
Это изменило цвет шрифта для всех объектов UIActionSheet
.
Ответ 7
Для обратной совместимости с iOS 7 и для сбора правильного цвета оттенков по умолчанию (который Apple может изменить в будущих версиях), я использую это. Спасибо за ответы default tint и Лукас ответьте выше.
const Class alertControllerClass = NSClassFromString(@"UIAlertController");
if(alertControllerClass)
{
UIColor *defaultTintColour = UIView.new.tintColor;
[[UIView appearanceWhenContainedIn: alertControllerClass, nil] setTintColor: defaultTintColour];
}
Осторожно, но вам нужно убедиться, что вы используете это, прежде чем начинать настройку глобального оттенка, иначе UIView.new.tintColor
просто даст вам текущий оттенок, который вы настроили.
Ответ 8
Swift 4
let alert = UIAlertController(title: "title", message: "message", preferredStyle: .alert)
alert.view.tintColor = UIColor.black
self.present(alert, animated: true, completion: nil)