Как показать все поддерживаемые разрешения для отображения в приложении Mac - PullRequest
0 голосов
/ 12 апреля 2019

Я хочу показать все совместимые разрешения для экрана, но получаю только несколько разрешений, разрешения, которые я получаю при передаче nil в CGDisplayCopyAllDisplayModes те же разрешения, которые я получаю, даже если я передаю kCGDisplayShowDuplicateLowResolutionModes в kCFBooleanTrue нижеблок, который я использую.

+(NSArray *)menuItemsForCurrentDisplay :(CGDirectDisplayID)display{

    //Get Current mode

    CGDisplayModeRef currentMode = CGDisplayCopyDisplayMode(display);

    // Use a dictionary with title keys to avoid 'duplicates'
    NSMutableDictionary *menuItemsByTitle = [NSMutableDictionary new];

    // Get Number of Supported Displays
//    NSArray* numberOfDisplayModes  =  (__bridge NSArray *)(CGDisplayCopyAllDisplayModes ( display, nil ));

    CFStringRef keys[1] = { kCGDisplayShowDuplicateLowResolutionModes };
    CFBooleanRef values[1] = { kCFBooleanTrue };

    CFDictionaryRef options = CFDictionaryCreate(kCFAllocatorDefault, (const void**) keys, (const void**) values, 1, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks );

    NSArray* numberOfDisplayModes  =  (__bridge NSArray *)CGDisplayCopyAllDisplayModes(display, options);
    for (int i = 0; i < numberOfDisplayModes.count; i++) {

        if (CGDisplayModeIsUsableForDesktopGUI((__bridge CGDisplayModeRef)(numberOfDisplayModes[i]))) {


            DisplayModeMenuItem *menuItem = [[DisplayModeMenuItem alloc] initWithCustomDisplay:display andMode:(__bridge CGDisplayModeRef)(numberOfDisplayModes[i])];
            DisplayModeMenuItem *previousMenuItem = menuItemsByTitle[menuItem.title];

            if (previousMenuItem == nil) {
                if (currentMode == (__bridge CGDisplayModeRef)(numberOfDisplayModes[i])|| previousMenuItem.state == NSOnState) {
                    [menuItem setState:NSOnState];
                }

                menuItemsByTitle[menuItem.title] = menuItem;
            }else if ((__bridge CGDisplayModeRef)(numberOfDisplayModes[i]) == currentMode ){

                [menuItem setState:NSOnState];
            }
        }

    }

     CFRelease(options);
    CGDisplayModeRelease(currentMode);
    NSLog(@"menuItemsByTitle %@",[menuItemsByTitle allValues]);
    return [[menuItemsByTitle allValues] sortedArrayUsingSelector:@selector(customCompare:)];


}
...