2016-03-14 23 views
10

Ho il seguente vista del regolatore nel mio storyboard:Modifica vincolo a livello di codice Swift

storyboard_mainVC

avrà sempre 6 viste di immagini che sono, per impostazione predefinita, pari a larghezze e altezze. Ogni vista dell'immagine è vincolata alla superview con: "altezze uguali" e un moltiplicatore di 1/2.

Tuttavia, prima di caricare immagini all'interno, leggo una proprietà che mi dà l'altezza desiderata per un'immagine (la larghezza non verrà mai modificata).

Quindi la mia interfaccia (in fase di esecuzione) può apparire come segue:

second_interface

Penso di aver bisogno di modificare il moltiplicatore costante ma è sola lettura.

Ho visto post che possiamo aggiornare la proprietà costante del del vincolo ma è in punti, ho bisogno che funzioni su ogni dispositivo.

Ora cosa consiglieresti? Devo rimuovere il vincolo e aggiungerne uno nuovo? Se non lo rimuovo e provo ad applicare un nuovo vincolo di altezza, verrà rimosso automaticamente per me?

Devo usare pod come lo snapkit per fare il lavoro?

Grazie per il vostro aiuto.

EDIT

Ecco il codice che ho provato, ma non ci sono riuscita:

 for (index, (drawing, ratio)) in drawingElements.enumerate() { 
      drawingViews[index].image = UIImage(named: drawing) 
      // update height constraint if ratio is different than defaut ratio of 1/2 
      if ratio != 0.5 { 
       heightConstraints[index].active = false 
       let newHeightConstraint = NSLayoutConstraint(item: drawingViews[index], attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.Height, multiplier: ratio, constant: 0) 
       drawingViews[index].addConstraint(newHeightConstraint) 
       self.view.layoutIfNeeded() 
      } 
     } 

sto facendo di sbagliato? Non sono sicuro del nuovo limite di altezza sebbene

+1

Creare un nuovo vincolo con la costante richiesta, disattivare o rimuovere la vecchia e aggiungere la nuova –

+0

È disattivazione/eliminazione di un vincolo diverso in termini di tempo di elaborazione? – H4Hugo

+0

Probabilmente entrambi sono irrilevanti rispetto al rendering delle immagini, ma non lo so. Vorrei tenerlo in giro se avessi bisogno di riattivarlo più tardi ... –

risposta

5

Quindi questo è il modo in cui ho raggiunto questo:

  • crea un vincolo di programmazione (altezza nel mio caso):

    // Drawing height property 
    var drawingHeightConstraint: NSLayoutConstraint? 
    
  • Disattivare vecchio vincolo e impostare quello nuovo se necessario

Nota: heightContraints è un array di NSLayoutConstraint che contiene i miei punti

 for (index, (drawing, ratio)) in drawingElements.enumerate() { 
     drawingViews[index].image = UIImage(named: drawing) 

     // update height constraint if ratio is different than defaut ratio of 1/2 
     if ratio != 0.5 { 
      heightConstraints[index].active = false 
      drawingHeightConstraint = NSLayoutConstraint(item: drawingViews[index], attribute: .Height, relatedBy: .Equal, toItem: drawingView, attribute: .Height, multiplier: CGFloat(ratio), constant: 0) 
      drawingHeightConstraint!.active = true 
     } 

    } 
  • chiamata layoutIfNeeded() subito dopo (nota: non so quando a chiamarlo)
4

Le costanti di vincoli sono correlate al contenuto dell'elemento vincolato. Questo è il motivo per cui ricevi questo tipo di schermo. Il modo più semplice: creare immagini con colori chiari e impostarle di default. Dopo aver scaricato completato appena impostato nuova immagine per il vostro IMAGEVIEW

Oppure si può impostare IBOutlet per il vincolo di altezza - e cambiare il rapporto qualità diverse situazioni cioè

if(download.completed) 
ibHeightOutlet.constant = imageView.frame.size.height; 
else 
ibHeightOutlet.constant = initialImageViewHeght.frame.size.height; 
+0

Penso che tu abbia frainteso quello che sto cercando di ottenere. La seconda immagine che ho messo descrive ciò che sto cercando di ottenere, non un errore o una manipolazione errata. – H4Hugo

+0

@ H4Hugo Sì, scusa, ma la logica è la stessa: usa le prese per i limiti di altezza e imposta i loro valori quando devono essere modificati – Karaban

+0

Il problema è che non posso usare direttamente l'altezza dell'immagine. Sarebbe l'altezza di imageView moltiplicata per il rapporto – H4Hugo

0

Non è possibile modificare il moltiplicatore per motivi sconosciuti a me (una specie di dettaglio di implementazione di Apple probabilmente). Puoi rimuovere un vincolo e crearne uno nuovo, comunque. Devi rimuovere il vecchio vincolo perché non verrà rimosso automaticamente e avrai un conflitto. In alternativa, è possibile creare il primo vincolo (con il moltiplicatore 0.5) con priorità più bassa. In questo modo puoi mantenerlo (l'autolayout lo ignorerebbe), ma non penso che sia un modo per andare, dal momento che dovresti aver bisogno di questo vincolo non necessario? Basta cancellarlo. Come per i motori e le librerie di layout di terze parti - sfortunatamente, non posso darti alcun consiglio qui.

+1

Il motivo tecnico per cui non puoi cambia il moltiplicatore: poiché i vincoli sono tradotti in un complicato sistema di equazioni lineari, e mentre le costanti possono essere modificate molto facilmente e rapidamente, la modifica di qualsiasi moltiplicatore richiede che tutto venga ricalcolato completamente. – gnasher729

+0

@ gnasher729, grazie per il chiarimento) – FreeNickname

+0

Sembra che questa traduzione avvenga al volo, sia quando la vista è resa, sia quando si creano nuovi vincoli a livello di codice e li si aggiunge. Sarebbe bello avere uno stato futuro in cui potremmo modificare i vincoli nel codice, quindi chiamare un qualche tipo di metodo [layout] per forzare un ricalcolo. – Crake

Problemi correlati