app ios 横屏
2018-05-29 14:56:00 weixin_33796177 阅读数 55

今天日常看App 上架情况,确发现告知App 被拒。
理由如下:


10324476-2929412cb54b6949.png
被拒理由截图

说我App虽然是设置在iPhone上面使用,但是不能避免在iPad上面使用,经测试在iPad上面显示有问题。
经测试,竖屏iPad打开App无问题,横屏打开App UI布局会按横向进行布局,会显示错误,压缩不全。

网上浏览了很多方法,但是经测试都没有作用,强行竖屏,或者监控横竖屏状态,根据屏幕宽高判断状态,无法解决该问题。(具体为何不能解决,我就不一一细说了)。

现在问题如下:iPad 横屏状态 进入App 坐标系 是会按照横向的坐标系计算,当前设置是只在iPhone上面使用应用,并且只能竖屏。

下面是解决办法:
就算你App只能竖屏,只能在iPad上面使用,需要检查以下设置,并设置一样。


10324476-e9b2bbcaa24b7e76.png
iPhone设置
10324476-51aed8ca4990076a.png
iPad设置
10324476-68a80310941ed089.png
通用设置

切记三个模式都要设置成这样,最后Devices选择iPhone 。

这样问题可解。

2016-11-03 20:26:00 weixin_33847182 阅读数 15

手机横屏固定显示某个页面

手机 app 开启横屏, 横屏的时候, 手机显示固定的页面, 不管app 在哪个页面横屏显示的始终是某个页面


方法:1

-(BOOL)shouldAutorotate{

return YES;

}

- (NSUInteger)supportedInterfaceOrientations

{

return UIInterfaceOrientationMaskAll;

}

注意该方法要写在控制器的根视图里才生效

2.通知: (要想在哪个页面都实现这种方法写在 APPdelegate 里)

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(statusBarOrientationChange:) name:UIApplicationDidChangeStatusBarOrientationNotification object:nil];

- (void)statusBarOrientationChange:(NSNotification *)notification{  UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];

//在这个位置创建 view 或者 VC

if (orientation == UIInterfaceOrientationLandscapeRight) // home键靠右

{

//将 vc 或者 view 加到 window 上

}

if (orientation ==UIInterfaceOrientationLandscapeLeft) // home键靠左

{

//将 vc 或者 view 加到 window 上

}

if (orientation == UIInterfaceOrientationPortrait)

{

//将 vc 或者 view 从 window 上删除

}

if (orientation == UIInterfaceOrientationPortraitUpsideDown)

{

//将 vc 或者 view 从 window 上删除

}

}


2017-02-28 12:02:00 weixin_33804990 阅读数 16
func application(application: UIApplication, supportedInterfaceOrientationsForWindow window: UIWindow?) -> UIInterfaceOrientationMask {
        
        if var presentedViewController = window?.rootViewController?.presentedViewController {
            while (presentedViewController.presentedViewController) != nil {
                presentedViewController = presentedViewController.presentedViewController!
            }
            
            if let objClass = NSClassFromString("AVFullScreenViewController") where presentedViewController.isKindOfClass(objClass) && !presentedViewController.isBeingDismissed() {
                return UIInterfaceOrientationMask.AllButUpsideDown
            }
            
            if presentedViewController.isKindOfClass(MPMoviePlayerController) && !presentedViewController.isBeingDismissed() {
                return UIInterfaceOrientationMask.AllButUpsideDown
            }
        }
      //判断iPad 需要可以旋转
        if UIDevice.currentDevice().model.hasPrefix("iPad") {
            if UIDevice.currentDevice().orientation.rawValue == 2 {
                return UIInterfaceOrientationMask.PortraitUpsideDown
            }
        }
        return UIInterfaceOrientationMask.Portrait
    }

假如你是用 MPMoviePlayerController 需要 import MediaPlayer

2016-01-14 17:37:29 ztx643702008 阅读数 2681


1,类似qq空间里面的视频,点击播放过后,如果手机开启了旋转功能,那么旋转的时候,视频也旋转。


首先,要想横屏,先打开手机的横屏开关键,如图点击查看图片

然后设置整个项目的Device Orientation 如图所示:


接下来就是代码的事情了,在AppDelegate.h里面声明一个变量isFull

@property (nonatomic)BOOL isFull;

在AppDelegate.m里面写此方法

- (UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window{
    if(_isFull) return UIInterfaceOrientationMaskAll;//可以旋转
    return UIInterfaceOrientationMaskPortrait;//只竖屏
}


在你的UIWebViewControler.m里面

首先引入AppDelegate 

#import "AppDelegate.h"

定义一个局部变量

AppDelegate *_appDelegate;

然后加入代码

#pragma mark 设置程序可以旋转
- (void)videoStarted:(NSNotification *)notification {// 开始播放
    _appDelegate.isFull = YES;
}
#pragma mark 设置程序不能旋转
- (void)videoFinished:(NSNotification *)notification {// 开始播放
     _appDelegate.isFull = NO;
}


- (void)viewDidLoad {
    [super viewDidLoad];
    
    _appDelegate = [[UIApplication sharedApplication] delegate];
    
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(videoStarted:) name:UIWindowDidBecomeVisibleNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(videoFinished:) name:UIWindowDidBecomeHiddenNotification object:nil];
}


ok,done!


2.类似微信朋友圈里面网页点击进去播放视频,进入网页那个Controler就可以横屏


