Я пытаюсь изменить размер шрифта самой кнопки после ее нажатия.

class ViewController: UIViewController {
   @IBOutlet weak var buttonToResize: UIButton!

   @IBAction func buttonTapped(_ sender: UIButton) {
        buttonToResize.titleLabel!.font = UIFont(name: "Helvetica", size: 40)
// Also tried buttonToResize.titleLabel?.font = UIFont .systemFont(ofSize: 4)
}

Однако изменения не применяются.

Что интересно для меня, если я попытаюсь изменить размер какой-либо другой кнопки (второй) после нажатия на начальную (первую), она будет работать как положено.

Как это:

class ViewController: UIViewController {
@IBOutlet weak var buttonToResize: UIButton!
@IBOutlet weak var secondButtonToResize: UIButton!

@IBAction func buttonTapped(_ sender: UIButton) {
    secondButtonToResize.titleLabel!.font = UIFont(name: "Helvetica", size: 40)
}

Другие свойства, такие как backgroundColor, похоже, применяются, однако с размером шрифта я сталкиваюсь с проблемой.

0
Andrew 3 Фев 2022 в 22:47

2 ответа

Вы, наверное, хотите что-то вроде этого

struct MyView: View {
  @State var pressed: Bool = false

  var body: some View {
    Button(action: {
      withAnimation { 
        pressed = true 
      }
    }) {
      Text("Hello")
    }
    Button(action: {
    }) {
      Text("Hello")
         .font(pressed ? .system(size: 40) : .system(size: 20))
    }
  }
}
0
aeskreis 3 Фев 2022 в 23:16
Я новичок в Swift. Можно ли выразить код в виде UIKit?
 – 
Andrew
4 Фев 2022 в 01:27

Во-первых, вот последовательность событий, когда вы нажимаете на UIButton.

  1. Кнопка устанавливает для собственного свойства isHighlighted значение true.
  2. Кнопка запускает любые Touch Down действия, возможно, несколько раз, если вы проведете пальцем по ней.
  3. Кнопка запускает любые действия Primary Action Triggered (например, buttonTapped).
  4. Кнопка запускает любые Touch Up действия.
  5. Кнопка устанавливает для собственного свойства isHighlighted значение false.

Каждый раз, когда isHighlighted изменяется, кнопка обновляет свой стиль до того, как, по ее мнению, она должна выглядеть. Таким образом, через мгновение после buttonTapped кнопка, которую вы нажали, перезаписывает выбранный вами шрифт собственным шрифтом.

Это стоит изучить, чтобы убедиться, что вы понимаете это, создав подкласс UIButton. Не используйте это в рабочей среде. Как только вы начнете переопределять части UIButton, вам нужно переопределить все его.

// This class is to demonstrate the sequence of events when you press a UIButton.
// Do not use in production.
// To make this work properly, you would also have to override all the other properties that effect UIButton.state, and also UIButton.state itself.
class MyOverrideHighlightedButton : UIButton {
    // Define a local property to store our highlighted state.
    var myHighlighted : Bool = false
    
    override var isHighlighted: Bool {
        get {
            // Just return the existing property.
            return myHighlighted
        }
        
        set {
            print("Setting MyOverrideHighlightedButton.isHighlighted from \(myHighlighted) to \(newValue)")
            
            myHighlighted = newValue
            
            // Since the UIButton remains unaware of its highlighted state changing, we need to change its appearance here.
            // Use garish colors so we can be sure it works during testing.
            if (myHighlighted) {
                titleLabel!.textColor = UIColor.red
            } else {
                titleLabel!.textColor = titleColor(for: .normal)
            }
        }
    }
}

Так откуда же он берет свой старый шрифт? При загрузке представления будут применены настройки UIAppearance, но они будут удалены при нажатии кнопка тоже. iOS 15+, похоже, он использует новую структуру UIButton.Configuration. Таким образом, вы можете поместить это в свой buttonTapped:

// The Configuration struct used here was only defined in iOS 15 and
// will fail in earlier versions.
// See https://developer.apple.com/documentation/uikit/uibutton/configuration
sender.configuration!.titleTextAttributesTransformer = UIConfigurationTextAttributesTransformer { incoming in
    var outgoing = incoming
    // We only want to change the font, but we could change other properties here too.
    outgoing.font = UIFont(name: "Zapfino", size: 20)
    return outgoing
}

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

0
Dondragmer 4 Фев 2022 в 07:09