2016-05-18 18:05:09 laonayt 阅读数 2855

1.新建项目,默认屏幕可以旋转以及旋转方向。

2.如果项目中所有页面不支持旋转,则直接勾掉就行了。


3.重点来了:如果想实现部分页面竖屏,个别的页面横屏怎么办?(比如播放页面横屏)

 复写UIViewcontroller的下面几个模板函数。

- (BOOL)shouldAutorotate NS_AVAILABLE_IOS(6_0);

   当前viewcontroller是否支持转屏


- (NSUInteger)supportedInterfaceOrientations;

   当前viewcontroller支持哪些转屏方向


- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation 

   当前viewcontroller默认的屏幕方向


方法一:

    1)如果目标ViewController是由NavigationController引用的,则只能在NavigationController中重写上述方法,反之在目标ViewController中重写则无效。

    2)下边说一下具体的做法:

       1*自定义NavigationController。

       2*重写上述的三个模板函数。

       3*在- (BOOL)shouldAutorotate方法里判断哪个类需要旋转,哪个类不需要;


方法二:

在APPDelegate.h文件中增加属性:是否支持横屏

/*** 是否允许横屏的标记 */@property (nonatomic,assign)BOOL allowRotation;


在APPDelegate.m文件中增加方法,控制全部不支持横屏

-(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window {
    if (self.allowRotation) {
        return UIInterfaceOrientationMaskAll;
    }
    return UIInterfaceOrientationMaskPortrait;
}

这样在其他界面想要横屏的时候,我们只要控制allowRotation这个属性就可以控制其他界面进行横屏了。

//需在上面#import "AppDelegate.h"
AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
appDelegate.allowRotation = YES;
//不让横屏的时候 appDelegate.allowRotation = NO;即可
如果遇到网页需要横屏的解决方案:



2015-08-21 18:11:18 zyzxrj 阅读数 12916

ios7版本之后,增加了很多新的属性,其中包括页面起始点从屏幕最左上角(0,0)点开始,这给页面适配带来了很大问题。首先说说纯代码页面:

1、edgesForExtendedLayout

这个属性我们字面上里面是四周延生,指定边缘要延伸的方向,IOS7鼓励全屏布局模式,默认值是UIRectEdgeAll。

没用过的人可能不知道这是什么意思,举例假如我们页面上面有导航了,这个时候页面起始点仍然从状态栏上方开始计算,举例子你一个视图要全屏显示就要设置成:

CGRectMake(0, 64, SCREENW, self.view.frame.size.height - 64)


假如我们想从导航栏下面开始计算起始点,可以设置成UIRectEdgeNone或者UIRectEdgeLeft | UIRectEdgeBottom | UIRectEdgeRight


2、extendedLayoutIncludesOpaqueBars

这个属性看单词的意思,延伸视图包含不包含不透明的Bar,是用来指定导航栏是透明的还是不透明,IOS7中默认是YES,当滚动页面的时候我们隐约能在导航栏下面看到我们页面的试图:



但是当我们设置一张不透明的图片作为导航栏背景时,该属性就会变成NO,这样不透明以后我们可以人为设置成YES达到延伸至导航栏的效果:

    UINavigationBar *bar = [UINavigationBar appearance];
    [bar setBackgroundImage:[UIImage imageNamed:@"navBg.png"] forBarMetrics:UIBarMetricsDefault];//设置图片导航栏是不透明的


假如我们如下设置,extendedLayoutIncludesOpaqueBars仍然是YES

    [bar setBarTintColor:[UIColor whiteColor]];


这个属性一定意义上来说效果跟上一个属性一样,以下两个属性任何一个设置成不可延伸至导航栏都会让页面起始点从导航栏下面开始

        self.edgesForExtendedLayout = UIRectEdgeNone;
        self.extendedLayoutIncludesOpaqueBars = NO;

我们要设置一个全屏的页面就要设置frame为:   

    CGRectMake(0, 0, SCREENW, self.view.frame.size.height - 64)

同理,只有到两个属性都设置成可以延伸时,页面起始点才会从状态栏也就是屏幕最左上角开始


3、automaticallyAdjustsScrollViewInsets


由词意可是是否自动判断滚动视图的内边距,要说这个Insets呢我们就要首先说说scroll视图contentInset这个属性,

typedef struct UIEdgeInsets {
    CGFloat top, left, bottom, right;  // specify amount to inset (positive) for each of the edges. values can be negative to 'outset'
} UIEdgeInsets;


看这个结构体定义我们可以清楚地看到上左下右,从我找的一张图来看看到底是什么:

也就是在contentSize的周围增加了一圈额外的滚动区域,就是相当于contentSize大了一圈。


注意:该属性在ios7中默认开启,也就是说滚动视图的显示会通过计算状态栏导航栏的显示情况来偏移相应的位置

假如状态栏显示,导航栏隐藏向下偏移20,

状态栏隐藏,导航栏显示偏移44,两者都显示偏移64,都隐藏则不偏移


但是假如我们视图结构中有一个以上的滚动视图,我们想自己控制滚动视图显示问题,我们就可以设置成NO。这样所有的滚动视图将不做显示偏移


 4、modalPresentationCapturesStatusBarAppearance


这个属性说的是,当前控制器present一个其他控制器上的非全屏界面我们是否接管status bar的外观,默认是NO,(我们从一个界面A present另一个全屏界面B时,status Bar 的外观控制被转交给被B )
假如我们设置成YES,我们可以指定B界面的status bar,即使是非全屏的
这个属性当present一个全屏界面时是被系统忽略的


2016-12-09 20:04:19 u011467458 阅读数 3378

以下转载在简书 ,原文链接:http://www.jianshu.com/p/11fe95ec1159

需求

让app中某一个或者某几个页面可以支持屏幕旋转,但是登录页面,主页面等大部分页面不支持屏幕旋转。

开干

第一步 设置app可以支持屏幕旋转

在Xcode project的general这个标签下,设置app支持的屏幕旋转方向。


或者可以在在info.plist文件中设置Supported interface orientations


第二步 设置app不支持屏幕旋转

这里是在代码中设置app中所有的页面不支持屏幕旋转,(然后在个别需要旋转的页面再另设置)

需要在一个app的每个view controller中,可以分别指定当前view controller支持的旋转方向。但是这里所指的view controller,必须是root view controller或者全屏的view controller,不然相关方法是不会被调用的。

所以说,如果这个view controller是被包含在navigation controller或者tab bar controller中的时候,无法设置。需要在自定义的navigation controller或者tab bar controller中设置支持的旋转方向。

在自定义的navigation controller或者tab bar controller中重写supportedInterfaceOrientations方法


- (UIInterfaceOrientationMask)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskPortrait;
}

