iOS8以后的屏幕宽高变化

问题描述:

自己刚做好的App,一同事拿来把玩,点击进入一个界面布局全乱,自己拿过来重新点击没问题啊,后来回忆起来这哥们完全不按套路,好像是斜着45°拿着手机点击出了问题,自己一试果然如此,赶紧找问题解决呗。

想想大家都明白是横竖屏旋转的问题,可是之前已经解决了这个问题啊,由于该项目有视频播放所以不能只限制为竖屏,只有播放视频时可以旋转其它情况不能旋转(这个也查了不少资料,会单独来一篇),这里只讨论非竖屏点击进入界面渲染布局错误。


解决方案:

[UIScreen mainScreen].bounds.size.width[UIScreen mainScreen].bounds.size.height,很熟悉吧,就是它们搞的鬼。iOS8以前屏幕的宽、高是不随屏幕旋转变化的,比如iPhone6竖屏[UIScreen mainScreen].bounds.size.width = 375,横屏也是375;iOS8以后iPhone6竖屏[UIScreen mainScreen].bounds.size.width = 375,横屏就变为[UIScreen mainScreen].bounds.size.width = 667,是会随着屏幕旋转而变化。

查了一下解决方案不少,自己认为以下比较好理解也方便,在定义宏的时候为

#define SCREEN_WIDTH    MIN([UIScreen mainScreen].bounds.size.width,[UIScreen mainScreen].bounds.size.height)


#define SCREEN_HEIGHT   MAX([UIScreen mainScreen].bounds.size.width,[UIScreen mainScreen].bounds.size.height)


不管横屏还是竖屏 我们认为的就是最小的那个,就是最大的那个,这样是不是很好处理也好理解。这样一来,横竖屏下点击进入的界面渲染布局就不会出问题。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
iOS 获取屏幕刷新率可以通过Core Animation框架中的CADisplayLink类实现。CADisplayLink是一个定时器类,可以监听屏幕的刷新频率,并在每一帧结束时发送回调。 首先需要创建一个CADisplayLink对象,并添加到主运行循环中: ``` CADisplayLink *displayLink = [UIScreen mainScreen].maximumFramesPerSecond == 0 ? [CADisplayLink displayLinkWithTarget:self selector:@selector(displayLinkTick:)] : [UIScreen mainScreen].linkWithPreferredFramesPerSecond == 0 ? [CADisplayLink displayLinkWithTarget:self selector:@selector(displayLinkTick:)] : [UIScreen mainScreen].linkWithPreferredFramesPerSecond == 60 ? [CADisplayLink displayLinkWithTarget:self selector:@selector(displayLinkTick60fps:)] : [UIScreen mainScreen].linkWithPreferredFramesPerSecond == 120 ? [CADisplayLink displayLinkWithTarget:self selector:@selector(displayLinkTick120fps:)] : [UIScreen mainScreen].linkWithPreferredFramesPerSecond == 90 ? [CADisplayLink displayLinkWithTarget:self selector:@selector(displayLinkTick90fps:)] : nil; [displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes]; ``` 然后实现对应的回调方法,在每帧结束时获取屏幕的刷新率: ``` - (void)displayLinkTick:(CADisplayLink *)link { CGFloat frameInterval = link.duration/60.0; screenRefreshRate = (int)(1.0/frameInterval); } ``` 最后需要注意的是,在iOS 10之后,为了省电和减少GPU负担,屏幕刷新率可能会动态调整,因此获取到的屏幕刷新率并不一定是恒定的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值