在iOS APP中有個(gè)別頁面需要從豎屏切換到橫屏专甩,網(wǎng)上有很多切屏方法渴析,但最后大多是要調(diào)用私有API實(shí)現(xiàn)铲掐,強(qiáng)制改變?cè)O(shè)備的orientation豪硅,其方法如下:
SEL selector = NSSelectorFromString(@"setOrientation:");
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[UIDevice instanceMethodSignatureForSelector:selector]];
[invocation setSelector:selector];
[invocation setTarget:[UIDevice currentDevice]];
[invocation setArgument:&orientation atIndex:2];
[invocation invoke];
我所在公司的所有APP都在用這種強(qiáng)行改變?cè)O(shè)備orientation的方式,目前這樣是能通過appStore的審核,但總覺得這種方式不是很安全椰棘,保不準(zhǔn)那天就被蘋果干掉了纺棺。觀察了市面上主流視頻播放APP,其豎屏切換到橫屏?xí)r大多是采用動(dòng)畫的形式邪狞,所以猜測(cè)了下動(dòng)畫轉(zhuǎn)屏的實(shí)現(xiàn)方式祷蝌。
要實(shí)現(xiàn)動(dòng)畫轉(zhuǎn)屏,必須先觀察豎屏?xí)rAPP畫面狀態(tài)帆卓,畫面在旋轉(zhuǎn)前的frame狀態(tài)和旋轉(zhuǎn)后的狀態(tài)巨朦,三種狀態(tài)如下所示:
轉(zhuǎn)屏前、后狀態(tài)
上圖中有APP處于豎屏播放狀態(tài)鳞疲,點(diǎn)擊全屏按鈕后重設(shè)播放頁面frame罪郊、以及旋轉(zhuǎn)到橫屏播放狀態(tài)的示意圖。視圖旋轉(zhuǎn)是以中心點(diǎn)進(jìn)行的尚洽,所以旋轉(zhuǎn)前的frame按上圖中間的方式計(jì)算悔橄。
知道如何計(jì)算橫屏狀態(tài)view的frame,接下來就好辦了腺毫,直接旋轉(zhuǎn)M_PI_2即可癣疟。
self.originFrame = self.view.frame;
CGFloat height = [[UIScreen mainScreen] bounds].size.width;
CGFloat width = [[UIScreen mainScreen] bounds].size.height;
CGRect frame = CGRectMake((height - width) / 2, (width - height) / 2, width, height);
self.frame = frame;
[UIView animateWithDuration:0.3f animations:^{
self.frame = frame;
[self.view setTransform:CGAffineTransformMakeRotation(M_PI_2)];
} completion:^(BOOL finished) {
}];
動(dòng)畫轉(zhuǎn)屏?xí)r,設(shè)備的原點(diǎn)依然是左上角潮酒。