2017-04-07 5 views
1

최근에 우리의 응용 프로그램은 이미지 가져 오기 로직에서 클라이언트가 크기 (이미지가 서버에서 동적으로 빌드 됨)를 요청해야하는 등 교체가 필요합니다.iOS 크기를 지정하는 URL에서 이미지로드

이미지 URL의 형식은 다음과 같습니다 사용자 정의보기의 대부분은 다음과 같은 패턴으로 내장되어 http://image.server.url/path?width={{width}}&height={{height}}

:

- (instancetype)initWithFrame:(CGRect)frame 
{ 
    if (self = [super initWithFrame:frame]) { 
     // do some initializations 
    } 
    return self; 
} 

- (void)setImageURL:(NSURL *)URL { 
    // do image fetching 
} 

그리고는 다음과 같이 인스턴스화 :

SomeView *view = [[SomeView alloc] init]; 
view.imageURL = [NSURL URLWithString:@"..."]; 
[self addSubview:view]; 

이 (모든 이미지의 크기가 정적이기 때문에) 문제가 아니었지만 동적 크기를 갖는 이미지를 요청하는 것이 불가능할 때 이미지 페치 -layoutSubviews이 호출되기 전에 ng가 실행되면 대상 이미지 컨테이너의 크기는 항상 0입니다.

레이아웃이 완료되면 (이미지 컨테이너의 관찰자를 사용하여) 타이밍을 알아 내야하거나 모든 이미지 컨테이너에 대해 정적 크기를 가져야합니다.

가장 적합한 해결책은 무엇입니까?

+0

최상의 솔루션은 비동기 적으로 네트워크 자산을로드하는 것입니다. 일단 다운로드가 완료되면 UI를 "정말 실제적인 것"으로 업데이트합니다. 실제로 이것은 네트워크 자산이로드되는 동안 애니메이션 진행 그래픽 ("loading! wait!") 또는 자리 표시 자 자산 (실제 그래픽을 가져 오는 동안 저해상도 그래픽)을 표시 함을 의미합니다. – xaphod

답변

0

이미지의 크기를 위 아래로 조정할 수 있으므로 "정확한"이미지 크기가 필요하지 않을 수도 있습니다. 제 생각에는 당신은 이미지의 충분한 크기가 필요합니다. 이미지 크기는 화면 크기 (장치에 의해 결정됨)에 의해 결정되므로 올바른 장치의 올바른 크기를 반환하는 이미지 기능을 준비 할 수 있습니다.

당신은 AB 전면 아이폰 4, 아이폰 5에 대한 크기 .... 알고 다음 xaphod 언급으로 (

제 생각입니다 (컨테이너가 layoutSubviews 후 부하가 될 것이다) 이미지의 정확한 크기를로드 할 수 있습니다) 앱을 다운로드 할 때 모든 크기를로드 한 다음 layoutSubviews에서 올바른 크기를로드합니다. 하지만 많은 크기의 이미지가 많이있는 경우 앱에 배치되지 않는 이미지의 경우 막대한 공간을 소비 할 수 있습니다.

0

크기를 지정하는 URL에서 이미지를로드 또한 iPhone 장치 크기에 따라.

여기 예제를 사용하고 있습니다. 불행하게도, Swift에 있지만 걱정하지 않아도 객관적인 방법으로 기본적인 아이디어를 얻을 수 있습니다. c. 또한, 주요 것들은 장치 크기 이미지 다운로드에 따라하는 것입니다.

클래스

import UIKit 

public class ImageService: NSObject { 

    public enum ImageMode:String { 
      case Uniform = "Uniform" 
      case Zoom = "Zoom" 
      case Pad = "Pad" 

    var description : String { 
     get { 
      return self.rawValue 
     } 
    } 
    } 
    public func buildImageString(imageName:String, imageMode:ImageMode, size:CGSize, scale:CGFloat)-> NSURL{ 
     return NSURL(string: MonsciergeCoreKit.repository().apiRoot + "/v1/Images?imagePath=\(imageName)&mode=\(imageMode.description)&width=\(Int(size.width * scale))&height=\(Int(size.height * scale))")! 
    } 

} 

당신은 당신의 용도에 따라 값을 변경할 수 있습니다

사용을 만듭니다. UIScreen.mainScreen(). 눈금 선은 장치에 따라 이미지 크기를 제공합니다.

let url = ImageService().buildImageString("ImageName", imageMode: .Zoom, size:CGSizeMake(self.view.frame.size.width, headerHeight), scale:UIScreen.mainScreen().scale)