2009-09-17 12 views
23

Mam UIView, który zawiera wiersz podklas z UIView. Podklasa została nadpisana drawRect: i ustawiono contentMode = UIViewContentModeRedraw.Jak wymusić przerysowanie (drawRect) SubView po zmianie wymiarów?

Gdy użytkownik zgniata i rozciąga pojemnik nadrzędny, squash child views rozciąga się. Wraz ze zmianą kształtu chciałbym kilkakrotnie wywołać drawRect, aby zmienić zawartość child views. Do tej pory nie udało mi się. Jaki jest prawidłowy sposób to zrobić?

Cheers,

Doug

Odpowiedz

57

w kakao, rzadko (jeśli w ogóle) nazywamy drawRect - wystarczy zaznaczyć obszar lub widok jako wymagające aktualizacji, a zostanie ona zaplanowana na odświeżanie. Pozwala to na odrysowywanie wielokrotnych unieważnień jednocześnie.

Dla Cocoa Touch, chcesz albo [view setNeedsDisplay] lub setNeedsDisplayinRect:(CGRect)

+1

Próbowałem dokładnie to zrobić. Bez efektu. Nuthin. W podklasie I overrode setTransform: Metoda wygląda następująco: - (void) setTransform (CGAffineTransform) nowaWartość { [bardzo setTransform: nowaWartość]; [self setNeedsDisplay]; } – dugla

+0

Wygląda na to, że bitowanie w kodzie ma teraz ustawioną właściwość setNeedsDisplay. – dugla

3

Musisz wywołać [view setNeedsLayout], powinno to spowodować subviews otrzymać drawRect: zadzwoń, jeśli zmiany układu. Nie testowałem tego jednak.

+0

Niektórzy mówią 'setNeedsDisplay', niektórzy mówią' setNeedsLayout' .. Jakie są różne implikacje tutaj? – Sti

0

To rozwiązanie jest trochę szalone, ale ma sens logiczny i ma świetny efekt wizualny. Pracuję z NSLayoutManager i kilkoma NSTextContainer s, układając tekst w dwóch kolumnach. Ponieważ używam wielu kontenerów tekstowych (i nie jestem pewien, czy chcę mieć numer UITextView), nadpisuję metodę draw(rect: CGRect) pod numerem MyDrawingView: UIView.

Problem polega na tym, że użycie self.contentMode = .redraw nadal powoduje niewielkie rozciąganie przy obrocie - na tyle duże, że może być wyłącznikiem.

Zauważyłem, że ustawienie contentMode = .left lub nawet contentMode = .scaleAspectFit było bliskie temu, co chciałem, pod względem perfekcyjnego pod względem pikseli obrotu. Ale oczywiście nie dostałem wezwania do remisu, którego potrzebowałem.

Przesunięcie layoutSubviews(), przełączenie contentMode na .scaleAspectFit, o nazwie super.layoutSubviews(), a następnie ponownie go włączyłem. : P

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

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

Jest ... idealny.

Powiązane problemy