2010-08-09 5 views
2

개념을 개발하고 있습니다. 수동으로 XIB 파일을로드하고 클래스 및 인스턴스 메서드를 사용하여 swizzling을 호출해야합니다. imageCustomNamed, imageCustomWithContentsOfFile에 대한 호출을 가로 챌 수있었습니다. 및 UIImage 클래스에 대한 imageCustomWithCGImage 및 UIImageView에 대한 initCustomWithImage. 내가하고 싶은 것은 이미지 이름을 감지하고 디자인 타임에 IB에 설정된 이미지 대신 해당 이미지를 일부 내용으로 대체하는 것입니다. 예를 들어UIImage (s) from XIB at runtime 런타임에서

:

XIB는 이미지 속성을 "About.png"로 설정되어, 나는 그 이미지의로드를 차단하고 특정 조건에 따라 다른 것으로 교체해야있는 UIImageView 개체가 있습니다. UIImageView 객체가 디자인 타임에 이미지 세트를로드 한 후에도 이미지를 바꿀 수는 있지만 UIImageView의 내용을 설정하는 데 사용 된 UIImage의 원래 이름이 아무 곳에도 저장되지 않은 것처럼 보입니다.

내가 전에 XIB 파일의 내용을 모르기 때문에 나는 IBOutlets를 사용할 수 없다. 이 클래스는 특정 XIB가 아닌 모든 XIB에서 작동해야하는 클래스입니다.

사용자 정의 메소드는 실제로 기본 메소드의 위치에 호출되지만 XIb를로드 할 때 시스템은 인수로 CGImageRef를 허용하는 imageCustomWithCGImage를 사용합니다. 거기에서 원점 (즉, 이미지 파일 이름)을 알 수있는 방법이 없습니다.

이미지 로딩을 가로채는 방법에 대한 아이디어가 있습니까?

답변

1

OS 3에서는 적어도 UIImageNibPlaceholder의 initWithCoder :를 재정의 할 수 있습니다.

-(id)hack_UIImageNibPlaceholder_initWithCoder:(NSCoder*)coder 
{ 
    NSString * name = [coder decodeObjectForKey:@"UIResourceName"]; 
    [self release]; 
    return [[UIImage imageNamed:name] retain]; 
} 

다른 번들 (예 : 프레임 워크)에서 펜촉을로드하면 어떻게되는지 잘 모르겠습니다.

+0

나는 그것에 대해 생각했지만 개인 물건의 일부이므로, 아니요 아니야. – user415080

+0

그것은 모두 "사적인 물건"입니다. + [UIImage imageNamed :]를 대체 할 수 있다고 보장 할 수는 없으며 OS 업데이트에서 계속 작동 할 것으로 예상됩니다. 때로는 유일한 방법입니다. –

+0

검토에 실패 할 것이라고 생각하십니까? + [UIImage imageNamed :]를 대체 할 수는 없겠지만 접두사가 붙은 밑줄 붙은 메소드를 대체하지 않더라도 private API입니다. – nbransby

0

아마도 xib 파일에서 UIImageView의 다른 속성을 설정 한 다음 해당 속성을 참조 할 수 있습니까? 예를 들어 라벨이나 태그는 ...