具有透明内容的 ios 7 视图与以前的视图重叠

ios 7 view with transparent content overlaps previous view(具有透明内容的 ios 7 视图与以前的视图重叠)
本文介绍了具有透明内容的 ios 7 视图与以前的视图重叠的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

最近我更新了我的 xcode 项目以使用 iOS 7,但我遇到了一个大问题.因为我的整个应用程序只有一个背景图片(UIImageView添加到关键窗口)并且所有视图都是透明的,所以我在推送UIViewController时遇到了一个问题,因为推送的视图控制器与之前的视图重叠(您可以在图片中看到它:http://grab.by/qp0k).我可以预测这是因为在 iOS 7 中推送过渡已经改变,因为现在它滑动了半个屏幕.也许有人知道如何解决这个问题?

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 window) and all views are transparent, I face a problem when pushing UIViewController, because pushed view controller overlaps previous view (you can see it in the picture here: http://grab.by/qp0k). I can predict that this is because in iOS 7 push transition has been changed, because now it slides half a screen. Maybe anyone knows how to fix this issue?

这就是我设置关键窗口的方式

This is how I set my key windows

  self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
 UIImageView *background = [[UIImageView alloc]initWithFrame:[[UIScreen mainScreen] bounds]];
 background.image = [UIImage imageNamed:@"background.png"]; 
UINavigationController *navi = [[UINavigationController alloc]initWithRootViewController:self.viewController];
self.window.rootViewContro‌​ller = navi;
 [self.window makeKeyAndVisible];

之后,当用户点击开始锻炼"按钮时,我会像往常一样推送我的下一个视图:

Afterwards when user clicks on "start workout" button I push my next view as always:

workoutView *w = [[workoutView alloc]initWithNibName:@"workoutView" bundle:nil];
        [self.navigationController pushViewController:w animated:YES];

推荐答案

我通过实现新的 UINavigationControllerDelegate 方法 animationControllerForOperation 解决了这个问题.

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

例如:

- (id<UIViewControllerAnimatedTransitioning>)navigationController:(UINavigationController     *)navigationController
                              animationControllerForOperation:(UINavigationControllerOperation)operation
                                           fromViewController:(UIViewController *)fromVC
                                             toViewController:(UIViewController *)toVC
{

PushTransition* transition = [PushTransition new];
[transition setNavigationControllerOperation: operation];

return transition;
}

PushTransition 是一个实现 UIViewControllerAnimatedTransitioning 协议以及该协议的两个方法 transitionDuration 和 animateTransition 的类.此外,我添加了一个属性来传递操作(告诉我它是推送还是弹出转换).

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).

只需将移动视图的动画代码放入 animateTransition 如下:

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.

这篇关于具有透明内容的 ios 7 视图与以前的视图重叠的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

java.lang.IllegalStateException: SimpleTypeImpl should not be created for error type(异常:不应为错误类型创建SimpleTypeImpl)
Android IllegalArgumentException: The tag for fragment_XXX is invalid. Received: layout-sw600dp/fragment_XXX_0(Android IlLegalArgumentException:Fragment_XXX的标签无效。收到:Layout-sw600dp/Fragment_XXX_0)
HTTPS request using volley(使用 volley 的 HTTPS 请求)
Error: Name not maching for self signed SSL certificates on Android(错误:Android 上自签名 SSL 证书的名称不匹配)
Android 7.0 : #39;javax.net.ssl.SSLHandshakeException: Connection closed by peer(Android 7.0:javax.net.ssl.SSLHandshakeException:连接被对等方关闭)
Is it possible to generate certificate signing request(.csr) using security framework in iOS?(是否可以在 iOS 中使用安全框架生成证书签名请求(.csr)?)