redessiner une coutume uiview lors d'un changement d'orientation du périphérique
- Si je tire mon graphique à l'intérieur d'
- (void)drawRect:(CGRect)rect
est juste assez pour régler [_chartView setContentMode:UIViewContentModeRedraw]
et cette méthode sera appelée lorsque l'appareil changements, il est orienatation et il est possible de calculer f.e. nouveau point central de mon tableau. - Si je crée une vue comme une sous-vue à l'aide de
- (id)initWithFrame:(CGRect)frame
, puis ajoutez-en-vue-contrôleur comme[self.view addSubview:chartView];
. Comment dans ce cas je peux la rotation de la poignée pour redessiner mon graphique?
- lorsque vous dessinez à l'aide de la deuxième façon, vous n'utilisez pas la méthode drawRect, voir f.e github.com/kevinzhow/PNChart/blob/master/PNChart/PNPieChart/...
- + besoins à l'appel de redessiner méthode seulement une première fois lors de l'orientation de l'écran change comme drawRect n'
- J'ai mis à jour la réponse. Dû créer un projet de test avec le diagramme de contrôle pour déterminer le problème. BTW les diagrammes de composants est simple et génial!
Vous devez vous connecter pour publier un commentaire.
Pour faire de votre graphique affiché correctement lors de changements d'orientation de l'appareil, vous devez mettre à jour graphique de mise en page, voici le code que vous devez ajouter à votre vue-contrôleur:
À l'aide de
.Redraw
Par programme en invoquant
myView.contentMode = .Redraw
lors de la création de la vue personnalisée devrait suffire. C'est un simple drapeau dans IB et, en tant que tel, le 0 lignes de code préférée façon. Voir Débordement De Pile Comment déclencher drawRect sur sous-classe UIView.À l'aide de
setNeedsDisplay()
Si vous devez déclencher un nouveau dessin, le faire dans
setNeedsDisplay
, qui à son tour appelledrawRect
.Pas besoin d'écouter les notifications et refactoriser le code.
Swift
Objective-C
Remarque:
layoutSubviews
est unUIView
méthode, pas unUIViewController
méthode.layoutSubviews
est unUIView
méthode, pas unUIViewController
méthode. Vous avez besoin de faire une sous-classe deUITableView
, pasUITableViewController
, ce qui peut être fait dans IB. Vous pouvez lire plus au sujet de layoutSubviews sur stackoverflow.com/a/5330162/218152.Aller ici pour savoir comment recevoir des notifications lorsque l'appareil changements d'orientation. Lorsque l'orientation ne change pas, il suffit d'appeler
[chartView setNeedsDisplay];
de fairedrawRect:
appelée de sorte que vous pouvez mettre à jour votre point de vue. Espérons que cette aide!Le code que vous allez ajouter à votre vue-contrôleur:
Grâce Keenle, pour le dessus de ObjC solution. J'ai été déconner avec la création programmée des contraintes de tous les matin, tuant mon cerveau, ne comprennent pas pourquoi ils ne seraient pas recompiler/réaligner la vue. Je suppose parce que j'avais créé le UIView par programmation à l'aide CGRect...ce fut prioritaires.
Cependant, c'était ma solution swift:
Tellement soulagée! 🙂
Malheureusement certaines réponses suggèrent de remplacer le contrôleur de méthodes, mais j'ai quelques
UITableViewCells
avec une ombre autour de et la rotation de l'appareil s'étire les cellules, mais ne pas redessiner l'ombre. Donc je ne veux pas mettre mon code au sein d'un contrôleur de (re)dessiner une sous-vue.La solution pour moi est d'écouter un
UIDeviceOrientationDidChange
notification dans ma personnaliséUITableViewCell
et ensuite appelersetNeedsDisplay()
comme le suggère.Swift 4.0 exemple de Code dans l'un de mes personnalisé UITableViewCells
BTW:
Logger
est untypealias
àSwiftyBeaver
.Grâce à @Aderis de me pointer dans la bonne direction.
J'ai essayé le "setNeedsDisplay" dans une douzaine de façons et il n'a pas de travail pour le réglage de l'ombre de vue, j'ai été l'animation à une nouvelle position.
J'ai résolu mon problème avec cette même si. Si votre ombre ne semble pas vouloir coopérer/mise à jour, vous pouvez essayer de la seule définition de l'ombre à zéro, puis en fixant de nouveau:
Si vous n'avez même pas une ombre encore et ont besoin de ce code, voici que: