UIButtons setAttributedTitle исчезает после вызова layoutSubviews в расширении UIButton - PullRequest
0 голосов
/ 29 декабря 2018

У меня была проблема углового радиуса со всеми моими кнопками UIB, но, наконец, я смог ее решить, следуя решению в ( Установка радиуса угла через viewDidAppear () или viewWillLayoutSubviews ()? ). Однако,теперь я "потерял" все свои названия кнопок.Я боролся с этой проблемой в течение нескольких недель и чувствую, что очень близок к тому, чтобы разобраться во всем этом.Я прошу прощения, если это плохо сформулированный вопрос, поскольку я все еще относительно новичок в Swift.

Вот приложение, над которым я работаю: мой проект калькулятора iOS по умолчанию

В моем Swift-файле UIButtonExtension.swift у меня есть следующее:

import Foundation
import UIKit

extension UIButton {
   override open func layoutSubviews() {
        super.layoutSubviews()

        let radius = min(bounds.width, bounds.height) / 2
        layer.cornerRadius = radius

    }
}

В одном из моих других Swift-файлов, myCalculatorViewController.swift, у меня есть:

import UIKit

class myCalculatorViewController: UIViewController {

@IBOutlet weak var tag1_Button: UIButton!
@IBOutlet weak var tag2_Button: UIButton!
@IBOutlet weak var tag3_Button: UIButton!
//     .....
@IBOutlet weak var tag19_Button: UIButton!


override func viewDidLoad() {
super.viewDidLoad()

// main/basic calc button view controller

tag1_Button.titleLabel?.textAlignment = .center
tag1_Button.contentHorizontalAlignment = .center
tag1_Button.titleLabel?.numberOfLines = 1
let str_tag1_Button = NSMutableAttributedString(string: "AC")
str_tag1_Button.addAttribute(NSAttributedStringKey.font, value: UIFont.systemFont(ofSize: 10), range: NSMakeRange(0, 2))    
str_tag1_Button.addAttribute(NSAttributedStringKey.foregroundColor, value: UIColor(red: 0/255.0, green: 0/255.0, blue: 0/255.0, alpha: 1.0), range: NSMakeRange(0, 2))
tag1_Button.setAttributedTitle(str_tag1_Button, for: .normal) 
tag1_Button.backgroundColor = UIColor(red: 40/255.0, green: 247/255.0, blue: 45/255.0, alpha: 1.0)

// and so forth with the rest of the tag buttons up to tag19_Button that sets title, "="

}
}

Далее, в другом Swift-файле, instantiatedLandscapeButtonViewController, у меня есть похожая настройка для кнопок UIBот tag1 до tag30:

import UIKit

class instantiatedLandscapeButtonViewController: UIViewController {


@IBOutlet weak var tag1_Button: UIButton!
@IBOutlet weak var tag2_Button: UIButton!
@IBOutlet weak var tag3_Button: UIButton!
//     .....
@IBOutlet weak var tag30_Button: UIButton!

override func viewDidLoad() {
super.viewDidLoad()

// additional landscape buttons, setup

tag1_Button.titleLabel?.textAlignment = .center
tag1_Button.contentHorizontalAlignment = .center
tag1_Button.titleLabel?.numberOfLines = 1
let str_tag1_Button = NSMutableAttributedString(string: "mc")
str_tag1_Button.addAttribute(NSAttributedStringKey.font, value: UIFont.systemFont(ofSize: 10), range: NSMakeRange(0, 2))
str_tag1_Button.addAttribute(NSAttributedStringKey.foregroundColor, value: UIColor(red: 251/255.0, green: 251/255.0, blue: 251/255.0, alpha: 1.0), range: NSMakeRange(0, 2))
tag1_Button.setAttributedTitle(str_tag1_Button, for: .normal)

// and so forth

}




}

1 Ответ

0 голосов
/ 30 декабря 2018

Ваш код в его нынешнем виде опасен и незаконен:

extension UIButton {
   override open func layoutSubviews() {

Нет!Вы не можете выполнить override в extension!Результаты могут быть непредсказуемыми.Чтобы получить надежную круглую кнопку, нужно подкласс UIButton, где override - законно, и использовать этот подкласс.

class MyCircularButton: UIButton {
    override open func layoutSubviews() {
        super.layoutSubviews()
        let radius = min(bounds.width, bounds.height) / 2
        layer.cornerRadius = radius
    }
}

Теперь используйте MyCircularButtonвместо простого UIButton, где вы хотите круглую кнопку.Я не знаю, что это решит проблему, с которой вы столкнулись, но это, безусловно, необходимый первый шаг.

Я протестировал оставшийся код следующим образом, и он работал нормально:

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        let tag1_Button = MyCircularButton()
        tag1_Button.frame = CGRect(x: 100, y: 100, width: 40, height: 40)
        tag1_Button.titleLabel?.textAlignment = .center
        tag1_Button.contentHorizontalAlignment = .center
        tag1_Button.titleLabel?.numberOfLines = 1
        let str_tag1_Button = NSMutableAttributedString(string: "AC")
        str_tag1_Button.addAttribute(.font, value: UIFont.systemFont(ofSize: 10), range: NSMakeRange(0, 2))
        str_tag1_Button.addAttribute(.foregroundColor, value: UIColor(red: 0/255.0, green: 0/255.0, blue: 0/255.0, alpha: 1.0), range: NSMakeRange(0, 2))
        tag1_Button.setAttributedTitle(str_tag1_Button, for: .normal)
        tag1_Button.backgroundColor = UIColor(red: 40/255.0, green: 247/255.0, blue: 45/255.0, alpha: 1.0)
        self.view.addSubview(tag1_Button)
    }
}

Результат:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...