ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Swift] 라이브러리 내부 이미지 관련 오류
    개발/Swift 2022. 8. 25. 16:32

    라이브러리 이미지 관련 오류

    두개의 어플리케이션에 중복적으로 사용되는 view 들이 많아

    중복되는 view와 관련해 라이브러리를 만들어

    두 어플리케이션에서 사용하기로 했다.

     

    그렇게 라이브러리화 작업을 끝낸후

    기존 프로젝트에서 이제 더이상 사용하지 않을

    image 파일들을 모두 제거하자

     

    image를 찾지 못하는 문제가 생겼다.

    그렇다고 image를 다시 넣는것도 문제였다.

    다시 넣는다면 App(현재 프로젝트)와 라이브러리에서 모두 image 파일을 가지고있기 떄문이다.

     

    해결은 Bundle을 통해 가능했다.

    button.setImage(UIImage(named: "buttonImage"), for: .normal)
    

    보통 이렇게 이미지를 사용한다.

     

    이런경우 프로젝트 에서는 프로젝트 의 리소스를 보고

    buttonImage가 없으면 nil을 뱉는다.

     

    위의 코드가 라이브러리 내부에 있더라도

    프로젝트에서는 라이브러리 내부 리소스가 아닌

    프로젝트 리소스를 탐색하여 생기는 문제였다.

     

    그래서 라이브러리 내부 리소스를 탐색하도록 해야한다.

     

    라이브러리 podspec 에서 리소스를 포함시키기위해 이 코드를 넣었을것이다.

    많약 없다면 추가하도록 한다. (LMK는 내가 지정한 이름이다)

    s.resource_bundles = {
         'LMK' => ['LMK/Assets/Resources/*.{xcassets}']
       }
    

    이제 “LMK” 를 가지고 번들을 만들것이다.

    class MyBundle {
        static let resourceBundle: Bundle = {
            let myBundle = Bundle(for: MyBundle.self)
    
            guard let resourceBundleURL = myBundle.url(
                forResource: "LMK", withExtension: "bundle")
                else { fatalError("LMK.bundle not found!") }
    
            guard let resourceBundle = Bundle(url: resourceBundleURL)
                else { fatalError("Cannot access LMK.bundle!") }
    
            return resourceBundle
        }()
    }
    

    이제 MyBundle.resourceBundle 을 통해 라이브러리에 있는 이미지에 접근가능하다.

    라이브러리에서 이미지를 사용할떄 이제 번들을 통해 사용해주면 된다.

    let image = UIImage(named: "buttonImage", in: MyBundle.resourceBundle, compatibleWith: nil)
    

    위와같이 불러주어 사용하면 해당 라이브러리(이미지)를 사용중인 앱에서도

    이미지가 문제없이 불러와진다.

    나는 uiimage extension을 활용해 쉽게사용했다.

    extension UIImage {
        
        static func getImage(named: String) -> UIImage? {
            let image = UIImage(named: named, in: MyBundle.resourceBundle, compatibleWith: nil)
            return image
        }
    }
    
    button.setImage(UIImage.getImage(named: "buttonImage"), for: .normal)
    

    댓글

Designed by Tistory.