2014-09-11 1 views
28

В iOS 8 кажется, что кнопки на UIAlertController (в частности, тип файла действия), а также кнопки на UIActivityViewController получают свой цвет из цвета tintColor основного окна.iOS 8 UIActivityViewController и цвет текста кнопки UIAlertController использует tintColor окна

Как изменить цвет текста кнопки? Я пробовал использовать внешний прокси-сервер следующим образом:

[[UIButton appearanceWhenContainedIn:[UIActivityViewController class], nil] setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; 

Но это не имеет никакого эффекта. Цвет tintColor моего окна белый, поэтому текст на кнопках UIActivityViewController также белый, и его не видно. Изменение цвета tintColor моего окна разрешает эту проблему, но это испортит остальную часть приложения.

Смотрите скриншот моей UIActivityViewController с белой кнопкой отменой с белым текстом на дне:

UIActivityViewController with white Cancel button text

То же самое относится и к UIActionSheet (да, я знаю, что это не рекомендуется) и UIAlertController с actionSheet тип.

Как я могу сделать текст на этих окнах доступным для чтения без изменения tintColor всего приложения? Заранее спасибо!

+0

Почему бы просто не изменить цвет оттенка вашего окна на белый? Я думаю, я не знаю достаточно о цвете оттенка окна, чтобы узнать, что он делает. – beebcon

ответ

31

В дополнение к глобальному цвету оттенка, определенному для вашего приложения, каждый контроллер вида позволяет вам переопределить цвет оттенков только для этого контроллера. В этом случае лучше всего установить tintColor на ваш UIActivityViewController после инициализации, но перед представлением.

UIActivityViewController *activityController = [[UIActivityViewController alloc] initWithActivityItems:items applicationActivities:activities]; 

//Set the tint color on just the activity controller as needed here before presenting 
[activityController.view setTintColor:[UIColor blueColor]]; 

[self presentViewController:activityController animated:YES completion:nil]; 

Если вы делаете это в своем приложении, вы можете использовать подкласс или категорию, чтобы избежать дублирования кода.

+0

Это сработало для меня! Благодаря! – DiscDev

+2

+1 и спасибо. Я просто здесь, чтобы добавить некоторые волшебные ключевые слова, которые могут помочь другим людям, у которых такие же проблемы, как и я ... Я искал «невидимую отмену» или «blank cancel» или «white cancel» ». Потребовалось немало поиска, чтобы найти это очень полезное Q & A. –

+0

это не очень хорошо работает с iOS 7, я получаю прозрачный фон в UIActivityViewController, когда пытаюсь изменить tintColor вида – Halpo

21

Это работало для меня с UIAlertController.

[[UIView appearanceWhenContainedIn:[UIAlertController class], nil] setTintColor:[UIColor blackColor]]; 
+3

. Вероятно, это приведет к непредвиденным побочным эффектам, так как вы меняете цвет оттенка каждого отдельного изображения внутри UIAlertController. Если они изменят иерархию представлений в будущем, это наверняка сломается. – DiscDev

+0

Это работало для меня (iOS 8.4): '[[UIView appearanceWhenContainedIn: [класс UIActivityViewController], nil] setTintColor: [UIColor blackColor]];' который лучше всего нацелен на контроллер активности. –

+7

Это не работает для меня, как iOS9 XCB5. – esilver

1

В прошивке 9 я был в состоянии исправить это колеровка мнения, что представлено в UIActivityViewController. К сожалению, в iOS 10/Xcode 8 это перестало работать для меня. Я пытался нарисовать панель «Поделиться», чтобы кнопка отмены не имела белого, невидимого текста.

Единственное, что я нашел для работы в iOS 10, - UIButton.appearance().tintColor = UIColor.red. Вы можете установить это глобально в делетете приложения (но это тоже закрашивает кнопки панели навигации и т. Д., Поэтому вам нужно пойти и покрасить их другим цветом вручную). Вы также можете установить это локально в представлении, но поскольку на самом деле это глобальная тема, которая применяется ко всем типам кнопок, вы должны затем вернуть ее другому цвету после того, как вы не захотите, чтобы следующие виды ее подхватили ,

Таким образом, я был в состоянии заставить его работать как отлив только мое ActivityController кнопка в «хак» образом, добавив строку выше с моим оттенком цветом после того, как я инициализирован UIActivityViewController, но прежде чем я представил его. И затем я установил оттенок обратно на свой предпочтительный цвет (белый) в обработчике завершения функции представления ActivityController.

например: // изображение для обмена Пусть изображения = UIImage (названное: "Изображение")

// set up activity view controller 
    let imageToShare = [ image! ] 
    let activityViewController = UIActivityViewController(activityItems: imageToShare, applicationActivities: nil) 
    activityViewController.popoverPresentationController?.sourceView = self.view 
    UIButton.appearance().tintColor = UIColor.red 

    // present the view controller 
    self.present(activityViewController, animated: true, completion: { 
     DispatchQueue.main.async { 
      UIButton.appearance().tintColor = UIColor.white 
     } 
    }) 
0

РАБОТАЛ ДЛЯ МЕНЯ - резервного копирования текущего оттенка первого

//COLCSocialManager.showShareActivityViewController(fromVC: aViewController) 
    class func showShareActivityViewController(fromVC vc: UIViewController){ 

     //let textToShare = "TAXI RANKS LONDON. New iOS app for tourists and cabbies. Check it out its free. http://buff.ly/2kNMhyU" 
     let textToShare = "TAXI RANKS LONDON. New iOS app for tourists and cabbies. Check it out its free." 
     let linkToShare = "http://buff.ly/2kNMhyU" 

     //on FB the link is converted 
     let activityItems: [Any] = [ textToShare, linkToShare ] 

     let activityViewController = UIActivityViewController(activityItems: activityItems, applicationActivities: nil) 
     activityViewController.popoverPresentationController?.sourceView = vc.view // so that iPads won't crash 

     // exclude some activity types from the list (optional) 
     //activityViewController.excludedActivityTypes = [ UIActivityType.airDrop, UIActivityType.postToFacebook ] 

     let buttonTintBackup = UIButton.appearance().tintColor 

     UIButton.appearance().tintColor = UIColor.red 

     // present the view controller 
     vc.present(activityViewController, animated: true) { 
      UIButton.appearance().tintColor = buttonTintBackup 
     } 

    } 
2

IOS 11

 let activityVC = UIActivityViewController(activityItems: objectsToShare, applicationActivities: nil) 
     activityVC.popoverPresentationController?.sourceView = self.view 

     //Set your activity view controller's appearance 
     UIButton.appearance().tintColor = .blue 

     //Set back to default UIButton appearance 
     self.present(activityVC, animated: true, completion: { 
      DispatchQueue.main.async { 
       UIButton.appearance().tintColor = nil 
      } 
     }) 
Смежные вопросы