只需要在UIWebViewControler页面的viewDidLoad方法里面设置_appDelegate.isFull = YES;在viewWillDisappear方法里面设置_appDelegate.isFull = NO;就可以了


2017-08-04 18:08:00 weixin_34355715 阅读数 20

前言

很长时间没有更新简书,原因不多说(因为懒),最近比较清闲,想起来写一篇文章来说一下iOS横竖屏轻松切换的过程。 有些需求整体的App只支持竖屏,但是只需要某一部分页面支持横屏,许多的视频类的App都要在竖屏的情况下进行横屏播放,当然还有很多的奇葩需求要横屏来进行实现。

废话少说,进主题

创建项目,App的方向只需要勾选Portrait就行(其实可以不用勾,但是能有几个项目中不勾的呢,我们还是勾上吧)。

1771887-61a275219ffe8cd4.png
勾选方向

前面说可以不勾选因为我们要在AppDelegate中,重写这个方法, 应用程序启动的时候会调用这个方法来给App所需要的屏幕方向:

- (UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window {
    if([ScreenDirectionManager manager].islandscape) {
        return UIInterfaceOrientationMaskLandscape;
    }else {
        return UIInterfaceOrientationMaskAll;
    }
    
}

其中UIInterfaceOrientationMask是一个NS_OPTIONS, 我们可以随意组合,虽然其中有一些组合好的,但是万一不满足产品的奇葩需求呢,对不对,要提前留一手。

typedef NS_OPTIONS(NSUInteger, UIInterfaceOrientationMask) {
    UIInterfaceOrientationMaskPortrait = (1 << UIInterfaceOrientationPortrait),
    UIInterfaceOrientationMaskLandscapeLeft = (1 << UIInterfaceOrientationLandscapeLeft),
    UIInterfaceOrientationMaskLandscapeRight = (1 << UIInterfaceOrientationLandscapeRight),
    UIInterfaceOrientationMaskPortraitUpsideDown = (1 << UIInterfaceOrientationPortraitUpsideDown),
    UIInterfaceOrientationMaskLandscape = (UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight),
    UIInterfaceOrientationMaskAll = (UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight | UIInterfaceOrientationMaskPortraitUpsideDown),
    UIInterfaceOrientationMaskAllButUpsideDown = (UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight),
} __TVOS_PROHIBITED;

意思内容不用多解释,应该都能知道什么意思。

其中ScreenDirectionManager这个类控制屏幕是否横屏,是一个单例就一个属性是否需要横屏,比较简单。

@interface ScreenDirectionManager : NSObject

+ (instancetype)manager;

@property (nonatomic, assign, getter=islandscape) BOOL landscape;

@end

如果你的App不包括导航栏(UINaviagtionController)或者(UITabbarController),你只需要重写UIViewController里面的三个方法就行,这三个方法是:

//  返回bool值,决定Controller是否自动旋转
-(BOOL)shouldAutorotate
//返回一个Controller支持的方向
- (UIInterfaceOrientationMask)supportedInterfaceOrientations
//返回现在正在显示的用户界面方向
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation

但是一般的应用至少有个导航栏吧,所以呢你还需要自定义导航栏(UINavigationController),然后在导航栏里面重写这三个方法,如果不重写,就无法达到你想要的效果,感觉就像这个屏幕方向具有传递的性质。但是我感觉UITabbarController的情况应该少数,我这里不讨论这个情况,下次有空再补上,但是我感觉原理应该是一样的,有兴趣的可以自己试一下。

导航栏的屏幕方向和旋转性质要和导航栏最上层的Controller保持一致,所以自定义导航栏重写的三个方法是这样的:

-(BOOL)shouldAutorotate {
    return [[self.viewControllers lastObject] shouldAutorotate];
}

- (UIInterfaceOrientationMask)supportedInterfaceOrientations {
    return [[self.viewControllers lastObject] supportedInterfaceOrientations];
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
    return [[self.viewControllers lastObject] preferredInterfaceOrientationForPresentation];
}

ViewController中,重写上述的三个方法,返回自己想要的方向,那个改Controller只能是返回的方向,例如:

- (UIInterfaceOrientationMask)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskPortrait;
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
    return UIInterfaceOrientationPortrait;
}

- (BOOL)shouldAutorotate {
    return YES;
}

在第二个页面中,也就是跳转的页面中,重写上述的三个方法,返回自己想要的方向,然后在viewWillAppear方法中设定将单例的属性方向改变,然后根据UIDeviceorientation这个属性,根据KVC,强制设置方向,如下;

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    [ScreenDirectionManager manager].landscape = YES;
    if ([[UIDevice currentDevice] respondsToSelector:@selector(setOrientation:)]) {
//写这句话的目的是保证后面的一句话产生作用,具体不明白为什么,但是不加上会出现bug。有明白的可以告知一下。
        [[UIDevice currentDevice] setValue:@(UIDeviceOrientationUnknown) forKey:@"orientation"];
        [[UIDevice currentDevice] setValue:@(UIDeviceOrientationLandscapeLeft) forKey:@"orientation"];
    }
    
}

还需要在viewWillDisappear中,将单例的横竖屏属性改变回来,因为supportedInterfaceOrientations这个方法会触发AppDelegate中的方向支持方法。

结论

文章描述的不太清楚的,欢迎留言讨论。Demo

没有更多推荐了,返回首页