Как создать пользовательский сегмент управления в Swift - PullRequest
0 голосов
/ 18 октября 2018

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

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

enter image description here

Ответы [ 2 ]

0 голосов
/ 18 октября 2018

Существует проект с открытым исходным кодом в GitHub с именем PageMenu.Пожалуйста, посмотрите, вы даже можете настроить исходный файл CAPSPageMenu.

https://github.com/PageMenu/PageMenu

enter image description here

Для обновления ширинывыделите линию волос, включите свойство ниже.

menuItemWidthBasedOnTitleTextWidth

Код:

let parameters: [CAPSPageMenuOption] = [ 
... 
.menuItemWidthBasedOnTitleTextWidth(true),
....]

// Initialize scroll menu
pageMenu = CAPSPageMenu(viewControllers: controllerArray, frame: CGRect(x: 0.0, y: 0.0, width: self.view.frame.width, height: self.view.frame.height), pageMenuOptions: parameters)

Пожалуйста, попробуйте демо PageMenuDemoStoryboard в проекте и обновите parameters, как показано в приведенном выше коде.

enter image description here

enter image description here

0 голосов
/ 18 октября 2018
    import UIKit

extension UIView {
    func constraintsEqualToSuperView() {
        if let superview = self.superview {
            NSLayoutConstraint.activate(
                [
                    self.topAnchor.constraint(
                        equalTo: superview.topAnchor
                    ),
                    self.bottomAnchor.constraint(
                        equalTo: superview.bottomAnchor
                    ),
                    self.leadingAnchor.constraint(
                        equalTo: superview.leadingAnchor
                    ),
                    self.trailingAnchor.constraint(
                        equalTo: superview.trailingAnchor
                    )
                ]
            )
        }
    }
}

protocol ButtonsViewDelegate: class {
    func didButtonTap(buttonView: ButtonsView, index: Int)
}

class ButtonsView: UIView {

    fileprivate let stackView         = UIStackView()
    fileprivate var array             = [String]()
    fileprivate var buttonArray       = [UIButton]()
    fileprivate let baseTag = 300
    weak var delegate: ButtonsViewDelegate?

    override init(frame: CGRect) {
        super.init(frame: frame)

    }
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    fileprivate func setupUI () {
        setupStackView()
        setupButton()
    }


    convenience init(buttons: [String]) {
        self.init()
        array = buttons
        setupUI()
        //selectButton(atIndex: 0)
    }


    fileprivate func setupStackView() {
        addSubview(stackView)
        stackView.translatesAutoresizingMaskIntoConstraints = false
        stackView.distribution = .fillEqually
        stackView.constraintsEqualToSuperView()
    }

    fileprivate func setupButton() {
        for (i,string) in array.enumerated() {
            let button = UIButton()
            button.setTitle(string.uppercased(), for: .normal)
//            button.backgroundColor = UIColor.lightBackgroundColor().lightened(by: 0.2)
            button.translatesAutoresizingMaskIntoConstraints = false
            button.addTarget(
                self,
                action: #selector(buttonClicked(sender:)),
                for: .touchUpInside
            )
            button.setTitleColor(
                .black,
                for: .normal
            )
            button.titleLabel?.font = UIFont.systemFont(
                ofSize: 14,
                weight: UIFont.Weight.bold
            )

//            let view = UIView.init(frame: CGRect.init(x: 0, y: button.frame.size.height - 1, width: button.frame.size.width, height: 1))

            let view = UIView()
            view.translatesAutoresizingMaskIntoConstraints = false
            view.backgroundColor = UIColor.clear
            view.tag = baseTag + i
            button.addSubview(view)
            NSLayoutConstraint.activate([
                view.leadingAnchor.constraint(
                    equalTo: button.leadingAnchor
                ),
                view.trailingAnchor.constraint(
                    equalTo: button.trailingAnchor
                ),
                view.bottomAnchor.constraint(
                    equalTo: button.bottomAnchor
                ),
                view.heightAnchor.constraint(
                    equalToConstant: 1
                )
            ])

            stackView.addArrangedSubview(button)
            buttonArray.append(button)
        }
    }

    func selectButton(atIndex index: Int) {
        if index <= buttonArray.count {
            buttonClicked(sender: buttonArray[index])
        }
    }

    @objc private func buttonClicked(sender: UIButton) {
        for button in buttonArray {
            if button == sender {
                button.setTitleColor(
                    UIColor.darkGray,
                    for: .normal
                )
               setUpBottomLine(button: button)
            }else{
                button.setTitleColor(
                    .black,
                    for: .normal
                )
               hideBottomLine(button: button)
            }
        }

        if let index = buttonArray.index(of: sender) {
            delegate?.didButtonTap(buttonView: self, index: index)
        }
    }

    private func setUpBottomLine(button: UIButton) {
        if let index = buttonArray.index(of: button) {
            if let view = button.viewWithTag(baseTag + index) {
                view.backgroundColor = UIColor.red
            }
        }
    }

    private func hideBottomLine(button: UIButton) {
        if let index = buttonArray.index(of: button) {
            if let view = button.viewWithTag(baseTag + index) {
                view.backgroundColor = .clear
            }
        }
    }
}

//how to use
let durationBtns = ButtonsView(buttons: [
    NSLocalizedString(
        "day",
        comment: ""
    ),
    NSLocalizedString(
        "week",
        comment: ""
    ),
    NSLocalizedString(
        "month",
        comment: ""
    ),
    NSLocalizedString(
        "year",
        comment: ""
    )
    ])
durationButtons = durationBtns
durationButtons.selectButton(atIndex: 0)
durationBtns.delegate = self

//handle buttton tap
extension viewController: ButtonsViewDelegate {
    func didButtonTap(buttonView: ButtonsView, index: Int) {
        print(index.description)
    }
}
...