在我的Swift应用程序中,我不知道如何在UISegmentControl中单独更改选定段的BGColor。我尝试了很多,只有色调正在改变。我在Objective - C中取得了成功。我不知道如何将其转换为SWIFT。请指导我。我的编码如下:
目标C.
- (IBAction)mySeg:(UISegmentedControl *)sender {
for (int i=0; i<[sender.subviews count]; i++)
{
if ([[sender.subviews objectAtIndex:i]isSelected] )
{
UIColor *tintcolor=[UIColor colorWithRed:255.0/255.0 green:0/255.0 blue:0/255.0 alpha:1.0];
[[sender.subviews objectAtIndex:i] setTintColor:tintcolor]; //HERE SELECTED SEGMENT COLOR ALONE CHANGING
}
else
{
[[sender.subviews objectAtIndex:i] setTintColor:nil];
}
}
}
迅速
@IBAction func mySegAcn(sender: UISegmentedControl) {
for(var i : Int = 0; i < sender.subviews.count; i++)
{
if((sender.subviews[i].isSelected) != nil)
{
//var tint_Color = UIColor(red: 1.0, green: 0, blue: 0, alpha: 1.0)
(sender.subviews[i] as! UIView).tintColor = UIColor .redColor() //HERE WHOLE TINT COLOR IS CHANGING
}
else
{
(sender.subviews[i] as! UIView).tintColor = nil
}
}
}
产量
Swift代码的问题是可选的处理:即使(sender.subviews[i].isSelected) != nil
为假,isSelected
也会成立。
尝试使用Swift语法编写循环
for subview in (sender.subviews as! [UIView]) {
if (subview.isSelected) {
subview.tintColor = UIColor.redColor()
}
else {
subview.tintColor = nil
}
}
至少在该循环中,您实际上正在测试是否选择子视图而不是视图是否为零。
我尝试使用isSelected,它给出了一个错误,说该方法不存在。这是另一种没有isSelected方法的方法
使用值更改事件为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()
斯威夫特4
let sortedViews = segmentedControl.subviews.sorted( by: { $0.frame.origin.x < $1.frame.origin.x } )
for (index, view) in sortedViews.enumerated() {
if index == segmentedControl.selectedSegmentIndex {
view.tintColor = UIColor.red
} else {
view.tintColor = UIColor.green
}
}
根据@MiKL的建议,以下代码工作正常。
码
for(var i : Int = 0; i < sender.subviews.count; i++)
{
if ((sender.subviews[i].isSelected) == true)
{
(sender.subviews[i] as! UIView).tintColor = UIColor .redColor()
}
else
{
(sender.subviews[i] as! UIView).tintColor = nil
}
}
您的更改颜色代码工作正常,唯一的问题是如果条件不能以相同的方式工作在目标c中。
如果条件改变
if(sender.selectedSegmentIndex != i)
@IBAction func action(sender: UISegmentedControl) {
for(var i : Int = 0; i < sender.subviews.count; i++)
{
if(sender.selectedSegmentIndex != i)
{
//var tint_Color = UIColor(red: 1.0, green: 0, blue: 0, alpha: 1.0)
(sender.subviews[i] as! UIView).tintColor = UIColor .redColor()
//HERE WHOLE TINT COLOR IS CHANGING
}
else
{
(sender.subviews[i] as! UIView).tintColor = nil
}
}
}
对于Swift:单击分段控制(@IBAction)使用以下代码
@IBAction func segmentChanged(sender: UISegmentedControl) {
let sortedSubViews = sender.subviews.sort { $0.frame.minX < $1.frame.minX }
let selectedSegment = sortedSubViews[sender.selectedSegmentIndex]
sortedSubViews.forEach({
// white is selected color and cayan color is for not selected item
$0.tintColor = $0 == selectedSegment ? UIColor.whiteColor() : UIColor.cyanColor()
})
}
创建segmentedControl的出口,在viewDidLoad上你需要调用上面的函数。
self.segmentChanged(segmentedControl)
更新Swift 4.1中的@gabo答案,因为我没有权限修改他的答案。
@IBAction func indexChanged(sender: UISegmentedControl) {
let sortedViews = sender.subviews.sorted( by: { $0.frame.origin.x < $1.frame.origin.x } )
for (index, view) in sortedViews.enumerated() {
if index == sender.selectedSegmentIndex { //When selected
view.tintColor = UIColor.blue
} else {//Unselected
view.tintColor = nil
}
}
}
最初在viewDidLoad中选择的段
let sortedViews = segmentedControlOutletVariable.subviews.sorted( by: { $0.frame.origin.x < $1.frame.origin.x } )
sortedViews[0].tintColor = UIColor.blue //Default Selection color