Можно ли установить выравнивание сегментированных контрольных заголовков по левому краю? - PullRequest
0 голосов
/ 19 сентября 2019

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

Я создал эту маленькую функциюизменить кадр подпредставлений сегмента управления.Сначала он работает.

    func modifyFrameOfSegment() {
       for segment in segmentedControl.subviews {
          guard segment.subviews.isNotEmpty else { return }
          segment.contentMode = .left
           for label in segment.subviews where label is UILabel {
              label.frame = CGRect(x: 0, y: label.frame.origin.y, width: label.frame.size.width, height: label.frame.size.height)
              (label as! UILabel).textAlignment = .left
           }
       }
    }

Но каждый раз, когда я выбираю новый сегмент, он сбрасывает кадры всех подпредставлений и снова выравнивает по центру все заголовки.

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

Любые советы или рекомендации будут с благодарностью.

Спасибо за ваше время.

Ответы [ 2 ]

1 голос
/ 20 сентября 2019

Давайте использовать этот метод

self.segmentedControl.setContentPositionAdjustment(UIOffset(horizontal: -20, vertical: 0), forSegmentType: .left, barMetrics: .default)

И вы можете делать то, что вы хотите (Конечно, вы можете изменить горизонтальное и вертикальное значение в соответствии с вашими потребностями).Вот результат:

enter image description here

0 голосов
/ 20 сентября 2019

Обновление:

По-видимому, нет способа установить выравнивание элементов, но вы можете подделать его, отрегулировав положение каждого отдельного элемента с помощью setContentOffset(_ offset: CGSize, forSegmentAt segment: Int).Вот хитрый пример:

class LeftSegmentedControl: UISegmentedControl {

    var margin : CGFloat = 10

    override func layoutSubviews() {
        super.layoutSubviews()
        leftJustifyItems()
    }

    func leftJustifyItems() {
        let fontAttributes = titleTextAttributes(for: .normal)
        let segments = numberOfSegments - 1
        let controlWidth = frame.size.width
        let segmentWidth = controlWidth / CGFloat(numberOfSegments)
        for segment in 0...segments {
            let title = titleForSegment(at: segment)
            setWidth(segmentWidth, forSegmentAt: segment)
            if let t = title {
                let titleSize = t.size(withAttributes: fontAttributes)
                let offset = (segmentWidth - titleSize.width) / 2 - margin
                self.setContentOffset(CGSize(width: -offset, height: 0), forSegmentAt: segment)
            }
        }
    }
}

Вот как это выглядит:

image

Есть несколько предостережений:

  • В этой версии все сегменты имеют одинаковую ширину, которая может быть не такой, как вы хотите.

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

  • То, что вы можете сделать это, не означает, что выдолжен. Лично я не думаю, что это выглядит великолепно, и страдает в отделе юзабилити тоже.Пользователи ожидают, что сегментированные элементы управления будут центрированы, а выравнивание по левому краю элементов затруднит для них понимание, где нажать, чтобы попасть в сегмент.Это особенно актуально для коротких предметов, таких как «3-й» в примере.Это не ужасно, просто кажется немного странным.

Оригинальный ответ:

UIControl (подкласс которого UISegmentedControl) имеет *Свойство 1040 *, которое должно указывать элементу управления выравнивать его содержимое определенным образом, поэтому логично было бы установить его следующим образом:

let segmented = UISegmentedControl(items: ["Yes", "No", "Maybe"])
segmented.frame = CGRect(x:75, y:250, width:250, height:35)
segmented.contentHorizontalAlignment = .left

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

Один из способов решения этой проблемы - визуализировать ваши ярлыки в изображения, а затем использовать изображения в качествеметки сегмента вместо простых строк.Начиная с кода в Как преобразовать UIView в изображение , вы можете легко создать подкласс UISegmentedControl для создания изображений из строк элементов.

...