Позвоните метке положение и размер вне класса (Swift4) - PullRequest
0 голосов
/ 09 ноября 2018

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

let backbutton = UILabel!
backbutton.translatesAutoresizingMaskIntoConstraints = false
backbutton.leftAnchor.constraint(equalTo: _, constant: 20).isActive = true
backbutton.topAnchor.constraint(equalTo: _, constant: 125).isActive = true
backbutton.widthAnchor.constraint(equalToConstant: 50).isActive = true
backbutton.heightAnchor.constraint(equalToConstant: 50).isActive = true

class nineViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        backbutton.text = String("red")

    }
}

class two: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        backbutton.text = String("two")
    }
}

Ответы [ 3 ]

0 голосов
/ 12 ноября 2018

Создайте класс Utilities отдельно, чтобы использовать глобальные функции внутри него.

Утилиты:

class Utilities: NSObject
{
    class func createLabel(on view: UIView, horizontalAnchors hAnchors: (leading: CGFloat, leadingView: UIView, trailing: CGFloat, trailingView: UIView), verticalAnchors vAnchors: (top: CGFloat, topView: UIView, bottom: CGFloat, bottomView: UIView)) -> UILabel {

        let label = UILabel()
        view.addSubview(label)
        label.backgroundColor = UIColor.red

        label.translatesAutoresizingMaskIntoConstraints = false
        label.leadingAnchor.constraint(equalTo: hAnchors.leadingView.leadingAnchor, constant: hAnchors.leading).isActive = true
        label.trailingAnchor.constraint(equalTo: hAnchors.trailingView.trailingAnchor, constant: -hAnchors.trailing).isActive = true
        label.topAnchor.constraint(equalTo: vAnchors.topView.topAnchor, constant: vAnchors.top).isActive = true
        label.bottomAnchor.constraint(equalTo: vAnchors.bottomView.topAnchor, constant: -vAnchors.bottom).isActive = true

        return label
    }

    class func createLabel(on view: UIView, positionAnchors pAnchors: (leading: CGFloat, leadingView: UIView, top: CGFloat, topView: UIView), size: (width: CGFloat, height: CGFloat)) -> UILabel {

        let label = UILabel()
        view.addSubview(label)
        label.backgroundColor = UIColor.red

        label.translatesAutoresizingMaskIntoConstraints = false
        label.leadingAnchor.constraint(equalTo: pAnchors.leadingView.leadingAnchor, constant: pAnchors.leading).isActive = true
        label.topAnchor.constraint(equalTo: pAnchors.topView.topAnchor, constant: pAnchors.top).isActive = true
        label.widthAnchor.constraint(equalToConstant: size.width).isActive = true
        label.heightAnchor.constraint(equalToConstant: size.height).isActive = true

        return label
    }
}

В ViewController:

@IBOutlet weak var autoLayedoutLabel: UILabel!

override func viewDidLoad() {
    super.viewDidLoad()

    let originY: CGFloat = 50
    let spacing: CGFloat = 16
    let width: CGFloat = 300
    let height: CGFloat = 50

    let label = Utilities.createLabel(on: view, positionAnchors: (spacing, view, originY, view), size: (width, height))
    label.text = "Label with Position Anchors & Size"
    label.backgroundColor = UIColor.red

    let label2 = Utilities.createLabel(on: view, horizontalAnchors: (spacing, view, spacing, view), verticalAnchors: (spacing + height, label, spacing, autoLayedoutLabel))
    label2.text = "Label with Horizontal & Vertical Anchors"
    label2.backgroundColor = UIColor.green
}

enter image description here

0 голосов
/ 12 ноября 2018

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

