2016-04-26 1 views

Répondre

2

Il suffit de définir contentMode de la vue de UIViewContentModeRedraw.

Cela invoquera setNeedsDisplay (et donc drawRect) chaque fois que le changement des limites de la vue, et sera donc également invoqué lors de la rotation (à condition que vous avez votre configuration autoresizingMask afin que les limites de la vue change sur la rotation).

+0

Si je place 'contentMode' dans' init: 'cela ne fonctionne pas, devrais-je le mettre dans une autre méthode à la place? –

+0

@SunilRao Votre 'init' est-il appelé (définit un point d'arrêt)? La plupart du temps dans une sous-classe 'UIView' vous devriez remplacer' initWithFrame: 'au lieu de' init' - car l'implémentation 'UIView' de' init' appelle simplement 'initWithFrame: CGRectZero'. Vérifiez également votre 'autoresizingMask' pour vous assurer qu'il modifie les limites de la vue (largeur ou hauteur) lors de la rotation. Et non, vous devriez définir 'contentMode' dans un initialiseur car c'est une chose d'installation constante et ponctuelle. – Hamish

+0

Ya ça a fonctionné parfaitement. –

2

De la référence de classe UIView https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIView_Class/#//apple_ref/occ/instm/UIView/drawRect:

This method is called when a view is first displayed or when an event occurs that invalidates a visible part of the view. You should never call this method directly yourself. To invalidate part of your view, and thus cause that portion to be redrawn, call the setNeedsDisplay or setNeedsDisplayInRect: method instead.

Voilà. Appelez simplement setNeedsDisplay dans la vue appropriée.

+0

Quand j'appelle 'setNeedsDisplay' de' drawRect: 'Je reçois cet avertissement ** _ BSMachError: (os/kern) capacité invalide (20) ** et ** _ BSMachError: (os/kern) nom invalide (15) ** –

+0

Eh bien, comme il est dit que cela provoque 'drawRect:' à appeler, cela provoquerait évidemment une boucle infinie. Je pensais que vous vouliez l'appeler de 'layoutSubviews'? –

+0

Oh! oui, et si ça s'appelle de 'layoutSubviews()' mon mauvais, fautes de frappe! –

0

En fonction viewDidLoad() mis:

NSNotificationCenter.defaultCenter().addObserver(self, selector: "rotated", name: UIDeviceOrientationDidChangeNotification, object: nil) 

puis ajoutez la fonction suivante:

func rotated() 
{ 
    if(UIDeviceOrientationIsLandscape(UIDevice.currentDevice().orientation)) 
    {    
     print("landscape") 
     // Your drawRect function here 
    } 

    if(UIDeviceOrientationIsPortrait(UIDevice.currentDevice().orientation)) 
    { 
     print("Portrait") 
     // Your drawRect function here 

    } 

}