2015-03-28 2 views
6

Начиная изучать Свифт и пытает преобразовать этот ObjectiveC кода:Как установить UISegmentedControl Оттенок цвета для отдельного сегмента

[[mySegmentedControl.subviews objectAtIndex:0] setTintColor:[UIColor blueColor]] 

Это правильно устанавливает оттенок цвета первого сегмента.


Это ближайший я пришел к получению Swift версии одного и того же кода:

mySegmentedControl?.subviews[0].tintColor = UIColor.blueColor() 

Я получаю ошибку на '@Ivalue $T9' is not identical to 'UIColor!!'


Я не понимаю что означает эта ошибка. Когда я смотрю на метод .tintColor, он перечисляет UIColor!?, и я еще не нашел то, что !? вместе означает в Swift.

+0

Если mySegmentedControl - IBOutlet? Если это так, объявите его @IBOutlet var mySegmentedControl = UISegmentedControl! Тогда вам не нужно? оператор. Это не решит всю проблему, но это одно. Если subviews [0] может возвращать nil, то это необязательно, так что, возможно, положите! после [0]. – clearlight

ответ

16

Это позволит решить вашу проблему:

var subViewOfSegment: UIView = mySegmentedControl.subviews[0] as UIView 
subViewOfSegment.tintColor = UIColor.blueColor() 

Вы также можете

(mySegmentedControl.subviews[0] as UIView).tintColor = UIColor .blueColor() 
+0

Вот и все! Спасибо за помощь. –

+0

Является ли это документированным? – igrek

0

Для изменения tintColor выбранного сегмента

Используйте измененное значение события для UISegmentControl в сортируйте сегменты по порядку по их значению x, затем сверните и сравните свойство selectedSegmentIndex. Ниже приведен пример с допущением сегментированный контроль 4 сегментов:

@IBAction func indexChanged(sender: UISegmentedControl) { 

    let sortedViews = sender.subviews.sort({ $0.frame.origin.x < $1.frame.origin.x }) 

    for (index, view) in sortedViews.enumerate() { 
     if index == sender.selectedSegmentIndex { 
      view.tintColor = UIColor.blueColor() 
     } else { 
      view.tintColor = UIColor.lightGrayColor() 
     } 
    } 

} 

Затем в viewDidLoad установить tintColor для первоначально выбранного сегмента, в данном случае это первая:

let sortedViews = segmentedControlOutletVariable.subviews.sort({ $0.frame.origin.x < $1.frame.origin.x }) 
sortedViews[0].tintColor = UIColor.blueColor() 
9

Самый простой способ Я нашел это:

segmentControl.setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.redColor()], forState: UIControlState.Selected) 
+0

Это работает для простых случаев, если вы хотите изменить цвет кнопки на основе выбора. Мне нужно было изменить определенный индексный цвет независимо от выбранного состояния для пользовательского интерфейса. –

-1
class MyUISegmentedControl: UISegmentedControl { 

    required init(coder aDecoder: NSCoder){ 
     super.init(coder: aDecoder)! 
     for subViewOfSegment: UIView in subviews { 
      subViewOfSegment.tintColor = UIColor.red 
     } 
    } 
} 
0

Этот код прекрасно работает с последней версией Swift, как в марте 2017 года (Swift 3.0)

Здесь этот код, который я реализовал, является расширением для управления сегментом и может использоваться для всех элементов управления сегментами в приложении, где набор кода должен быть определен в классе приложения.

Метод расширения может использоваться непосредственно в приложении, также вы можете добавить все настройки к тому же методу или другим методам в классе расширения, как показано ниже.

extension UISegmentedControl { 
func setSegmentStyle() { 
    setBackgroundImage(imageWithColor(color: backgroundColor!), for: .normal, barMetrics: .default) 
    setBackgroundImage(imageWithColor(color: tintColor!), for: .selected, barMetrics: .default) 
    setDividerImage(imageWithColor(color: UIColor.clear), forLeftSegmentState: .normal, rightSegmentState: .normal, barMetrics: .default) 



    let segAttributes: NSDictionary = [ 
      NSForegroundColorAttributeName: UIColor.gray, 
      NSFontAttributeName: UIFont(name: "System-System", size: 14)! 
     ] 

     setTitleTextAttributes(segAttributes as [NSObject : AnyObject], for: UIControlState.selected) 
    } 

    // create a 1x1 image with this color 
    private func imageWithColor(color: UIColor) -> UIImage { 
     let rect = CGRect(x: 0.0, y: 0.0, width: 1.0, height: 1.0) 
     UIGraphicsBeginImageContext(rect.size) 
     let context = UIGraphicsGetCurrentContext() 
     context!.setFillColor(color.cgColor); 
     context!.fill(rect); 
     let image = UIGraphicsGetImageFromCurrentImageContext(); 
     UIGraphicsEndImageContext(); 
     return image! 
    } 
} 

Везде для сегментов ниже код может быть использован

self.mySegment.setSegmentStyle() 

enter image description here

1

После анализа и попытки много ответов на этот и другие подобные вопросы, я понял, что с 3-го участника пользовательский сегментированный контроль будет намного проще и безопаснее выполнять настройки, чем пытаться взломать UISegmentedControl от Apple.

Вот пример настройки с помощью XMSegmentedControl (Swift 3).

Некоторые в коде:

mySegmentControl.delegate = self 
    mySegmentControl.font = UIFont.systemFont(ofSize: 12) 

И какой в ​​Interface Builder (может быть сделано в коде тоже, если вы хотите):

enter image description here

Результат:

enter image description here

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

Обратите внимание, что XMSegmentedControl не позволяет иметь разные цвета фона для разных сегментов, но при необходимости вы можете легко добавить это, поскольку это простой .swift-файл, который очень легко понять и изменить.

+0

Я обновил свой ответ, чтобы показать возможности настройки. Пользовательский сегментированный элемент управления имеет простой и понятный код - вы можете легко изменить его, чтобы иметь возможность устанавливать индивидуальные цвета для каждого сегмента. – Vitalii

Смежные вопросы