这样,设置后,当前app所有页面不支持屏幕旋转。

第三步 设置部分页面可以旋转

来到需要设置的ViewController重写supportedInterfaceOrientations方法

- (UIInterfaceOrientationMask)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskLandscapeLeft;  //支持横向
}

//设置为允许旋转
- (BOOL) shouldAutorotate {
   return YES;
}



2016-04-16 11:34:59 Dennis_Zhang_941314 阅读数 555

前两天遇到了一个 “使用指定的不同屏幕方向打开新页面” 的需求,需求很简单:APP 一直保持竖屏,要求新打开的签名页面能够指定为横屏或竖屏,并自动的转换,且不允许自动切换,新页面退出后要恢复竖屏!

在网上查了很多资料均不能获取自己想要的效果,最后整理了别人的思路,方法,再花了一天的工作量填坑,成功实现了想要的功能和效果,嗯,完美!!!!

公司的 APP 采用的通用方案:根控制器为 TabBarController,之后嵌套 NavigationController,然后放入 ViewController 页面进行展示,需要横屏的页面控制器建议需要用 present 方式进行弹出(原因就是坑少啰!!!!)。

废话太多直接进入正题!!!!!!!!

第一步:

 在AppDelegate.m中的- (UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window中添加以下代码

    NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];

    BOOL isAllowLandscape = [userDefault boolForKey:@"userDefault_isAllowLandscape"];

    [userDefault setBool:NO forKey:@"userDefault_isAllowLandscape"];

//这里其实可以再加一个判断,具体到需要强制横评的页面  

  if (isAllowLandscape) {

        return UIInterfaceOrientationMaskLandscapeRight;

    }

    else

    {

        return (UIInterfaceOrientationMaskPortrait);

    }

其中采用单例模式进行横竖屏标志tag设置

ps:之前查了很多资料,最有效的方法中都在要求在target ->general ->Deployment info -> Device Orientation中勾选Landscape Left 或者****Right,我也试着这么弄了,但是这个有个大坑,他们也没提出自己的解决方案!弄了我半天,毕竟这个设置后整个app都可以进行横竖屏,设置横竖屏标志来强制某些界面可以横评或者竖屏这个方法也用了,某些情况还是会出现bug,总之就一句话:就是有坑。

第二部:

a.直接在需要强制横屏的控制器的ViewDidLoad方法中添加修改单例状态代码

    NSLog(@"TradeSignatureViewController:viewDidLoad");

    NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];

    [userDefault setBool:YES forKey:@"userDefault_isAllowLandscape"];

