1.这里 如果没有中间包的这层allBgView 而是直接把playControlBgView 增加到 self 上 就会出现 self 旋转了 但是 playControlBgView的位置没变
/** 三个大的分类的 view 的父视图 */
-(UIView *)allBgView{
if(!_allBgView){
UIView *allBgView = [[UIView alloc] initWithFrame:self.bounds];
[self addSubview:allBgView];
_allBgView = allBgView;
}
return _allBgView;
}
/** 暂停 声音 进度等控制按钮的背景的 view */
- (DYContainerBgView *)playControlBgView{
if(!_playControlBgView){
DYContainerBgView *playControlBgView = [[DYContainerBgView alloc] init];
playControlBgView.viewLv = DYVideoPlayerViewLv3;
[self.allBgView adjustSubViewsLv:playControlBgView];
_playControlBgView = playControlBgView;
[playControlBgView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.right.top.bottom.equalTo(self.allBgView);
}];
}
return _playControlBgView;
}
/** 旋转切换 frame 和父视图 */
[self removeFromSuperview];
UIView *keyW = [UIApplication sharedApplication].keyWindow;
[keyW addSubview:self];
[[UIDevice currentDevice] setValue:[NSNumber numberWithInteger:UIDeviceOrientationLandscapeLeft] forKey:@"orientation"];
[[UIApplication sharedApplication] setStatusBarOrientation: UIInterfaceOrientationLandscapeRight animated: NO];
[UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleLightContent;
[self updateConstraintsIfNeeded];
[UIView animateWithDuration:0.3 animations:^{
self.transform = CGAffineTransformMakeRotation(M_PI / 2);
self.frame = CGRectMake(0, 0, keyW.width, keyW.height);
self.allBgView.frame = self.bounds;
}completion:^(BOOL finished) {
self.fullScreen = YES;
self.zoomScreenBtn.selected = YES;
[self.gestureRecognizerBgView addGestureRecognizer:self.panGesture];
}];
2.由于播放器的 view 比较多 容易出现视图层级的问题(新增加的视图希望在下层) 这里用到的方法是给每个 view 设置一个 level 然后 调用自定义的addsubview 的方法 从而避免这个为题(这里是给 view 增加一个类别,然后调用类别中的方法)
/** view 的视图层级 */
@property (nonatomic, assign)NSInteger viewLv;
/** 调整视图的层级 */
-(void)adjustSubViewsLv:(UIView *)aView;
/** view 的视图层级的 setter */
-(void)setViewLv:(NSInteger)viewLv{
objc_setAssociatedObject(self, [@"viewLv" UTF8String], @(viewLv), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
/** view 的视图层级的 getter */
- (NSInteger)viewLv{
return [(NSNumber *)objc_getAssociatedObject(self, [@"viewLv" UTF8String]) integerValue];
}
/** 调整视图的层级 */
-(void)adjustSubViewsLv:(UIView *)aView{
/** 排序插入 */
__block UIView *tempView = nil;
[self.subviews enumerateObjectsUsingBlock:^(UIView* obj, NSUInteger idx, BOOL * _Nonnull stop) {
if (obj.viewLv > aView.viewLv) {
tempView = obj;
*stop = YES;
}
}];
tempView ? [self insertSubview:aView belowSubview:tempView] : [self addSubview:aView];
}