2016-10-13 5 views
9

Я пытаюсь использовать MPMoviePlayerController как встроенный видеоплеер, но я вижу проблему, когда значок в полноэкранном режиме был изменен в iOS 10?Почему значок полноэкранного значка MPMoviePlayerController изменился на значок подписи в iOS 10?

Есть ли какое-либо решение, чтобы изменить его на оригинальную полноэкранную кнопку?

Спасибо,

Это то, что это выглядит как в прошивке 8 и прошивке 9:

This is what it look like in iOS 8 and iOS 9

Это то, что она выглядит в прошивке 10:

This is what it look like in iOS 10

+0

Вы нашли какое-либо решение этой проблемы? – Jasmit

+0

Нет, я заканчиваю обновление нашей цели до ios 9 и вместо этого переключился на использование AVPlayer. –

ответ

2

Вот какой код обходной ошибки IOS 10, которую вы можете записать в файле WorkaroundInlinePlayerFullScreenButtonBug.m:

@import MediaPlayer; 
@import ObjectiveC; 

static void (*configureAuxiliaryButtonsIMP)(id, SEL, BOOL); 

static void ConfigureAuxiliaryButtons(id self, SEL _cmd, BOOL flag) 
{ 
    configureAuxiliaryButtonsIMP(self, _cmd, flag); 
    @try 
    { 
     id delegate = [self delegate]; // Either nil or MPInlineVideoController (responds to `isFullscreen`) or MPInlineVideoFullscreenViewController (does not respond to `isFullscreen`) 
     BOOL isFullscreen = [delegate respondsToSelector:@selector(isFullscreen)] ? [delegate isFullscreen] : YES; 
     NSString *imageName = [@[ @"Video", @"Player", @"_", isFullscreen ? @"Exit" : @"Enter", @"Fullscreen" ] componentsJoinedByString:@""]; 
     SEL imageNamedForControlState = NSSelectorFromString([@[ @"_", @"image", @"Named", @":", @"for", @"Control", @"State", @":" ] componentsJoinedByString:@""]); 
     UIImage *normalImage = ((UIImage *(*)(id, SEL, NSString *, UIControlState))objc_msgSend)(self, imageNamedForControlState, imageName, UIControlStateNormal); 
     UIImage *highlightedImage = ((UIImage *(*)(id, SEL, NSString *, UIControlState))objc_msgSend)(self, imageNamedForControlState, imageName, UIControlStateHighlighted); 
     UIButton *fullscreenButton = [self valueForKey:[@[ @"fullscreen", @"Button" ] componentsJoinedByString:@""]]; 
     [fullscreenButton setImage:normalImage forState:UIControlStateNormal]; 
     [fullscreenButton setImage:highlightedImage forState:UIControlStateHighlighted]; 
    } 
    @catch (NSException *exception) 
    { 
     NSLog(@"Failed to workaround inline player fullscreen button bug: %@", exception); 
    } 
} 

void WorkaroundInlinePlayerFullScreenButtonBug(void) 
{ 
    if (![NSProcessInfo.processInfo isOperatingSystemAtLeastVersion:(NSOperatingSystemVersion){10, 0, 0}]) 
     return; 

    Class MPVideoPlaybackOverlayView = NSClassFromString([@[ @"M", @"P", @"Video", @"Playback", @"Overlay", @"View" ] componentsJoinedByString:@""]); 
    SEL configureAuxiliaryButtonsSEL = NSSelectorFromString([@[ @"_", @"configure", @"Auxiliary", @"Buttons", @":" ] componentsJoinedByString:@""]); 
    NSMethodSignature *methodSignature = [MPVideoPlaybackOverlayView instanceMethodSignatureForSelector:configureAuxiliaryButtonsSEL]; 
    if (methodSignature.numberOfArguments != 3) 
    { 
     NSLog(@"Failed to workaround inline player fullscreen button bug (method not found)"); 
     return; 
    } 

    const char *returnType = methodSignature.methodReturnType; 
    const char *argType = [methodSignature getArgumentTypeAtIndex:2]; 
    if (strcmp(returnType, @encode(void)) != 0 || strcmp(argType, @encode(BOOL)) != 0) 
    { 
     NSLog(@"Failed to workaround inline player fullscreen button bug (type mismatch)"); 
     return; 
    } 

    Method configureAuxiliaryButtons = class_getInstanceMethod(MPVideoPlaybackOverlayView, configureAuxiliaryButtonsSEL); 
    configureAuxiliaryButtonsIMP = (__typeof__(configureAuxiliaryButtonsIMP))method_getImplementation(configureAuxiliaryButtons); 
    method_setImplementation(configureAuxiliaryButtons, (IMP)ConfigureAuxiliaryButtons); 
} 

Затем обновите ваш файл main.m для вызова функции WorkaroundInlinePlayerFullScreenButtonBug перед запуском UIApplicationMain fcuntion:

#import "AppDelegate.h" 

extern void WorkaroundInlinePlayerFullScreenButtonBug(void); 

int main(int argc, char *argv[]) 
{ 
    @autoreleasepool 
    { 
     WorkaroundInlinePlayerFullScreenButtonBug(); 
     return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 
    } 
} 
+0

Можете ли вы рассказать мне, как реализовать это решение в проекте Swift, где нет файла main.m? У меня такая же проблема с иконкой, и ваше единственное решение, которое я нашел для этого. –