Как изменить размер textLabel в сегментированном элементе управления в Swift? - PullRequest
0 голосов
/ 29 мая 2018

В UIViewController есть Сегментированный контроллер, расположенный в верхней части представления.Ограничения: слева: 0, справа: 0, сверху: 0, высота: 90.

Каждый раз, когда публикуется уведомление UIApplicationDidBecomeActive, сегментированный элемент управления должен обновлять свой вид до самой новой даты, вызывая func updateUI()

При первой загрузке, когда viewDidLoad вызывается как текст вкаждый сегмент отображается как и ожидалось.
Однако, если приложение переходит в фоновый режим, когда оно возвращается на передний план, метка сегментированного элемента управления не вмещает текст и показывает 3 точки ... после.Смотрите приложение и GIF ниже.

Область действия: обновлять сегментированный заголовок элемента управления для каждого сегмента каждый раз, когда публикуется уведомление .UIApplicationDidBecomeActive.Публичный проект Github https://github.com/bibscy/testProject

 class ViewController: UIViewController {

   var stringDates = [String]()

   var dateNow: Date {
     return Date()
   }
      @IBOutlet weak var segmentedControl: UISegmentedControl!

       func updateUI() {
    //create string dates and set the title of for each segment in segmented control
          self.getNextDays()  
     }

   override func viewDidLoad() {
      super.viewDidLoad()

      NotificationCenter.default.addObserver(self, selector: #selector(updateUI), name: .UIApplicationDidBecomeActive, object: nil)

     UILabel.appearance(whenContainedInInstancesOf: [UISegmentedControl.self]).numberOfLines = 0

      self.getNextDays()
   }
}


  extension ViewController {

//for each segment, construct a string date with the currentDate() being first, followed by 5 consecutive days
func getNextDays()  {

    stringDates.removeAll() //clear any previous data

    for i in 0...5 {
        let dateFormatter = DateFormatter()
        let today = dateNow
        let calendar = Calendar.current

        if i == 0 {
            let dayComponent = Calendar.current.component(.weekday,from: today)
            let day = Calendar.current.component(.day, from: today) //Int
            let dayString = dateFormatter.shortWeekdaySymbols[dayComponent-1] //Symbol


            let month = Calendar.current.component(.month, from: today)
            let monthSymbol = dateFormatter.shortMonthSymbols[month-1]
            let dayMonthString =  dayString + " " + String(day) + " " + monthSymbol
            stringDates.append(dayMonthString)


        } else {
            var components = DateComponents()
            components.weekday = i

            let nextDay = calendar.date(byAdding: components, to: today)
            let nextDayComponent = Calendar.current.component(.weekday,from: nextDay!)
            let day = Calendar.current.component(.day, from: nextDay!)
            let dayString = dateFormatter.shortWeekdaySymbols[nextDayComponent-1] // Symbol


            let month = Calendar.current.component(.month, from: nextDay!)
            let monthSymbol = dateFormatter.shortMonthSymbols[month-1]
            let dayMonthString = dayString + " " + String(day) + " " + monthSymbol
            stringDates.append(dayMonthString)
        }
    }


      //set the title for each segment from stringDates array
       for value in 0...5 {
         self.segmentedControl.setTitle(self.stringDates[value], forSegmentAt: value)
      }
   } //end of getNextDays()  
}

enter image description here enter image description here

1 Ответ

0 голосов
/ 29 мая 2018

Проблема воспроизводится только в 10.3 версии iOS.Решение:

Сохранение начальных свойств сегментированной метки:

fileprivate var height: CGFloat! 
fileprivate var width: CGFloat!

Добавить в ViewDidLoad непосредственно перед getNextDays:

let label = segmentedControl.subviews[0].subviews[0] as! UILabel 
height = label.frame.height 
width = label.frame.width

Установить текст:

for value in 0...5 {
   segmentedControl.setTitle(stringDates[value], forSegmentAt: value)
}

И исправить кадры после этого:

let labels = segmentedControl.subviews.map{ $0.subviews[1] } as! [UILabel]
    labels.forEach { (label) in
        label.numberOfLines = 0
        let frame = label.frame
        label.frame = CGRect(x: frame.origin.x, y: frame.origin.y, width: width, height: height)
    }

Пример кода с некоторой защитой от сбоев

...