UIView.animateWithDuration Pas de l'Animation de Swift (encore une fois)
Remarque: j'ai déjà vérifié la pile suivante problèmes de débordement:
Vingt sept million neuf cent sept mille cinq cent soixante dix, Trente deux million deux cent vingt neuf mille deux cent cinquante deux, Vingt six million cents dix huit mille cents quarante et un, Trente et une million six cent quatre mille trois cent
Tout ce que je suis en train de faire est fondu animer dans une vue (en alpha) lorsqu'il est appelé par une IBAction attaché à un bouton. Puis en sens inverse lorsqu'un bouton sur le point de vue est frappé.
Ma rides peut être que je suis à l'aide d'un secondaire de vue sur la ViewDock dans la Vue storyboard. La vue est ajouté à la sous-vue au moment de la viewDidLoad où l'image/limites sont fixées de la même façon que le superview (pour un plein escale)
La raison de ce qui est fait comme une superposition, étant donné qu'il s'agit d'un tutoriel indicateur.
Le résultat (comme beaucoup d'autres qui ont listé ce problème), la vue (et les contrôles contenus), il suffit de s'affiche instantanément et disparaît instantanément. Pas fondu.
J'ai essayé animationWithDuration avec retard, avec et sans l'achèvement, à la transition, et même commencé avec le vieux UIView.beginAnimations.
Rien ne fonctionne. Suggestions chaleureusement accueillis.
Le code est à peu près aussi simple que je peux le faire:
Edit: Élargi le code pour tout ce qui est pertinent
Edit2: TL;DR Tout fonctionne à l'exception de UIViewAnimateWithDuration qui semble ignorer le bloc et la durée et il suffit d'exécuter le code en ligne immédiate de l'INTERFACE utilisateur de changer. La résolution de cette devient le bounty
@IBOutlet var infoDetailView: UIView! //Connected to the view in the SceneDock
override func viewDidLoad() {
super.viewDidLoad()
//Cut other vDL code that isn't relevant
setupInfoView()
}
func setupInfoView() {
infoDetailView.alpha = 0.0
view.addSubview(infoDetailView)
updateInfoViewRect(infoDetailView.superview!.bounds.size)
}
func updateInfoViewRect(size:CGSize) {
let viewRect = CGRect(origin: CGPointZero, size: size)
infoDetailView.frame = viewRect
infoDetailView.bounds = viewRect
infoDetailView.layoutIfNeeded()
infoDetailView.setNeedsDisplay()
}
override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator)
updateInfoViewRect(size)
}
func hideInfoView() {
AFLog.enter(thisClass)
UIView.animateWithDuration(
2.0,
animations:
{
self.infoDetailView.alpha = 0.0
},
completion:
{ (finished) in
return true
}
)
AFLog.exit(thisClass)
}
func showInfoView() {
AFLog.enter(thisClass)
UIView.animateWithDuration(
2.0,
animations:
{
self.infoDetailView.alpha = 0.75
},
completion:
{ (finished) in
return true
}
)
AFLog.exit(thisClass)
}
//MARK: - IBActions
@IBAction func openInfoView(sender: UIButton) {
showInfoView()
}
@IBAction func closeInfoView(sender: UIButton) {
hideInfoView()
}
Veuillez noter, j'ai commencé par celui-ci:
func showInfoView() {
UIView.animateWithDuration(2.0, animations: { () -> Void in
self.infoDetailView.alpha = 0.75
})
}
func hideInfoView() {
UIView.animateWithDuration(2.0, animations: { () -> Void in
self.infoDetailView.alpha = 0.00
})
}
FWIW, vous pouvez passer " nil " que l'achèvement de blocs d'ici. Même si vous avez des blocs, ils ont certainement ne devrait pas être de retour quoi que ce soit. Je suis surpris de la Swift compilateur n'a pas de drapeau que comme une erreur.
J'ai ajouté tous les code ci-dessus. J'avais essayé avec et sans le retour comme indiqué dans l'original pré-tweaked à défaut de code.
Enfin. La vue s'affiche et configure les paramètres de l'amende juste. Tout est là où il est censé être. Tous les éléments d'INTERFACE de travail, et la rotation ajuste le contenu par des contraintes. Le SEUL problème, c'est que l'alpha changement ne se produit pas comme un effet de fondu. Tout simplement un instant apparaître.
Votre code est correct. J'ai vu inattendue de l'INTERFACE utilisateur comportement comme ça quand il y a des problèmes de threading ailleurs dans l'application. Essayez de placer un point d'arrêt sur UIView.animateWithDuration() et l'auto.infoDetailView.alpha =... sont ceux qui Sont à la fois d'être exécutées sur le Thread 1 (com.apple.principal-thread)?
OriginalL'auteur Lord Andrei | 2016-04-05
Vous devez vous connecter pour publier un commentaire.
Si vous infoDetailView est en auto contraintes de mise en forme vous avez besoin d'appeler layoutIfNeeded sur le parent vue à l'intérieur de animateWithDuration:
Théoriquement, cela ne devrait pas être nécessaire si vous venez de changer la .valeur alpha, mais peut-être ce pourrait être le problème dans ce cas.
C'est une critique astuce que vous devez appeler la mise en page sur le superview, et non pas sur la vue en question!
cela a fonctionné pour moi (j'ai changé les contraintes les valeurs des constantes)
Génial, merci!
OriginalL'auteur Darko
Il y a plusieurs choses étranges que je peux voir,
d'abord, supprimer:
Habituellement, vous n'avez pas besoin d'appeler ces méthodes manuellement, sauf si vous savez exactement ce que vous faites.
Aussi, lorsque vous modifiez la taille:
Vous n'avez jamais besoin de définir à la fois
bounds
etframe
. Juste mettreframe
.Aussi, vous devriez assurez-vous que la vue ne fait pas ignorer l'image en définissant:
Au lieu de réinitialisation de l'image, il suffit de définir autoresize masque:
:
Je pense que c'est effectivement de l'aide parce immédiate des animations sont souvent liés à des problèmes de taille.
Si le problème persiste, vous devez vérifier si le
infoDetailView
dans votre animation est le même objet que lainfoDetailView
que vous ajoutez le contrôleur.Il n'y a rien de mal avec votre code donc je suis assez sûr que c'est un autre problème caché quelque part d'autre. Il y a trop d'options. Si vous avez pu reproduire le problème dans un exemple de projet et de partager pour nous, alors nous pouvons vous aider.
OriginalL'auteur Sulthan
Si l'animation ne semble pas exécuter puis d'examiner l'état de chacun de vos points de vue, avant d'entrer dans le bloc d'animation. Par exemple, si l'alpha est déjà fixé à 0,4 alors l'animation qui permet d'ajuster votre point de vue alpha, sera presque instantanément, sans effet apparent.
Envisager l'utilisation d'une animation avec des images clés à la place. C'est ce qu'un tremblement de l'animation en objective-c ressemble.
Voici un post qui vous montre comment régler alpha avec des images clés https://stackoverflow.com/a/18658081/1951992
OriginalL'auteur
Assurez-vous que
infoDetailView
'sopaque
est faux.https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIView_Class/#//apple_ref/occ/instp/UIView/opaque
OriginalL'auteur Jeff
Utiliser ce code:
OriginalL'auteur shikha kochar
Essayer de code ci-Dessous. Il suffit de jouer avec de l'alpha et de la durée de temps pour le perfectionner.
Cacher func
Montrer func
OriginalL'auteur Arun Gupta
J'ai répliqué votre code et il fonctionne bien, tout est ok.
Probablement, vous devez contrôler les contraintes, IBOutlet et IBActions connexions. Essayez d'isoler ce code dans un nouveau projet, si c'est nécessaire.
Mise à jour: mon code
et mon storyboard et le dossier du projet photo:
Chaque objet (affichage et boutons) sont avec les paramètres par défaut.
J'ai commenté tous les AFLog lignes (probablement qu'il est plus seulement "verbose mode" pour vous aider) , le reste de votre code est ok et il ne que pensez-vous aspecté, si vous appuyez sur le bouton ouvrir la vue fondu, et lorsque vous appuyez sur le bouton fermer la vue de fondu de sortie.
PS Pas pertinent, mais je suis en utilisant xCode 7.3 , une nouvelle swift du projet 2.2.
Le point de vue sur fond vert, est "infoDetailView", un point de vue supplémentaire , dans mon exemple, le centre de nettoyer viewController, et deux boutons de...faire toutes les connexions (iboutlet et ibactions) , de définir la mise en page automatique et le travail.
Je l'ai mise à jour de ma réponse avec le code source et le storyboard, vous pouvez lancer un nouveau projet et de l'essayer.
OriginalL'auteur Alessandro Ornano
Avez-vous essayé de changer votre
showInfoView()
à quelque chose de plus commetoggleInfoView
?Il est dit que si votre point de vue de l'alpha est égal à 0, puis le modifier à 1. Autre chose, faire 0.
Si vous avez besoin que cela se produise dans une animation, essayez
infoDetailView.alpha = 0.0
où vous l'avez, venant de laviewDidLoad
.OriginalL'auteur Rudi Wever
Pour UILabel composant essayer de modifications de la couche d'arrière-plan de couleur à la place.
Essayez ceci (Testé sur Swift 4):
OriginalL'auteur Wanpaya