Bir Facebook POP animasyonlu geçişi gerçekleştirmek için mevcutViewController ve özel modalPresentationStyle kullanarak bir UIViewController sunumu yapıyorum.Autolayout ile Merkezleme Modal Görünümü
Modelin görünümü tamamen dinamiktir, kodda Autolayout kısıtlamaları kullanılarak tanımlanmıştır. Modalın arkasına xib/storyboard yoktur.
Ekranda merkezlemek için model görünümünü alamıyorum! Autolayout yeterli değildir, çünkü kısıtlamalar eklemek için süper bir görünüm yoktur!
My başvuru kodu (bir FB POP kod örneği alınmıştır) aşağıdaki gibidir:
- (void)animateTransition:(id <UIViewControllerContextTransitioning>)transitionContext
{
UIView *fromView = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey].view;
fromView.tintAdjustmentMode = UIViewTintAdjustmentModeDimmed;
fromView.userInteractionEnabled = NO;
UIView *dimmingView = [[UIView alloc] initWithFrame:fromView.bounds];
dimmingView.backgroundColor = [UIColor colorWithRed:(24/255.0) green:(42/255.0) blue:(15/255.0) alpha:1.0];
dimmingView.layer.opacity = 0.0;
UIView *toView = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey].view;
toView.frame = CGRectMake(0,
0,
CGRectGetWidth(transitionContext.containerView.bounds) - 104.f,
CGRectGetHeight(transitionContext.containerView.bounds) - 320.f);
toView.center = CGPointMake(transitionContext.containerView.center.x, -transitionContext.containerView.center.y);
[transitionContext.containerView addSubview:dimmingView];
[transitionContext.containerView addSubview:toView];
POPSpringAnimation *positionAnimation = [POPSpringAnimation animationWithPropertyNamed:kPOPLayerPositionY];
positionAnimation.toValue = @(transitionContext.containerView.center.y);
positionAnimation.springBounciness = 10;
[positionAnimation setCompletionBlock:^(POPAnimation *anim, BOOL finished) {
[transitionContext completeTransition:YES];
}];
POPSpringAnimation *scaleAnimation = [POPSpringAnimation animationWithPropertyNamed:kPOPLayerScaleXY];
scaleAnimation.springBounciness = 20;
scaleAnimation.fromValue = [NSValue valueWithCGPoint:CGPointMake(1.2, 1.4)];
POPBasicAnimation *opacityAnimation = [POPBasicAnimation animationWithPropertyNamed:kPOPLayerOpacity];
opacityAnimation.toValue = @(0.2);
[toView.layer pop_addAnimation:positionAnimation forKey:@"positionAnimation"];
[toView.layer pop_addAnimation:scaleAnimation forKey:@"scaleAnimation"];
[dimmingView.layer pop_addAnimation:opacityAnimation forKey:@"opacityAnimation"];
}
Bu güzel çalışıyor, ancak ben dinamik olarak gerçek görünüm boyutunu gerek (bazen kalıcı olacak dört satırlık metin ve iki düğme, vb. Bunu başarmak için VC alt sınıfında translatesAutoresizingMaskIntoConstraints = NO ayarlamam gerekiyor. Bu, sunum animatöründe yaptığım çerçeve ortalamasını açıkça reddediyor.
Sonuç, ekranın sol kenarına yapışmış bir modeldir; merakla, kendisini dikey olarak değil, yatay olarak ortalar. Görsel olarak, bu (siyah kareler af Ben yasal amaçlarla bunu yapmak zorunda) şuna benzer:
bariz çözüm görünümü merkezleri bir görünüm kısıtlama eklemek olacaktır. Sorun yok, değil mi?
Ama bunu nereye eklerim? view.superview sıfırdır; süper görüş yok Özel bir 'superview' özelliği oluşturmayı ve onu ayarlamayı denedim, ancak autolayout, görünüm hiyerarşisinin (sunum vc'sinin) dışında bir görünümü nasıl kullanacağını bilmez. Bu benim bakış hiyerarşi açıklamalı, neye benzediği: Görünüşe göre doğrudan UITransitionView erişmek gerekmiyor
. UIWindow'daki kısıtlamaların etkisi yoktur.
Herhangi bir tavsiyesi olan var mı? Bu tür şeylerle nasıl başa çıkıyorsunuz?
Aslında çözüm için yok ama ben size bu durumda ne yapacağımı söyleyeyim: ** Herhangi bir Autolayout ** 'ı yorumlayın, ** CGRectMake ile pozisyonu ayarlayın (**. Bir şey daha: Bu soruyu nasıl yapılandırdığınızı anlatmak zor. iyi şanslar – carlodurso
Bu yakalama-22. Otomatik düzen kullanmam gerekiyor, çünkü görünüm tamamen dinamik olmalı. – cdstamper