TabBarcontroller используется для тестирования здесь.

        let backbutton = UILabel()

        class MyTabBarController : UITabBarController {
            override func viewDidLoad() {
                  super.viewDidLoad()
               setViewControllers([SettingViewController(), NineViewController(), TwoViewController()], animated: false)
            }
        }


        class SettingViewController: UIViewController {

            override var tabBarItem: UITabBarItem!{
                get {
                    return UITabBarItem.init(title: "setting", image: nil, tag: 0)
                }
                set{
                    super.tabBarItem = newValue
                }

            }

            override func viewDidLoad() {
                  super.viewDidLoad()
                self.view.backgroundColor = UIColor.white
                self.view.addSubview(backbutton)
                backbutton.text = "cool"
                backbutton.translatesAutoresizingMaskIntoConstraints = false
                backbutton.leftAnchor.constraint(equalTo: self.view.leftAnchor, constant: 20).isActive = true
                backbutton.topAnchor.constraint(equalTo: self.view.topAnchor, constant: 125).isActive = true
                backbutton.widthAnchor.constraint(equalToConstant: 50).isActive = true
                backbutton.heightAnchor.constraint(equalToConstant: 50).isActive = true
            }
        }

        class NineViewController: UIViewController {

            override var tabBarItem: UITabBarItem!{
                get {
                    return UITabBarItem.init(title: "nine", image: nil, tag: 0)
                }
                set{
                    super.tabBarItem = newValue
                }

            }
            override func viewDidLoad() {
                super.viewDidLoad()
                   self.view.backgroundColor = UIColor.white
                backbutton.text = String("red")
            }
            override func viewWillAppear(_ animated: Bool) {
                super.viewWillAppear(animated)
                backbutton.text = String("red-Appear")
            }

        }

        class TwoViewController: UIViewController {
            override var tabBarItem: UITabBarItem!{
                get {
                    return UITabBarItem.init(title: "two", image: nil, tag: 0)
                }
                set{
                    super.tabBarItem = newValue
                }

            }
            override func viewDidLoad() {
                super.viewDidLoad()
                   self.view.backgroundColor = UIColor.white
                backbutton.text = String("two")
            }

            override func viewWillAppear(_ animated: Bool) {
                super.viewWillAppear(animated)
                backbutton.text = String("two-Appear")
            }
        }

Если вы предпочитаете определять ярлык внутри одного класса. Вы можете определить глобальную UILabel следующим образом:

weak var backbutton: UILabel!

    class SettingViewController: UIViewController {
                let mybutton = UILabel()
                backbutton = mybutton
               // continue
     }

Вам не нужно менять какие-либо другие коды.

Теперь вторая часть истории. Если вы хотите установить глобальную UILabel вне любого представления, это возможно. Без ограничений все очень просто:

let backbutton: UILabel! = {
let button = UILabel()
button.text = "test"
button.frame = CGRect.init(x: 200, y: 200, width: 50, height: 50)
return button
}()

Настройка View изменяется следующим образом:

        class SettingViewController: UIViewController {

            override var tabBarItem: UITabBarItem!{
                get {
                    return UITabBarItem.init(title: "setting", image: nil, tag: 0)
                }
                set{
                    super.tabBarItem = newValue
                }

            }


            override func viewDidLoad() {
                super.viewDidLoad()
                self.view.backgroundColor = UIColor.white
                self.view.addSubview(backbutton)
            }
        }

Понятно, что в SettingVC есть только одна строка. Но если вам нужно использовать ограничения, что мы должны делать? Все остальное в порядке, но положение ограничений UILabel зависит от superView UILabel. Поэтому здесь можно использовать расширение, чтобы упростить процесс.

    let specialLabelTag =  1001
    let backbutton: UILabel! = {
        let button = UILabel()
        button.tag = specialLabelTag
        button.text = "test" // for test purpose
        button.translatesAutoresizingMaskIntoConstraints = false
        button.widthAnchor.constraint(equalToConstant: 50).isActive = true
        button.heightAnchor.constraint(equalToConstant: 50).isActive = true
        return button
    }()
    extension UILabel{
         override open func didMoveToSuperview() {
            superview?.didMoveToSuperview()
            if(tag == specialLabelTag){
                leftAnchor.constraint(equalTo: superview!.leftAnchor, constant: 20).isActive = true
                topAnchor.constraint(equalTo: superview!.topAnchor, constant: 125).isActive = true
              }
        }

Тег, используемый в расширении, предназначен для идентификации глобальной UILabel, чтобы не влиять на другие UILabel. Только расширения позиции необходимы в расширении. Настройка UP vc такая же, как и раньше.

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

Кстати, вы можете создать подкласс UILabel для MyUILabel с указанным выше кодом, а затем сделать его глобальным (просто поместите его вне любого класса). Это было бы намного проще, потому что вам не нужно использовать specialLabelTag.

 let backbutton = MyUILabel()
0 голосов
/ 11 ноября 2018

Вы можете иметь другую переменную для buttonText и установить его позицию и размер в его установщике, как

var buttonText:String {
   didSet{
     backButton.text = buttonText
     setFontAndPosition()
   }
}

и в viewController просто установите значение

 override func viewDidLoad() {
        super.viewDidLoad()
        buttonText = "red"
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...