强迫UIView以某种方向显示的秘诀

标签: 用户界面 编程 提示与技巧 代码片段 | 发表时间:2011-08-25 14:29 | 作者:bagusflyer 刘德华
出处:http://www.iphone-geek.cn

我有一个项目其中某些UIView必须以特定的方向(Portrait或者Landscape)显示。这个看似简单的问题,困惑了我很久,直到今天我才完全找到解决的方法。

为简单起见,我以一个简单的例子说明一下我的问题。我有一个允许各种方向知道旋转的RootViewController,它包括一个共三行的UITableView,第一行显示“Portrait”,第二行显示“Landscape”,第三行显示“Autorotation”,点击某些行后,使用pushViewController打开一个DetailViewController,这个View Controller控制的view将根据行的内容有所不同。比如,如果按下的是第一行,则在DetailViewController中显示“Portrait”,并只允许UIView以portrait方式显示。


首先,我根据按下的行号,以orientation作为参数,传递给DetailViewController,在此ViewController的shouldAutorotateToInterfaceOrientation方法中根据orentation参数返回。代码如下:

1
2
3
4
5
6
7
8
9
10
11
 - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    if ( self.orientation == 0 ) // allow portrait
        return (interfaceOrientation == UIInterfaceOrientationPortrait) || (interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown);
    else if ( self.orientation == 1 )  // allow landscape
    {        
        return (interfaceOrientation == UIInterfaceOrientationLandscapeLeft) || (interfaceOrientation == UIInterfaceOrientationLandscapeRight);
    }
    else // allow autorotation
        return YES;
}



以上代码仅仅使得DetailViewController在特定情况下确定是否允许进行自动旋转。但如果初始的方向不正确的话,它却无能为力。比如,我在RootViewController(它允许任何方向的旋转)处于Landscape方向时,点击第一行(row 0),此时的DetailViewController所呈现的UIView仍然处于Landscape,当然这与我程序的本意当然不符。


于是我的问题就变成了怎样强迫UIView旋转到特定方向?我在网上搜索到一种方案,即UIDvice的setOrientation: 方法,不过遗憾的是此方法是私有api,当然我不能接受。于是我又试验了UIApplication中setStatusBarOrientation:方法,该方法果然把状态条旋转到了我需要的方向,不过我的UIView还是处于不正确的方向(以我上一段提到的情况为例)。因为在创建DetailViewController时触发的shouldAutorotateToInterfaceOrientation中(发生在setStatusBarOrientation之前),当时的UIInterfaceOrientation还是为landscape,而我的orientation参数为0,所以返回为NO,因此屏幕并没有旋转。有什么方法能够再触发一次shouldAutorotateToInterfaceOrientation吗?


答案是肯定的,见我的代码:

1
2
3
4
5
        // trick to retrigger shouldAutorotateToInterfaceOrientation method
        UIWindow *window = [[UIApplication sharedApplication] keyWindow];
        UIView *view = [window.subviews objectAtIndex:0];
        [view removeFromSuperview];
        [window addSubview:view];



在setStatusBarOrientation后,调用以上代码,强行触发了shouldAutorotateToInterfaceOrientation了,此时orientation为0,但interfaceOrientation我已经通过setStatusBarOrientation设置成了UIInterfaceOrientationPortrait,所以会返回YES,直接导致UIView的旋转。(以上代码是我在网上看到的方法)。


至此,整个解决方案就比较完满了,代码下载。不过请注意我的代码实例仅仅针对一种情况进行了处理(即orientation等于1,即仅仅允许UIView处于landscape时),其他情况依此类推。

相关 [强迫 uiview 方向] 推荐:

强迫UIView以某种方向显示的秘诀

- 刘德华 - iPhoneGeek 爱疯极客
我有一个项目其中某些UIView必须以特定的方向(Portrait或者Landscape)显示. 这个看似简单的问题,困惑了我很久,直到今天我才完全找到解决的方法. 为简单起见,我以一个简单的例子说明一下我的问题. 我有一个允许各种方向知道旋转的RootViewController,它包括一个共三行的UITableView,第一行显示“Portrait”,第二行显示“Landscape”,第三行显示“Autorotation”,点击某些行后,使用pushViewController打开一个DetailViewController,这个View Controller控制的view将根据行的内容有所不同.

