2013-05-10 3 views
2

나는 stretchable 컨트롤을 그리기 위해 NSDrawNinePartImage()을 사용하고 있습니다. 물론이 부분은 9 개의 별도 이미지가 필요하고 그 위에 그려지는 일부 추가 이미지가 필요하기 때문에 top-left.png[email protected]과 같은 파일로 가득 찬 디렉토리가 있습니다. 내 디렉토리 번들을 폴더 참조로 포함시킨다.하위 디렉토리에서 망막 이미지로드

불행히도 -[NSImage imageNamed:]-[NSBundle imageForResource:]과 같은 일반적인 이미지로드 API는 이름에 슬래시를 추가하더라도 하위 디렉토리를 지원하지 않는 것 같습니다. 대신에, 나는이 방법으로 이미지를로드 해요 :

- (NSImage*)popoverImage:(NSString*)name { 
    NSURL * url = [[NSBundle bundleForClass:self.class] URLForResource:name withExtension:@"png" subdirectory:@"popover"]; 
    return [[NSImage alloc] initWithContentsOfURL:url]; 
} 

이것은 정상적인 디스플레이 잘 작동하지만 그것은 망막 디스플레이의 2 배 이미지를 무시합니다. 망막 이미지를로드하려면 어떻게해야합니까? 별도로 두 담당자를로드하고 손으로 결합하는 것보다 나은 방법이 있습니까? 나는 이미지 파일 편집기로 도토리를 사용하고 마지막으로 확인했을 때 그와 같은 복합 이미지 형식을 실제로 이해하지 못하기 때문에 이러한 리소스에 대한 소스 파일로 TIFF를 사용하지 않을 것입니다.

답변

0

글 머리 기호를 물어 뜯고 런타임에 수동으로 이미지를 결합했습니다.

NSArray *paths = [NSBundle.mainBundle pathsForResourcesOfType: @"icns" inDirectory: @"Collections/1"]; 

for (NSString *path in paths) { 
    NSString *fileName = [[path lastPathComponent] stringByDeletingPathExtension]; 
    NSImage *image = [[NSImage alloc] initWithContentsOfFile: path]; 
    image.name = fileName; 
    [iconCollectionController addObject: @{@"icon": image}]; 
} 

을 CRD 이미 지적하지만 당신이 필요합니다

- (id)initRetinaImageWithContentsOfURL:(NSURL *)url { 
    if((self = [self initWithContentsOfURL:url])) { 
     NSURL * baseURL = url.URLByDeletingLastPathComponent; 
     NSString * baseName = url.lastPathComponent.stringByDeletingPathExtension; 
     NSString * extension = url.lastPathComponent.pathExtension; 

     NSString * retinaBaseName = [NSString stringWithFormat:@"%@@2x", baseName]; 
     NSURL * retinaURL = [baseURL URLByAppendingPathComponent:[retinaBaseName stringByAppendingPathExtension:extension]]; 

     if([retinaURL checkResourceIsReachableAndReturnError:NULL]) { 
      NSData * data = [[NSData alloc] initWithContentsOfURL:retinaURL]; 
      NSBitmapImageRep * rep = [[NSBitmapImageRep alloc] initWithData:data]; 

      rep.size = self.size; 
      [self addRepresentation:rep]; 
     } 
    } 

    return self; 
} 
0

간단한 답은 TIFF를 사용하는 것입니다. 우려는 잘못 배치 된 것입니다. Xcode에서 프로젝트 환경 설정 "고해상도 아트웍 결합"을 설정하고 이제 도토리로 두 개의 PNG를 계속 만듭니다. 빌드하는 동안 Xcode는이 두 PNG를 단일 TIFF로 결합하여 해당 번들에 저장합니다.

+0

"고해상도 아트웍 결합"은 폴더 참조에 영향을 미치지 않는 것 같습니다. 어떻게 해결할 수 있을지 생각해? –

+0

@ BrentRoyal-Gordon - 죄송 합니다만, 나는 당신에게 최고의 대답을 모르겠습니다. 살펴볼 사항은 다음과 같습니다. 폴더가 아닌 파일 포함 (여전히 도토리로 편집 가능). 빌드 단계 스크립트를 사용하여 파일을 결합 및 복사합니다. 중첩 된 번들을 사용하여 (번들 하위 프로젝트를 추가하고, 이미지를 넣고, 번들을 빌드하고 복사하도록합니다. 잔인한 소리가 들리 겠지만 번들은 단지 폴더입니다. Xcode에서 폴더를 생성하는 방법 일뿐입니다). HTH – CRD

0

이 내가 할 것입니다 : 나는 NSImage의 범주에이 방법을 추가하고 -initWithContentsOfURL:의 장소에 사용하여 이렇게했다 (tiff 또는 icns 파일로) 아트웍을 결합합니다. 그러나 이미지 해상도를 수동으로 선택하지 않아도됩니다 (또한 백킹 스토어 변경 사항을 청취해야합니다).