[Из песочницы] Segmented Control своими руками, как в iOS 13.0 и выше

В iOS 13 обновили Segmented Control, но для тех кто не может обновить Xcode, он просто не доступен. Вот я и решил написать, как можно быстро сделать самому такой же Segmented Control.
Поехали!

Первым делом переходим в Storyboard. Размещаем на нашем ViewController элемент View.

1m_kqablyo3h58svmtffmioq-om.png

Закрепляем его констрейнтами как вам угодно и в каком месте он вам нужен.
Закрашиваем фон и ставим галочку clip to Bounds.

tytvqeef4ugonj7uep-ocwyqhb4.png

Берем еще одно View и размещаем его внутри нашего первого View. Только обязательно посмотрите что он был внутри вашего первого View. Он должен быть размещен в лестничном порядке.
w3snew5nsamvnxmmg3vuci0sam8.png

Далее закрепляем его констрейнтами с отступом в 2 pix со всех сторон.

yp7xfhetyl07naz4ebhz5dd4cas.png

И он будет размещен внутри вашего первого вью как на фото ниже.

mzubsiqbkfpshsm-dwcq8fq8oxm.png

Далее выделяем наш белый View который внутренний. Выбираем leading и traling констрейн, и меняем у них Priority на 750.

fx1hla6zsjao2onsj733dg7fwlo.png

Теперь создаем у данного View еще два констрейнта с лева и справа с отступом 0 pix

nob-dkuovx_pewhu_ik9bcrcw-y.png

Так же переходим в редактирование данных констрейнтов которые мы создали только что и меняем у них Priority = 900 и закрепляем их не от краев нашего серого View, а ставим относительно центра и если вы все сделаете правильно то ваш белый View соберется линией в центре.

uit23_xguypgcxjfjqjggi7ifas.png

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

vakpt_wygn6vl4dkq6x-po68qba.png

Все. Tеперь соединяем наши элементы с сториборд с ViewController.
Серый View я назвал — fonView.
Белый View назвал — blockView.
Так же две кнопки buttonOne и buttonTwo и создал у них action.

vwtka0jpeibououzvkemsy9jmbo.png

Еще в наш код перетягиваем два констрейнта которые мы сделали с priority 750. Назовем их:

@IBOutlet weak var checkButtonOne: NSLayoutConstraint!
@IBOutlet weak var checkButtonTwo: NSLayoutConstraint!


yk7zuzdn-aaoczj5wgl6raard8c.png

В viewDidLoad мы прописываем только закругление наших View и один констрейн делаем равным priority 950 что бы белое вью не было в середине как линия, а выглядела как выбранный сегмент.

override func viewDidLoad() {
        super.viewDidLoad()
        fonView.layer.cornerRadius = 10
        blockView.layer.cornerRadius = 9
        checkButtonOne.priority = UILayoutPriority(rawValue: 950)
    }


Финишная прямая. В action button мы прописываем такой код. суть в том что мы меняем наши приоритеты и вью увеличивается на нужные размеры и делаем обновление наших констрейнтов анимированно.


@IBAction func buttonOne(_ sender: UIButton) {
        checkButtonOne.priority = UILayoutPriority(rawValue: 950)
        checkButtonTwo.priority = UILayoutPriority(rawValue: 750)
        UIView.animate(withDuration: 0.5) {
            self.view.layoutIfNeeded()
        }
    }
    
@IBAction func buttonTwo(_ sender: UIButton) {
        checkButtonOne.priority = UILayoutPriority(rawValue: 750)
        checkButtonTwo.priority = UILayoutPriority(rawValue: 950)
        UIView.animate(withDuration: 0.5) {
            self.view.layoutIfNeeded()
        }
    }


Это все! Проверяем!

s_qh_zegxuhx555eoizxeudftus.png

© Habrahabr.ru