ios 7 view with transparent content overlaps previous view

前端 未结 9 1605
独厮守ぢ
独厮守ぢ 2020-12-23 20:25

Recently I updated my xcode project to work with iOS 7, but i faced a big problem. Because my whole application has only one background image (UIImageView added to key windo

相关标签:
9条回答
  • 2020-12-23 21:11

    I fixed it by doing this when initialising the view:

    self.view.clipsToBounds = YES;
    
    0 讨论(0)
  • 2020-12-23 21:18

    Props to @snoersnoer.


    Here is the code in Swift 3.

    func navigationController(_ navigationController: UINavigationController, animationControllerFor operation: UINavigationControllerOperation, from fromVC: UIViewController, to toVC: UIViewController) -> UIViewControllerAnimatedTransitioning? {
    
        let pushTransition = SUPushTransition()
        pushTransition.navigationControllerOperation = operation
        return pushTransition
    }
    

    func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
    
        // the containerView is the superview during the animation process.
        let container = transitionContext.containerView
    
        let fromVC = transitionContext.viewController(forKey: UITransitionContextViewControllerKey.from)
        let toVC = transitionContext.viewController(forKey:UITransitionContextViewControllerKey.to);
    
        if let from = fromVC,
            let fromView = from.view,
            let to = toVC,
            let toView = to.view {
    
            let containerWidth = container.frame.size.width
    
            // Set the needed frames to animate.
    
            var toInitialFrame = container.frame
            var fromDestinationFrame = fromView.frame
    
            if self.navigationControllerOperation == .push {
                toInitialFrame.origin.x = containerWidth;
                toView.frame = toInitialFrame;
                fromDestinationFrame.origin.x = -containerWidth;
            }
            else if self.navigationControllerOperation == .pop {
                toInitialFrame.origin.x = -containerWidth;
                toView.frame = toInitialFrame;
                fromDestinationFrame.origin.x = containerWidth;
            }
    
            // Create a screenshot of the toView.
            if let move = toView.snapshotView(afterScreenUpdates: true) {
    
                move.frame = toView.frame
                container.addSubview(move)
    
                UIView.animate(withDuration: Constants.MainPage.navControllerDuration, delay: 0.0, usingSpringWithDamping: 1000, initialSpringVelocity: 1, options: .curveEaseInOut, animations: {
                    move.frame = container.frame;
                    fromView.frame = fromDestinationFrame;
                }, completion: { (finished) in
    
                    if finished {
    
                        if !container.subviews.contains(toView) {
                            container.addSubview(toView)
                        }
    
                        toView.frame = container.frame
    
                        fromView.removeFromSuperview()
                        move.removeFromSuperview()
    
                        transitionContext.completeTransition(true)
                    }
    
                })
    
            }
    
        }
    
    }
    

    Cheers.

    0 讨论(0)
  • 2020-12-23 21:20

    I solved the problem by implementing the new UINavigationControllerDelegate Method animationControllerForOperation.

    For example:

    - (id<UIViewControllerAnimatedTransitioning>)navigationController:(UINavigationController     *)navigationController
                                  animationControllerForOperation:(UINavigationControllerOperation)operation
                                               fromViewController:(UIViewController *)fromVC
                                                 toViewController:(UIViewController *)toVC
    {
    
    PushTransition* transition = [PushTransition new];
    [transition setNavigationControllerOperation: operation];
    
    return transition;
    }
    

    PushTransition is a class that implements the UIViewControllerAnimatedTransitioning protocol and the two methods transitionDuration and animateTransition from that protocol. Additionally, i have added a property to pass the operation (tells me if it is a push or pop transition).

    Just put the animation code for moving the views into the animateTransition as follows:

    // the containerView is the superview during the animation process.
    UIView *container = transitionContext.containerView;
    
    UIViewController *fromVC = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
    UIViewController *toVC = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
    
    UIView *fromView = fromVC.view;
    UIView *toView = toVC.view;
    CGFloat containerWidth = container.frame.size.width;
    
    // Set the needed frames to animate.
    
    CGRect toInitialFrame = [container frame];
    CGRect fromDestinationFrame = fromView.frame;
    
    if ([self navigationControllerOperation] == UINavigationControllerOperationPush)
    {
        toInitialFrame.origin.x = containerWidth;
        toView.frame = toInitialFrame;
        fromDestinationFrame.origin.x = -containerWidth;
    }
    else if ([self navigationControllerOperation] == UINavigationControllerOperationPop)
    {
        toInitialFrame.origin.x = -containerWidth;
        toView.frame = toInitialFrame;
        fromDestinationFrame.origin.x = containerWidth;
    }
    
    // Create a screenshot of the toView.
    UIView *move = [toView snapshotViewAfterScreenUpdates:YES];
    move.frame = toView.frame;
    [container addSubview:move];
    
    [UIView animateWithDuration:TRANSITION_DURATION delay:0
         usingSpringWithDamping:1000 initialSpringVelocity:1
                        options:0 animations:^{
                            move.frame = container.frame;
                            fromView.frame = fromDestinationFrame;
                        }
                     completion:^(BOOL finished) {
                         if (![[container subviews] containsObject:toView])
                         {
                             [container addSubview:toView];
                         }
    
                         toView.frame = container.frame;
                         [fromView removeFromSuperview];
                         [move removeFromSuperview];
                         [transitionContext completeTransition: YES];
                     }];
    

    described it and you can you are done. Additionally you can make any push or pop animation you like.

    0 讨论(0)
提交回复
热议问题