金沙4066总站 18

信息公开

金沙4066总站一定页面横屏退出或切换其余页面再进来仍维持横屏

22 8月 , 2019  

期望漫天星光抬头凝望就在我家乡院子外,杏树旁

最近在研究播放器,播放器需要根据手机旋转来切换横竖屏状态,且横竖屏都是同一个VC只是做了屏幕尺寸适配,全屏播放页面有一个分享按钮,参考其他APP要实现,分享到微博微信等强制竖屏APP之后回来仍旧保持横屏,而不是竖屏再切换回横屏。如下图所示。

 在使用storyboard和xib时,我们经常要用到ScrollView,还有自动布局AutoLayout,但是ScrollView和AutoLayout
结合使用,相对来说有点复杂。根据实践,我说一下我的理解,在故事板或xib中,ScrollView是根据其下面的一个View的大小来确定ContentSize的大小。

人生有诸多方向难寻一地歌唱爱情也是方向却太接近天堂叫人恐惧又神往

金沙4066总站 1

看一下效果

若梦断情殇无力应付心绪摇晃只能如蜗牛将心在壳里安放倒也不是懦弱只是牵挂的人受风雨打击需要抵抗我需要力量

IMG_0510.PNG

金沙4066总站 2

或许我就这样平凡却不投降

APP所有VC横屏或竖屏

AppDelegate.m中有如下方法可以设置整个app的方向。

- (UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window {
      return UIInterfaceOrientationMaskLandscape;
}

该方法实质上是制定window的方向,虽然一个app有多个VC,但是window都只有一个,所以这个指定了window的方向,那所有VC的方向就都是统一的。

  

版权作品,未经《短文学》书面授权,严禁转载,违者将被追究法律责任。

特定VC横屏或竖屏

在iOS6之后,需要在某个页面强制横屏,可以使用以下代码:

- (BOOL) shouldAutorotateToInterfaceOrientation: (UIInterfaceOrientation)toInterfaceOrientation {
    return (toInterfaceOrientation == UIInterfaceOrientationMaskLandscape);
}
- (NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskLandscape;
}

此段代码针对于在特定VC指定横竖屏方向,但是由于我的demo中横竖屏都是同一个VC,这个方法就不能采用了。

1.
创建一个项目,拖拽一个ScrollView到故事板中,如下图

特定状态横屏且window横屏

如果需要app进入其他app再回来或退出后重新进入都保持原来的方向,那么就需要改变window的方向,就需要用到APPDelegate中的supportedInterfaceOrientationsForWindow方法。只在特定状态横屏,那就需要一个标识符来判定当前是否需要横屏。代码如下:

//AppDelegate.h
@interface AppDelegate : UIResponder <UIApplicationDelegate>
@property (nonatomic, assign) BOOL isLandscape;
@end

//AppDelegate.m
- (UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window {
    if (_ isLandscape) {
            return UIInterfaceOrientationMaskLandscape;
    }
    else
    {
           return UIInterfaceOrientationMaskAllButUpsideDown;
    }
}

//Player.m
- (void)backToPortrait//回到竖屏
{
    AppDelegate * appDelegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
    appDelegate.allowRotation = NO;
}

- (void)enterToLandscape//进入横屏
{
    AppDelegate * appDelegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
    appDelegate.allowRotation = YES;
}

但是发现加入以上代码,导致全屏模式下无法通过旋转手机方向进入回到竖屏模式了,看了一下是因为isLandscape为YES,所以始终return
UIInterfaceOrientationMaskLandscape。最终修改AppDelegate.m中代码如下:

- (UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window {
    if (_isLandscape) {
        UIDeviceOrientation orientation = [UIDevice currentDevice].orientation;
        if (orientation == UIDeviceOrientationLandscapeLeft || orientation == UIDeviceOrientationLandscapeRight) {
            return UIInterfaceOrientationMaskLandscape;
        }else { // 横屏后旋转屏幕变为竖屏
            return UIInterfaceOrientationMaskPortrait;
        }
    }
    else
    {
           return UIInterfaceOrientationMaskAllButUpsideDown;
    }
}

此处需要注意,判断屏幕方向只能使用UIDeviceOrientation手机设备方向而不能用UIInterfaceOrientation状态栏方向,因为横屏状态下,走isLandscape逻辑,不改变当前VC方向,所以虽然手机方向改变,但状态栏方向不变,用状态方向判断会导致屏幕无法旋转。

金沙4066总站 3

 

  1. 选中ScrollView,添加约束。

金沙4066总站 4

 

  1. 拖拽一个View到ScrollView上,
    然后添加上下左右四周约束。

金沙4066总站 5

 

4.添加完之后, 可能会报一个错, 如下图,
这个暂时别去管。 

金沙4066总站 6

 

5. 我们先确定一下,
我们是需要水平方向的滚动还是竖直方向的滚动,或者水平方向和竖直方向都需要滚动。

a.水平方向和竖直方向都需要滚动的话,
不用添加

b.水平方向滚动需要添加下面一个约束

金沙4066总站 7

 

c.竖直方向需要添加下面一个约束

 金沙4066总站 8

 

6.我们以水平方向滚动为例,
 我们需要确定我们想要的宽度, 添加一个固定的宽度的约束。

金沙4066总站 9

 

 

 

7.选中View, 更新一下Frame

 金沙4066总站 10

 

8.如果是想要动态设置ScrollView的宽度,也就是设置View的宽度约束的值,
我们将其拉成属性, 然后修改其值。

 金沙4066总站 11

 

  1. 如果是确定的宽度, 可以在-
    (void)updateViewConstraints这个方法中修改,也可以在别处修改。

 金沙4066总站 12

 

10.现在运行,就可以水平滚动了。
竖直方向的滚动和水平方向滚动的设置差不多。 我们来添加两个View,
先拖拽一个View(我设为灰色)到视图上, 然后添加约束, 如下图

 金沙4066总站 13

 

11.再拖拽一个View,
背景颜色设为红色,设置好之后, 将frame设置到我们需要的,
我这边将X设置到600。

金沙4066总站 14

 

12.我们给第二个View添加约束,如下图

 金沙4066总站 15

 

13.我们还需要设置一个约束,
就是第二个View距离SuperView的距离,就是第二个View的Leading约束

 金沙4066总站 16

 

14.然后将这个约束Leading拉成属性,在-
(void)updateViewConstraints设置他的值

 金沙4066总站 17

 

如下图

 金沙4066总站 18

 

 

这样子就OK了。 

自动布局需要自己去多多实践,
有很多细节需要注意的。 

本文原文来自

 

,


相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图