UIViewContentModeScaleAspectFit
這種模式,限制寬高的某一方, 會有黑邊。
如果是豎屏,那就固定寬度恳邀, 如果是橫屏,那就固定高度。
UIViewContentModeScaleAspectFill
這種是填充模式夸浅,不會拉伸,但是如果不是等比的寬高(手機16:9)可能會切割扔役。
要實現(xiàn)自適應(yīng)旋轉(zhuǎn)帆喇,需要重寫layoutSubviews方法
iOS layout機制相關(guān)方法
- (CGSize)sizeThatFits:(CGSize)size
- (void)sizeToFit
——————-
- (void)layoutSubviews
- (void)layoutIfNeeded
- (void)setNeedsLayout
——————–
- (void)setNeedsDisplay
- (void)drawRect
layoutSubviews在以下情況下會被調(diào)用:
-
init初始化不會觸發(fā)layoutSubviews
但是是用initWithFrame 進(jìn)行初始化時,當(dāng)rect的值不為CGRectZero時,也會觸發(fā)
addSubview會觸發(fā)layoutSubviews
設(shè)置view的Frame會觸發(fā)layoutSubviews亿胸,當(dāng)然前提是frame的值設(shè)置前后發(fā)生了變化
滾動一個UIScrollView會觸發(fā)layoutSubviews
旋轉(zhuǎn)Screen會觸發(fā)父UIView上的layoutSubviews事件
改變一個UIView大小的時候也會觸發(fā)父UIView上的layoutSubviews事件
在蘋果的官方文檔中強調(diào):
You should override this method only if the autoresizing behaviors of the subviews do not offer the behavior you want.
layoutSubviews, 當(dāng)我們在某個類的內(nèi)部調(diào)整子視圖位置時坯钦,需要調(diào)用。
反過來的意思就是說:如果你想要在外部設(shè)置subviews的位置侈玄,就不要重寫婉刀。
刷新子對象布局
-layoutSubviews方法:
這個方法,默認(rèn)沒有做任何事情序仙,需要子類進(jìn)行重寫
-setNeedsLayout方法:
標(biāo)記為需要重新布局突颊,異步調(diào)用layoutIfNeeded刷新布局,
不立即刷新潘悼,但layoutSubviews一定會被調(diào)用
-layoutIfNeeded方法:
如果有需要刷新的標(biāo)記律秃,立即調(diào)用layoutSubviews進(jìn)行布局
(如果沒有標(biāo)記,不會調(diào)用layoutSubviews)
如果要立即刷新治唤,要先調(diào)用[view setNeedsLayout]棒动,把標(biāo)記設(shè)為需要布局,然后馬上調(diào)用[view layoutIfNeeded]宾添,實現(xiàn)布局
在視圖第一次顯示之前船惨,標(biāo)記總是“需要刷新”的,可以直接調(diào)用[view layoutIfNeeded]
從5可以看出辞槐,旋轉(zhuǎn)會調(diào)layoutSubviews掷漱,
所以,需要重寫方法榄檬,在旋轉(zhuǎn)的時候進(jìn)入處理代碼:
- (void)layoutSubviews {
[super layoutSubviews];
//屏幕的整個空間
CGRect rect = [UIScreen mainScreen].bounds;
self.frame = rect;
//從父視圖的view中取出子視圖OpenGL的view
UIView *openglView = [self viewWithTag:11001];
if (openglView) {
openglView.frame = rect;
}
}
注:[UIScreen mainScreen].bounds方法卜范,
在不同iPhone設(shè)備各個屏幕分辨率:
4/4S : 320*480 1.5
5/5S : 320*568 568/320 = 1.775
6 : 750*1334 1.77866667
6+ : 1080*1920 1.77777778
16/9 = 1.77777778
所以可能會有黑邊
另外,如果橫豎屏切換的時候鹿榜,可能Fit和Fill模式需要動態(tài)變化海雪,
這時候就要在ijk SDL模塊取修改opengl的渲染了锦爵。
防止屏幕黑邊的辦法:正常的豎屏直播用fill,豎屏不做旋轉(zhuǎn)奥裸。
如果是寬大于高的源险掀,用fit模式。
IJKSDLGLView.m
- (id) initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
_tryLockErrorCount = 0;
self.glActiveLock = [[NSRecursiveLock alloc] init];
_registeredNotifications = [[NSMutableArray alloc] init];
[self registerApplicationObservers];
[self registerApplicationObservers];
_didSetupGL = NO;
+ //gongjia modify. refresh for fit/fill mode
+ //[self setupGLOnce];
}
return self;
}
- (void)display: (SDL_VoutOverlay *) overlay
{
if (overlay == NULL)
return;
+ if (overlay->w > overlay->h) {
+ [self setContentMode:UIViewContentModeScaleAspectFit];
+ }
if (![self setupGLOnce])
return;
......
添加自適應(yīng)模式代碼:
self.view.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;
self.view.frame = aview.bounds;
aview.autoresizesSubviews = YES;