2014-11-05 3 views
3

iOS 7 и 8 похоже, что старые способы настройки UISegmentedControl не работают полностью. Я устанавливал изображения разделителей и все, что я всегда имел в прошлом, но, похоже, что в предыдущих версиях iOS не было никаких новых состояний, и в результате появляются некоторые странные визуальные эффекты.Настроить UISegmentedControl на iOS 8

enter image description here

Вот код, который я использую

// Set divider images 
    self.setDividerImage(UIImage(named: "SegmentedControlNoneSelected"), forLeftSegmentState: .Normal, rightSegmentState: .Normal, barMetrics: .Default) 
    self.setDividerImage(UIImage(named: "SegmentedControlRightSelected"), forLeftSegmentState: .Normal, rightSegmentState: .Selected, barMetrics: .Default) 
    self.setDividerImage(UIImage(named: "SegmentedControlRightSelected"), forLeftSegmentState: .Normal, rightSegmentState: .Highlighted, barMetrics: .Default) 
    self.setDividerImage(UIImage(named: "SegmentedControlLeftSelected"), forLeftSegmentState: .Selected, rightSegmentState: .Normal, barMetrics: .Default) 
    self.setDividerImage(UIImage(named: "SegmentedControlBothSelected"), forLeftSegmentState: .Selected, rightSegmentState: .Highlighted, barMetrics: .Default) 
    self.setDividerImage(UIImage(named: "SegmentedControlBothSelected"), forLeftSegmentState: .Selected, rightSegmentState: .Selected, barMetrics: .Default) 
    self.setDividerImage(UIImage(named: "SegmentedControlBothSelected"), forLeftSegmentState: .Highlighted, rightSegmentState: .Selected, barMetrics: .Default) 
    self.setDividerImage(UIImage(named: "SegmentedControlBothSelected"), forLeftSegmentState: .Highlighted, rightSegmentState: .Highlighted, barMetrics: .Default) 
    self.setDividerImage(UIImage(named: "SegmentedControlLeftSelected"), forLeftSegmentState: .Highlighted, rightSegmentState: .Normal, barMetrics: .Default) 


    // Set background images 
    var normalBackgroundImage = UIImage(named: "SegmentedControlNormal") 
    self.setBackgroundImage(normalBackgroundImage, forState: .Normal, barMetrics: .Default) 

    var selectedBackgroundImage = UIImage(named: "SegmentedControlSelected"); 
    self.setBackgroundImage(selectedBackgroundImage, forState: .Selected, barMetrics: .Default) 
    self.setBackgroundImage(selectedBackgroundImage, forState: .Highlighted, barMetrics: .Default) 
    self.setBackgroundImage(selectedBackgroundImage, forState: .Disabled, barMetrics: .Default) 
    self.setBackgroundImage(selectedBackgroundImage, forState: .Application, barMetrics: .Default) 
    self.setBackgroundImage(selectedBackgroundImage, forState: .Reserved, barMetrics: .Default) 
+0

Вы когда-нибудь это выясняли? У меня такая же проблема. –

+0

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

+0

Да, это то, что я планирую делать. Не самый удачный вариант, но пока он кажется единственным. –

ответ

2

некоторые новые состояния, которые должны быть обработаны в настоящее время:

//The highlighted button can be still unselected 
[self.mySegmentedControl setBackgroundImage:unselectedBackgroundImage 
            forState:UIControlStateHighlighted 
           barMetrics:UIBarMetricsDefault]; 

//The alredy selected button is stil selected when it is highlighted 
[self.mySegmentedControl setBackgroundImage:selectedBackgroundImage 
            forState:UIControlStateHighlighted|UIControlStateSelected 
           barMetrics:UIBarMetricsDefault]; 


//Handle when the right segment is highlighted but the left is selected 
[self.mySegmentedControl setDividerImage:leftSelectedImage 
         forLeftSegmentState:UIControlStateSelected 
         rightSegmentState:UIControlStateHighlighted 
           barMetrics:UIBarMetricsDefault]; 

//Handle when the right segment is already selected and just highlighted and the right is normal 
[self.mySegmentedControl setDividerImage:leftSelectedImage 
        forLeftSegmentState:UIControlStateHighlighted|UIControlStateSelected 
         rightSegmentState:UIControlStateNormal 
           barMetrics:UIBarMetricsDefault]; 

//Handle when the left segment is highlighted but the right is selected  
[self.mySegmentedControl setDividerImage:rightSelectedImage 
        forLeftSegmentState:UIControlStateHighlighted 
         rightSegmentState:UIControlStateSelected 
           barMetrics:UIBarMetricsDefault]; 

//Handle when the left segment is already selected and just highlighted and the left is normal 
[self.mySegmentedControl setDividerImage:rightSelectedImage 
        forLeftSegmentState:UIControlStateNormal 
         rightSegmentState:UIControlStateHighlighted|UIControlStateSelected 
           barMetrics:UIBarMetricsDefault]; 

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