es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Siempre se recibe .systemMedium al solicitar la familia de widgets de entorno.

Estoy intentando obtener la familia de widget correcta en una vista, pero siempre obtengo el valor .systemMedium. Esta es mi vista:

import SwiftUI

struct MyView: View
{
    @Environment(\.widgetFamily) var family

    let entry: MyEntry

    @ViewBuilder
    var body: some View
    {
        switch family
        {
        case .systemSmall:
           Text("systemSmall")
        case .systemMedium:
           Text("systemMedium")
        case .systemLarge:
           Text("systemLarge")
        case .systemExtraLarge:
           Text("systemExtraLarge")
        }
    }
}

¿Alguna idea de por qué está sucediendo esto? Gracias.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Es posible que el widget se esté mostrando en el tamaño .systemMedium debido a que ese es el tamaño predeterminado para los widgets. Si desea especificar un tamaño diferente, puede agregar un parámetro a la entrada de la línea de tiempo del widget que especifique el tamaño deseado del widget. Por ejemplo:

    struct MyEntry: TimelineEntry {
        let date: Date
        let widgetSize: WidgetFamily
    
        // ... otras propiedades y métodos ...
    }
    
    struct MyProvider: TimelineProvider {
        func getSnapshot(in context: Context, completion: @escaping (MyEntry) -> ()) {
            let entry = MyEntry(date: Date(), widgetSize: context.widgetFamily)
            completion(entry)
        }
    
        // ... otros métodos ...
    }
    
    struct MyView: View {
        @Environment(\.widgetFamily) var family
        let entry: MyEntry
    
        var body: some View {
            switch entry.widgetSize {
            case .systemSmall:
                Text("systemSmall")
            case .systemMedium:
                Text("systemMedium")
            case .systemLarge:
                Text("systemLarge")
            case .systemExtraLarge:
                Text("systemExtraLarge")
            }
        }
    }
    

    En este ejemplo, la estructura MyEntry incluye un campo widgetSize que se utiliza para especificar el tamaño del widget. El método MyProvider.getSnapshot establece el campo widgetSize en la familia de widgets actual, por lo que el widget se mostrará en el tamaño predeterminado a menos que se especifique un tamaño diferente al crear la entrada de la línea de tiempo. El método MyView.body hace una conmutación sobre el campo widgetSize en la entrada en lugar de la variable de entorno, por lo que mostrará el tamaño correcto incluso si la variable de entorno no está configurada correctamente.

Comments are closed.