![](/img/trans.png)
[英]Rotation for view when viewcontroller locked to portrait in ios6/ios7
[英]CGAffineTransformMakeTranslation causing view rotation on iOS6
我創建了一個空項目,該情節僅允許情節提要與故事板一起使用,該情節提要僅包含一個UIViewController作為rootViewController並在其中心有一個按鈕。
- (IBAction)onClick:(UIButton *)sender {
sender.superview.transform = CGAffineTransformMakeTranslation(-320, 0);
}
可以預期的是,當單擊該按鈕時,視圖向左移動320,但是不幸的是,發生的事情是視圖在逆時針方向旋轉並同時向左移動。 似乎應用程序以某種方式認為已將其設置為縱向視圖,並在考慮到該視圖的情況下轉換了視圖,這是發生的情況:
我確定我在這里遺漏了一些東西,但我不知道它是什么。
我試圖在viewController上定義方法,例如- (BOOL)shouldAutorotate
shouldAutorotate和- (NSUInteger)supportedInterfaceOrientations
但它沒有改變這種行為。
任何幫助,將不勝感激。
提前致謝
您的應用程序有一個UIWindow
,其中包含您的根視圖控制器的視圖,其中包含按鈕:
UIWindow
UIButton
您不了解的是, UIWindow
通過對根目錄應用旋轉變換來旋轉用戶界面。 當界面處於橫向左方向時,請查看視圖層次結構:
(lldb) po [[UIApp keyWindow] recursiveDescription]
(id) $1 = 0x0922ee80 <UIWindow: 0x942c280; frame = (0 0; 768 1024); layer = <UIWindowLayer: 0x942c380>>
| <UIView: 0x9432b30; frame = (20 0; 748 1024); transform = [0, -1, 1, 0, 0, 0]; autoresize = W+H; layer = <CALayer: 0x9432be0>>
| | <UIRoundedRectButton: 0x942f7a0; frame = (476 352; 73 44); opaque = NO; layer = <CALayer: 0x942f8c0>>
| | | <UIGroupTableViewCellBackground: 0x94300b0; frame = (0 0; 73 44); userInteractionEnabled = NO; layer = <CALayer: 0x9430180>>
| | | <UIImageView: 0x9430af0; frame = (1 1; 71 43); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x9431340>>
| | | <UIButtonLabel: 0x94319c0; frame = (12 12; 49 19); text = 'Button'; clipsToBounds = YES; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x9431d10>>
看看UIWindow
的子視圖( UIView: 0x942c380
)如何具有[0, -1, 1, 0, 0, 0]
UIView: 0x942c380
]的轉換? 該變換將您的頂級視圖逆時針旋轉90°。 如果將設備(或模擬器)旋轉到橫向正確的方向,則會看到變換變為[0, 1, -1, 0, 0, 0]
:
(lldb) po [[UIApp keyWindow] recursiveDescription]
(id) $2 = 0x07436d90 <UIWindow: 0x942c280; frame = (0 0; 768 1024); layer = <UIWindowLayer: 0x942c380>>
| <UIView: 0x9432b30; frame = (0 0; 748 1024); transform = [0, 1, -1, 0, 0, 0]; autoresize = W+H; layer = <CALayer: 0x9432be0>>
| | <UIRoundedRectButton: 0x942f7a0; frame = (476 352; 73 44); opaque = NO; layer = <CALayer: 0x942f8c0>>
| | | <UIGroupTableViewCellBackground: 0x94300b0; frame = (0 0; 73 44); userInteractionEnabled = NO; layer = <CALayer: 0x9430180>>
| | | <UIImageView: 0x9430af0; frame = (1 1; 71 43); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x9431340>>
| | | <UIButtonLabel: 0x94319c0; frame = (12 12; 49 19); text = 'Button'; clipsToBounds = YES; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x9431d10>>
當您重置視圖的變換時,您將丟失旋轉,因此視圖將恢復為其“默認”旋轉0˚,即縱向旋轉。
亞當·洛克哈特(Adam Lockhart)的答案將暫時解決此問題,但如果用戶旋轉設備,則UIWindow
將重置視圖的變換,從而丟失您應用的翻譯。
解決此問題的正確方法是不要將自己的轉換應用於頂級視圖。 給您的頂級視圖一個可以轉換的子視圖,然后在其中放置按鈕:
UIWindow
UIButton
您需要將轉換應用於其現有轉換。
- (IBAction)onClick:(UIButton *)sender {
sender.superview.transform = CGAffineTransformTranslate(sender.superview.transform, -320, 0);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.