Подтвердить что ты не робот

IOS 8 UIActivityViewController и цвет текста кнопки UIAlertController использует окно tintColor

В iOS 8 кажется, что кнопки на UIAlertController (в частности, тип файла действия), а также кнопки на UIActivityViewController получают свой цвет из главного окна 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 всего приложения? Спасибо заранее!

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

В iOS 9 я смог исправить это, изменив представление, которое представило UIActivityViewController. К сожалению, в iOS 10/Xcode 8 это перестало работать для меня. Я пытался подкрасить панель "Общий доступ", чтобы кнопка отмены не имела белого, невидимого текста.

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

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

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

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

Ответ 4

iOS 11

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

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

        //Set back to default UIButton appearance
        self.present(activityVC, animated: true, completion: {
            DispatchQueue.main.async {
                UIButton.appearance().tintColor = nil
            }
        })

Ответ 5

РАБОТАЕТСЯ ДЛЯ МЕНЯ - первый текущий резервный момент

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

    }