Domanda

Ho un UIView che contiene una riga di sottoclassi di UIView . La sottoclasse ha sostituito drawRect : e ha impostato contentMode = UIViewContentModeRedraw .

Mentre l'utente schiaccia e allunga il contenitore padre, viste figlio si schiaccia e si allunga. Quando si verifica il cambio di forma, vorrei che drawRect venisse ripetutamente chiamato per modificare il contenuto di viste figlio . Finora non ho avuto successo. Qual è il modo corretto per farlo?

Saluti,

Doug

È stato utile?

Soluzione

In Cocoa, raramente (se mai) chiami drawRect: contrassegni semplicemente la regione o visualizzi come aggiornamento che sarà pianificato per il ridisegno. Ciò consente di ridimensionare insieme ridisegni per più invalidazioni.

Per Cocoa Touch, vuoi [visualizza setNeedsDisplay] o setNeedsDisplayinRect: (CGRect)

Altri suggerimenti

Devi chiamare [view setNeedsLayout], questo dovrebbe far sì che le viste secondarie ricevano un drawRect: chiama se il layout cambia. Non l'ho provato, tuttavia.

Questa soluzione è un po 'folle, ma ha un senso logico e ha un ottimo risultato visivo. Sto lavorando con un NSLayoutManager e un paio di NSTextContainer , disponendo il testo in due colonne. Poiché sto usando più contenitori di testo (e non sono sicuro di volere più UITextView ), sto sovrascrivendo il metodo draw (rect: CGRect) di MyDrawingView: UIView .

Il problema è che l'uso di self.contentMode = .redraw comporta comunque un lieve allungamento della rotazione - abbastanza significativo da essere un affare.

Ho notato che l'impostazione contentMode = .left , o anche contentMode = .scaleAspectFit era vicino a quello che volevo, in termini di rotazione perfetta dei pixel. Ma ovviamente, non stavo ricevendo il call di cui avevo bisogno.

Quindi - ho scavalcato layoutSubviews () , ho cambiato contentMode in .scaleAspectFit , chiamato super.layoutSubviews () , quindi ripristinato. : P

override func layoutSubviews() {
    self.contentMode = .scaleAspectFit

    super.layoutSubviews()
    self.contentMode = .redraw
}

È ... perfetto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top