ios - tipo - fuentes para iphone
¿Cómo detectar cambios de tamaño de fuente dinámicos desde la configuración de iOS? (2)
Dentro de la configuración-> general-> tamaño del texto, después de cambiar el tamaño del texto, tendría que salir de mi propia aplicación para aplicar los tamaños
[UIFont preferredFontForTextStyle:..]
¿Hay algún delegado o notificación para notificar a mi aplicación que vuelva a aplicar los nuevos tamaños?
Actualización: Intenté lo siguiente pero, curiosamente, el tamaño de la fuente se aplicará después de I BG y lanzar la aplicación DOS VECES.
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(fromBg:) name:UIApplicationDidBecomeActiveNotification object:nil];
}
-(void) fromBg:(NSNotification *)noti{
self.headline1.font = [UIFont preferredFontForTextStyle:UIFontTextStyleHeadline];
self.subHeadline.font = [UIFont preferredFontForTextStyle:UIFontTextStyleSubheadline];
self.body.font = [UIFont preferredFontForTextStyle:UIFontTextStyleBody];
self.footnote.font = [UIFont preferredFontForTextStyle:UIFontTextStyleFootnote];
self.caption1.font = [UIFont preferredFontForTextStyle:UIFontTextStyleCaption1];
self.caption2.font = [UIFont preferredFontForTextStyle:UIFontTextStyleCaption2];
// [self.view layoutIfNeeded];
}
Con Swift 4.2, de acuerdo con sus necesidades, puede elegir una de las tres soluciones siguientes para resolver su problema.
# 1. Usando UIContentSizeCategoryAdjusting
adjustsFontForContentSizeCategory
propiedad
Desde iOS10, UILabel
, UITextField
y UITextView
ajustan al protocolo UIContentSizeCategoryAdjusting
y, por lo tanto, tienen una propiedad de instancia llamada adjustsFontForContentSizeCategory
. adjustsFontForContentSizeCategory
tiene la siguiente declaración:
Un valor booleano que indica si el objeto actualiza automáticamente su fuente cuando cambia la categoría de tamaño de contenido del dispositivo.
var adjustsFontForContentSizeCategory: Bool { get set }
La implementación de UIViewController
continuación muestra cómo detectar y reaccionar ante los cambios dinámicos en el tamaño de fuente en la configuración de iOS con adjustsFontForContentSizeCategory
:
import UIKit
class ViewController: UIViewController {
let label = UILabel()
override func viewDidLoad() {
super.viewDidLoad()
label.text = "Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua."
label.numberOfLines = 0
label.font = .preferredFont(forTextStyle: UIFont.TextStyle.body)
label.adjustsFontForContentSizeCategory = true
view.addSubview(label)
// Auto layout
label.translatesAutoresizingMaskIntoConstraints = false
let horizontalConstraint = label.centerXAnchor.constraint(equalTo: view.centerXAnchor)
let verticalConstraint = label.centerYAnchor.constraint(equalTo: view.centerYAnchor)
let widthConstraint = label.widthAnchor.constraint(equalToConstant: 300)
NSLayoutConstraint.activate([horizontalConstraint, verticalConstraint, widthConstraint])
}
}
# 2. Usando la propiedad de tipo UIApplication
UIContentSizeCategoryDidChange
Desde iOS 7, UIApplication
tiene una propiedad de tipo llamada UIContentSizeCategoryDidChange
. UIContentSizeCategoryDidChange
tiene la siguiente declaración:
Se publica cuando el usuario cambia la configuración de tamaño de contenido preferido.
static let UIContentSizeCategoryDidChange: NSNotification.Name
Esta notificación se envía cuando cambia el valor de la propiedad
preferredContentSizeCategory
. El diccionario de información deuserInfo
de la notificación contiene la claveUIContentSizeCategoryNewValueKey
, que refleja la nueva configuración.
La implementación de UIViewController
continuación muestra cómo detectar y reaccionar a los cambios dinámicos del tamaño de fuente en la configuración de iOS con UIContentSizeCategoryDidChange
:
import UIKit
class ViewController: UIViewController {
let label = UILabel()
override func viewDidLoad() {
super.viewDidLoad()
label.text = "Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua."
label.numberOfLines = 0
label.font = UIFont.preferredFont(forTextStyle: UIFont.TextStyle.body)
view.addSubview(label)
// Register for `UIContentSizeCategory.didChangeNotification`
NotificationCenter.default.addObserver(self, selector: #selector(preferredContentSizeChanged(_:)), name: UIContentSizeCategory.didChangeNotification, object: nil)
// Auto layout
label.translatesAutoresizingMaskIntoConstraints = false
let horizontalConstraint = label.centerXAnchor.constraint(equalTo: view.centerXAnchor)
let verticalConstraint = label.centerYAnchor.constraint(equalTo: view.centerYAnchor)
let widthConstraint = label.widthAnchor.constraint(equalToConstant: 300)
NSLayoutConstraint.activate([horizontalConstraint, verticalConstraint, widthConstraint])
}
@objc func preferredContentSizeChanged(_ notification: Notification) {
label.font = UIFont.preferredFont(forTextStyle: UIFont.TextStyle.body)
/* perform other operations if necessary */
}
}
# 3. Usando la propiedad UITraitCollection
preferredContentSizeCategory
Desde iOS 10, UITraitCollection
tiene una propiedad llamada preferredContentSizeCategory
. preferredContentSizeCategory
tiene la siguiente declaración:
La opción de tamaño de fuente preferida por el usuario.
var preferredContentSizeCategory: UIContentSizeCategory { get }
Con Dynamic Type, los usuarios pueden solicitar que las aplicaciones muestren texto usando fuentes que sean más grandes o más pequeñas que el tamaño de fuente normal definido por el sistema. Por ejemplo, un usuario con una discapacidad visual puede solicitar un tamaño de fuente predeterminado más grande para que sea más fácil leer el texto. Utilice el valor de esta propiedad para solicitar un objeto
UIFont
que coincida con el tamaño solicitado por el usuario.
La implementación de UIViewController
continuación muestra cómo detectar y reaccionar ante cambios de tamaño de fuente dinámicos en la configuración de iOS con preferredContentSizeCategory
:
import UIKit
class ViewController: UIViewController {
let label = UILabel()
override func viewDidLoad() {
super.viewDidLoad()
label.text = "Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua."
label.numberOfLines = 0
label.font = UIFont.preferredFont(forTextStyle: UIFont.TextStyle.body)
view.addSubview(label)
// Auto layout
label.translatesAutoresizingMaskIntoConstraints = false
let horizontalConstraint = label.centerXAnchor.constraint(equalTo: view.centerXAnchor)
let verticalConstraint = label.centerYAnchor.constraint(equalTo: view.centerYAnchor)
let widthConstraint = label.widthAnchor.constraint(equalToConstant: 300)
NSLayoutConstraint.activate([horizontalConstraint, verticalConstraint, widthConstraint])
}
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
super.traitCollectionDidChange(previousTraitCollection)
if previousTraitCollection?.preferredContentSizeCategory != traitCollection.preferredContentSizeCategory {
self.label.font = UIFont.preferredFont(forTextStyle: UIFont.TextStyle.body)
/* perform other operations if necessary */
}
}
}
Fuentes:
Escuchas la UIContentSizeCategoryDidChangeNotification
.
Swift 3.0: NSNotification.Name.UIContentSizeCategoryDidChange