2013-06-04 5 views
9

이미지 뷰의 소스가 속성 관리자에서 미리 설정되어있는 경우,/how가 파일의 실제 경로를 확인할 때 해결됩니까? NSBundle에 대한 호출이없는 것 같지만 잘못된 것일 수 있습니다.UIImageView의 이미지가 Interface Builder에서 설정되면 이미지가 어떻게로드됩니까?

편집 : 나중에 자산을 동적으로 바꿀 수있는 방법은 무엇이든간에 (가능한 경우) swizzle하려고합니다.

enter image description here

+1

를 통해 일부 내부 메커니즘을 통해로드거야? – borrrden

+1

아마 [UIImage imageNamed :]라고 전화할까요? 나는 당신이 그것을 어떻게 무시할 수 있는지 모르겠다. – morningstar

+0

좋은 추측이지만이 방법은 사용하지 않는 것 같습니다. – kasrak

답변

9

없음 UIImage 초기화 프로그램이나 팩토리가 호출 중입니다.
디버거 (iOS Simulator 7.0.3)에서 몇 가지 조사를했고 다음을 찾았습니다.
1) 은 IB에 설정되어 있으며 -initWithCoder:을 통해 초기화됩니다.
2) initWithCoder:에서 decodeObjectForKey: 메서드를 호출합니다. 그리고 UIImage이라는 키 (!)에는 IB의 이미지가 있습니다. 이 이미지는 setImage: 설정기를 통하지 않고 ivar를 통해 UIImageView으로 설정됩니다.
그래서 IB가 컴파일하는 동안 XIB/Storyboard에 원시 이미지 데이터를 압축하는 것처럼 보입니다. 말도 안돼,하지만 사실.

댓글 컴파일 IB 파일의 hexdumping을 표시 PNG로했습니다 이름 내부 : 우리가 +imageNamed:를 스위 즐링 (swizzle) 또는 어떤 다른 공장과

편집 retina4과는 iOS6 설정 이미지 조건부 코드를 사용해야 수없는 이유
는 그입니다. 의 출력을보고 사실

, "Hexdump에서는 -C 바이 츠-38-t0r - 뷰 - 8bC-Xf를-vdC.nib"는 PNG의 파일 이름이 컴파일 된 파일에 나타나는 것을 나타냅니다. 따라서 동일한 번들의 파일 이름을 통해 파일 데이터를로드해야합니다.

그러나, 그들은 여전히 ​​그냥보기 컨트롤러에있는 번들을 기준으로하지 않을까요하지 imageNamed:

+0

예 ... 그래서 imageNamed 같은 일부 메서드를 swizzle 수있는 방법은 무엇입니까? – jerrygdm

+0

당신은 그것을 바꿀 수는 있지만,이 특별한 작업에 대해서는 아무런 이익도 얻지 못할 것입니다. –

+1

"IB는 raw 이미지 데이터를 XIB로 압축합니다"라는 말은 의미가 없습니다. 컴파일 된 스토리 보드를 살펴본 결과 이미지 데이터가 BYZ-38-t0r-view-8bC-Xf-vdC.nib 출력 파일에 인라인되지 않았 음을 알았습니다. 실제로, "hexdump -CYZ-38-t0r-view-8bC-Xf-vdC.nib"출력을 보면 PNG 파일 이름이 컴파일 된 파일에 있음을 나타냅니다. 따라서 동일한 번들의 파일 이름을 통해 파일 데이터를로드해야합니다. – MoDJ

2

아이폰 OS가 자동으로 XIB 파일과 같은 번들 파일 overflow.png 찾습니다. xib 파일이 응용 프로그램의 대상에있는 경우 기본적으로 기본 번들을 찾습니다.

당신은 프로그래밍 방식으로 이미지보기에 새로운 이미지를로드 할 내용과 이미지는 기본 번들 내부에있는 경우 :

UIImage *image = [UIImage imageNamed:@"MyAwesomeImage"]; 
self.imageView.image = image; 

이미지는 다른 번들 내부에있는 경우 :

NSBundle *imageBundle = ... // [NSBundle mainBundle] if your image is inside main bundle 
NSString *imagePath = [imageBundle pathForResource:@"MyAwesomeImage" ofType:@"png"]; 
UIImage *image = [UIImage imageWithContentsOfFile:imagePath]; 
self.imageView.image = image; 
+0

예, 얻을 수있는 메소드가 있습니다 경로? (동기 부여 편집을 참조하십시오.) – kasrak

+0

@kasrak, 이미지의 경로를 원한다면 overflow.png를 원하십니까? 메인 번들에 있습니까? –

+0

나는 내가 아주 분명하다고 생각하지 않는다.스토리 보드/xib에서 런타임을로드 할 때 실제로 런타임이 UIImageView를 초기화하는 방법에 대해 궁금합니다. 이렇게하면 코드를 변경하지 않고도 앱의 이미지를 자동으로 대체 할 수 있습니다. – kasrak