你强迫症了吗?

- 临池学书 - 果壳网 guokr.com - 果壳网
每个人都有点自己的小偏执:手已经洗干净了,想一想,又要多洗几次;明明锁好了门,却一定要检查再检查才能下定决心去逛街;山顶观景,明明自己正感受着浪漫与幸福,脑子里莫名蹦出要跳下去的想法吓得你后退连连……这些症状你或多或少都有过,不光朋友连自己都怀疑自己强迫症了吗. 健康警报》的心理学专家杨凤池教授怎么说.

贝克汉姆的“强迫症”

- VI - 科学松鼠会
前段时间,英国球星贝克汉姆向媒体披露,自己患有“强迫症”. 他对居住环境的要求很高,如果酒店房间里的东西没有摆放好,他一定要亲自动手把它们整理整齐. 他家里物品务必要达到“完美”的效果:所有物体必须排成直线,而且最好是成双成对. 他的衣橱里有30对一模一样的CK内裤,衬衫也必须根据颜色顺次排开. 家里的三个冰箱分别摆放食品、饮料和沙拉.

用电脑强迫自己专注

- zjzxzhang - 爱范儿 · Beats of Bits
最近一直在为如何提升工作效率而苦恼. 我的工作既不琐碎也不太需要长远规划,GTD 帮助不大. 但基本上每一项工作都需要持续的专注才会有效率. 以翻译为例,专注两小时的结果会比每十分钟分一次心,干上八小时更好. 上个月我已经到了每天早晚各睡三小时,白天夜里全部用来工作、看书的地步. 咖啡机每天响四五次、能量饮料成箱买.

整理的艺术:反熵强迫症

- 无双 - 果壳网 guokr.com - 果壳网
有时候,我们总是情不自禁要进行各种收拾整理,就是见不得混乱和无序. 面对这个熵增的世界,似乎总是要做点什么. 我们就把这种行为叫做“反熵强迫症”吧. 也许瑞士艺术家乌尔斯(Ursus Wehrli)就是一名“反熵强迫症”患者,他最近出了一本新书,名为“整理的艺术”. 乌尔斯把许多著名的艺术作品拆分成最基础的组成部分,然后按照颜色和尺寸排列起来.

一条有强迫症的蛇。。。

- laogao - 爱胡扯
河南濮阳1名干部强搂宋祖英( 0 ). 曹操是如何坐飞机的( 0 ). 富士康–坠楼事件的9大原因 ( 0 ). 吴仁惠性交易性艳照( 0 ). 广州女子博客上传靓照( 0 ).

强迫症患者的臆想世界

- gogo - 《Geek》官方Blog
如今的高压社会下,患有强迫症的人还真不少,但即便是强迫症,其程度也得分个三六九等,今天就让大家见识一下出神入化的强迫症境界:. 1.这不是一般的意志力就能做成的……. 2.对于强迫症者来说,放好并不代表事情的结束,排列整齐才是王道. 3.我妈要是看见我把碗柜里的碗筷排列得像这个这么整齐,她一定会泪奔的…….

颤抖吧,强迫型人格障碍!

- 可可 - 考据癖
// 本文含有大量恐怖图片,会引发特定人群不适,请酌情阅读. 小时候,我是个不安分的娃,可是如果有几个小时都在房间里安安静静的玩,那我一定是在玩乐高. 乐高绝对是上世纪最天才的玩具发明,在我眼里,什么遥控汽车,什么电子宠物,都比不上一套基础款的乐高. 虽然乐高让我着迷,但是我不太喜欢和别的小朋友一起玩,原因是他们经常做让我特纠结的搭配.

有问必答:你有没有数码产品强迫症?

- ivan - Engadget 中国版
适当的把玩是可以的,但你现在是否已经潜意识里有了这种症状. 引用来源 | 此文章网址 | 转寄此文章 | 回应.