b.在viewWillDisAppear中恢复单例状态为竖屏标志,就是为了推出界面后强制回竖屏

- (void)viewWillDisappear:(BOOL)animated {

    [super viewWillDisappear:animated];

    NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];

    [userDefault setBool:NO forKey:@"userDefault_isAllowLandscape"];

}

c.

在提取签名的方法中添加如下代码

    NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];

    [userDefault setBool:NO forKey:@"userDefault_isAllowLandscape"];    //图片获取到后恢复竖屏,否则会出现返回页面也是横屏的情况

 最后的重点: 因为签名界面仅仅允许横屏,因此在进行xib (没有用xib当我没说),因此xib的属性选择Landscape然后进行横屏布局(为了不埋坑,在同一个文件中弹出框最好也做一个横屏的弹出框,这样就需要对全局的弹出框再进行一次横屏切换)


 总结:看了好多解决方案,填了好多坑,最后压缩成就这点代码,两天的工作量,真是日了狗!



2017-05-03 22:27:12 m0_38076563 阅读数 2629


//  UIScrollView使用方法、属性详解---


import UIKit


class ViewController: UIViewController ,UIScrollViewDelegate{

    

    var scroll:UIScrollView!

    

    override func viewDidLoad() {

        super.viewDidLoad()

        view.backgroundColor = UIColor.white

      

        scroll = UIScrollView(frame: view.bounds)

        let myView = UIView(frame: CGRect(x: 50, y: 50, width: 300, height: 500))

        myView.backgroundColor = UIColor.lightGray

        scroll.addSubview(myView)

        //内容大小,小于scrollView的大小肯定不会scroll

        scroll.contentSize = CGSize(width: view.bounds.width*2, height: view.bounds.height*2)

        //但是可以设定,内容就算小于它,也能拖:

        scroll.alwaysBounceVertical = true //还有水平的

        //内容的初始位置偏移到指定point

        scroll.contentOffset = CGPoint(x: 20, y: 20)

       

        //拉到头时可否反弹 defaulttrue

        scroll.bounces = true

        //拖时候不能改变方向。但往对角线方向开始拖,可以自由拖

        scroll.isDirectionalLockEnabled = false //default false

        //翻页效果,true就是手滑动小了回到原位置,大了直接跳下一页

        scroll.isPagingEnabled = false

        //scroll.isScrollEnabled = false //false就不能滑了==

        //点状态栏回到最上方 

        scroll.scrollsToTop = true;

        

        //滚动条到屏幕边缘的距离 offset <-> inset ,offset偏移,inset内移

        scroll.scrollIndicatorInsets = UIEdgeInsets(top: 20, left: 20, bottom: 20, right: 0)

        //add additional scroll area around content

        scroll.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)

        //是否显示滚动条

        scroll.showsVerticalScrollIndicator = true //还有水平的

        scroll.indicatorStyle = .black //默认黑,黑白两色可选

        function()

        

        //实现两指缩放与扩大

        scroll.minimumZoomScale = 0.5

        scroll.maximumZoomScale = 1.6

        

        //超过放大范围再弹回来

        scroll.bouncesZoom = true

        //如果正显示着键盘,拖动,则键盘撤回

        scroll.keyboardDismissMode = .onDrag

        

        //scroll.refreshControl = UIRefreshControl(frame: CGRect(x: 10, y: 10, width: 40, height: 40))

//        open var decelerationRate: CGFloat       

//        open var indexDisplayMode: UIScrollViewIndexDisplayMode

       

        //现在实现ScrollViewDelegate,补充后面的协议方法

        scroll.delegate = self

  


        

        view.addSubview(scroll)

    }

    

    //设置可以缩放

    func viewForZooming(in scrollView: UIScrollView) -> UIView? {

        return scrollView.subviews[0]

    }

    

    func function(){

        //滚动条突然显现一下

        scroll.flashScrollIndicators()

    }

    //点击状态栏时触发,返回false则不能滑上去 相应的 didScrollToTop是已经回了调用的

    func scrollViewShouldScrollToTop(_ scrollView: UIScrollView) -> Bool {

        

        return true

    }

    //开始拖拽前:

    func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {

        

    }

    //手滑后,松手减速,结束时:

    func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {

        

    }

    //拖拽结束

    func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {

        

    }

    //滚动动画结束

    func scrollViewDidEndScrollingAnimation(_ scrollView: UIScrollView) {

        

    }

    //剩下的真的不想写了,,用到时候直接看文档吧,都是差不多的方法。。。可以自己试出来

    

    

    

    

    

}









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