2015-05-19 19 views
51

L'estensione My Today deve avere un'altezza dinamica in base ai contenuti visualizzati dal widget. Sono riuscito a ottenere questo risultato aggiungendo un vincolo sul mio elemento più in basso: la parte inferiore della guida di layout inferiore è inferiore o uguale al fondo dell'elemento inferiore, con una costante di 0, priorità 999, moltiplicatore 1.Oggi Altezza estensione per iPad molto più grande di quella specificata

funziona esattamente come previsto su iPhone - l'altezza del widget si adatta a tutti i contenuti più il margine inferiore predefinito viene applicato prima che venga mostrato il prossimo widget.

Ma su iPad sembra essere l'altezza del mio widget uguale all'altezza massima Notification Center consentirà un widget - c'è molto spazio sotto il mio widget, è quasi a schermo intero.

Come posso rimuovere quello spazio extra?

So esattamente qual è il problema ma non so come risolverlo - vedere la sezione "Il problema". In primo luogo lasciatemi spiegare il setup:

Il Setup:
ho impostato vista di questa estensione in uno storyboard, non si fa nulla di programmazione. La vista è composta da 5 elementi impilati verticalmente e alcuni altri orizzontalmente. Questi sono i vincoli di layout automatico per quella linea verticale dall'alto verso il basso - dove non espressamente priorità 1000, moltiplicatore 1:

UILabel: height = 35, top space to top layout guide with constant of 10 
UIButton: equal height and width to a different button (whose aspect ratio is 1:1, there is no fixed width/height), top space to label 10 
UIButton: equal height and width to same button, top space to above button 8 
UIButton: equal height and width to same button, top space to above button 8 
UIButton: equal height and width to same button, top space to above button 8, bottom space to bottom layout guide <= 0 with priority 999 

Il comportamento necessario:

  • Ho bisogno di una griglia di Pulsanti 4x4 situati sotto una singola etichetta a larghezza intera
  • Ogni pulsante deve avere esattamente la stessa larghezza e altezza - tutti i quadrati perfetti
  • Nessuno spazio aggiuntivo sotto l'ultimo r usso di pulsanti

Il Risultato:
enter image description here

il risultato atteso:
enter image description here

Il problema:
I vincoli rapporto di aspetto su tutti i pulsanti finire per imporre indirettamente un aspetto "implicito" vincolo tio sull'altezza della vista widget quando viene inviato systemLayoutSizeFittingSize:withHorizontalFittingPriority:verticalFittingPriority:, dove viene passata la larghezza necessaria (724) per il layout alla priorità richiesta e un'altezza di 0 (per comprimere la vista) alla priorità del livello di raccordo. Ciò si traduce in una vista widget alta su iPad dove la vista è più ampia per cominciare. Ma non esiste un vincolo di proporzioni effettivo che può essere rimosso. Essenzialmente, poiché ho applicato vincoli di proporzioni a tutto il pulsante, l'altezza dell'estensione di oggi dipende dalla sua larghezza (considerando tutti i vincoli, proporzioni e altro). Così l'altezza dell'estensione è sgraziata in un'ampia area, manifestandosi su un dispositivo ampio come l'iPad. I vincoli sui pulsanti devono essere riconsiderati o in qualche modo regolati.

il progetto di esempio:
Un sample project that demonstrates the issue è disponibile da CloudApp in modo da poter scaricare e giocare con esso.

che cosa ho provato:
Ho provato a rimuovere gli inserti dei margini di default sovrascrivendo widgetMarginInsetsForProposedMarginInsets e tornando 0 per il fondo. Ciò ha rimosso il padding predefinito, quindi ha ridotto l'altezza un po ', ma c'è ancora molto spazio extra al di sotto.

Il UILabel aveva un vincolo su di esso: l'etichetta di porta pari a leader di superview - 0 costante, la priorità 1000, moltiplicatore 1. Se ho semplicemente cambiare che a guidare il margine del superview, il fondo aggiuntivo spaziatura magicamente scompare. Mi chiedevo se fosse perché gli elementi stavano diventando troppo grandi, quindi aumentare la quantità di spaziatura a sinistra ne ridurrebbe le dimensioni, ma ho cercato di mantenerlo al comando normale e aumentare la costante e questo non risolveva il problema. Ma questo risolve solo il problema dell'iPad in verticale. E nemmeno lo risolve completamente, ogni volta che si preme il Centro di notifica, esso inizia alla grande altezza e poi si riduce alla dimensione corretta. Nel paesaggio non si riduce mai alla giusta misura.

Solutions Tentativo:

  • @Lefteris proposto hardcoding la dimensione, che non funziona in questo caso come l'altezza è dinamico e il widget è disponibile per molte schermo dimensioni/orientamenti.
  • @Yuyutsu ha tentato di risolverlo, ma sfortunatamente non soddisfa i requisiti e presenta vincoli in conflitto e un layout modificato.
+0

ho avuto alcuni problemi di strano l'altezza dell'estensione di oggi pochi giorni fa, leggi questa nota: http://stackoverflow.com/questions/26087907/height-of-ios8-today-extension-using-only-auto-layout-gives-broken-constraints – liushuaikobe

+0

prova rendere la vista di estensione come una sottoview di un altro controller di visualizzazione personalizzato e quindi applicare viewDidLoad() al suo interno, dovrebbe funzionare –

risposta

-1

ho dovuto hardcode il valore del widget sul metodo viewDidLoad delegato al fine di risolvere questo problema:

import UIKit 
import NotificationCenter 

class TodayViewController: UIViewController, NCWidgetProviding { 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     self.preferredContentSize = CGSize(width: 0, height: 320) 
    } 

} 
+1

Non può essere codificato, deve essere dinamico in altezza in base al contenuto. Deve funzionare per tutti gli iPhone e iPad e qualsiasi altra futura dimensione dello schermo. – Joey

+0

L'hard coding dell'altezza quasi certamente fallirà in alcune situazioni, ad esempio in modalità orizzontale. Prova questo: avvia Safari mobile, passa alla modalità orizzontale, quindi apri il centro notifiche. –

0

stavo affrontando lo stesso problema. Hai aggiunto il vincolo di riempimento inferiore come mostrato nell'immagine? enter image description here

che ha lavorato per me.Hope aiuta

2

enter image description here

Ecco come ha ottenuto questo:

  1. Si dovrebbe prendere in considerazione il vostro vincolo.

  2. I suoi inserti di margine widget predefiniti non sono configurati correttamente sulla strada avete voluto, quindi l'impostazione da soli è l'unica soluzione qui chiamando 'widgetMarginInsetsForProposedMarginInsets:'

// Aggiornamento widget intarsi laterali

func widgetMarginInsetsForProposedMarginInsets(defaultMarginInsets: UIEdgeInsets) -> UIEdgeInsets { 

    println(NSStringFromUIEdgeInsets(defaultMarginInsets)) 
    return UIEdgeInsetsMake(20, 20, 10, 20) 
} 

Modificato collegamento file di esempio: Modified file

+0

I pulsanti devono essere quadrati perfetti – Joey