web-dev-qa-db-fra.com

Charger une image à partir du bundle de ressources CocoaPods

Je crée une bibliothèque privée qui inclut des ressources référencées par des composants de la bibliothèque. La bibliothèque est partagée avec les applications utilisant CocoaPods. Dans le .podspec pour la bibliothèque, j'ai inclus une ligne comme celle-ci:

s.resource_bundles = {'IXMapKitResources' => ['IXMapKit/Resources/*']}

L'une des ressources de l'ensemble est un catalogue d'actifs avec plusieurs ensembles d'images, dont l'un s'appelle 'IXMKAnnotationIcons-Normal-Accident'. Le code suivant renvoie un zéro:

UIImage * image = [UIImage imageNamed: @"IXMKAnnotationIcons-Normal-Accident"];

J'ai trouvé un article sur mokacoding.com décrivant comment charger des polices depuis un pod, mais cela ne fonctionnait pas pour moi:

- (UIImage *) ixmk_imageNamed: (NSString *) name
{
    NSString * IXMKResourceBundleName = @"IXMapKitResources.bundle";
    NSString * resourceName = [NSString stringWithFormat: @"%@/%@", IXMKResourceBundleName, name];

    NSString * imageTypeString = [self ixmk_stringForImageType: imageType];
    NSURL * url = [[NSBundle mainBundle] URLForResource: resourceName withExtension: imageTypeString];

    NSData * imageData = [NSData dataWithContentsOfURL: url];
    if (imageData != nil)
    {
        CGDataProviderRef provider = CGDataProviderCreateWithCFData((CFDataRef) imageData);
        CGImageRef imageRef = [self ixmk_imageFromDataProvider: provider imageType: imageType];

        UIImage * image = [UIImage imageWithCGImage: imageRef];

        CFRelease(imageRef);
        CFRelease(provider);

        return image;
    }
    else
    {
        return nil;
    }
}

La page Web CocoaPods décrivant le mot-clé resources présente l’avertissement suivant:

Nous recommandons fortement aux recommandons développeurs de bibliothèques d'adopter des ensembles de ressources sous la forme Il peut y avoir des conflits de noms à l'aide de l'attribut resources. De plus, les ressources Spécifiées avec cet attribut sont copiées directement dans la cible client Et ne sont donc pas optimisées par Xcode.

Je ne sais plus quoi faire ici.

19
David Potter

Cela s'avère être un problème avec les catalogues d'actifs, pas avec CocoaPods ou les bundles. Déplacer les images du catalogue d'actifs a résolu le problème. Il semble qu'Apple ne prenne pas en charge les catalogues d'actifs dans les ensembles de ressources secondaires. Pitié.

11
David Potter

Par exemple Paramount

podspec

s.resource_bundle = {
    'Paramount' => ['Sources/Paramount.bundle/*.png']
}

Swift

public extension UIImage {
  static func make(name: String) -> UIImage? {
    let bundle = NSBundle(forClass: Paramount.Toolbar.self)
    return UIImage(named: "Paramount.bundle/\(name)", inBundle: bundle, compatibleWithTraitCollection: nil)
  }
}

Ici Paramount.Toolbar.self peut être n'importe quelle classe dans ce framework

5
onmyway133

La solution évidente qui n’était répertoriée nulle part consiste à utiliser le paquetage généré par Cocoapods (dont le dossier n’existe pas en réalité) en tant que NSBundle:

essayez: http://blog.flaviocaetano.com/post/cocoapods-and-resource_bundles/

ça a fonctionné pour moi !!

3
plusmancn

Quant à moi, je devais ajouter le "s.resources" dans le .podspec. Avant cela manquait. 

Seuls les s.resource_bundles ont été définis de cette manière: 'BPPicker/Assets /. ', l'a également remplacé par "BPPicker/Assets/*".

#
# Be sure to run `pod lib lint BPPicker.podspec' to ensure this is a
# valid spec before submitting.
#
# Any lines starting with a # are optional, but their use is encouraged
# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html
#

Pod::Spec.new do |s|
  s.name             = 'BPPicker'
  s.version          = '0.1.11'
  s.summary          = 'This is the imito Body Part Picker.'

# This description is used to generate tags and improve search results.
#   * Think: What does it do? Why did you write it? What is the focus?
#   * Try to keep it short, snappy and to the point.
#   * Write the description between the DESC delimiters below.
#   * Finally, don't worry about the indent, CocoaPods strips it!

  s.description      = <<-DESC
TODO: Add long description of the pod here.
                       DESC

  s.homepage         = 'https://bitbucket.org/imito/bppicker'
  # s.screenshots     = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2'
  s.license          = { :type => 'MIT', :file => 'LICENSE' }
  s.author           = { 'Ievgen Naloiko' => '[email protected]' }
  s.source           = { :git => 'https://[email protected]/imito/bppicker.git', :tag => s.version.to_s }
  # s.social_media_url = 'https://Twitter.com/<Twitter_USERNAME>'

  s.ios.deployment_target = '9.0'

  s.source_files = 'BPPicker/Classes/**/*'

  s.resource_bundles = {
    'BPPicker' => ['BPPicker/Assets/*']
  }
    s.resources = "BPPicker/**/*.{png,json}"

    s.frameworks = 'UIKit'
    s.dependency 'ObjectMapper'
end
2
Naloiko Eugene

Cette réponse fonctionne avec Swift3 et Swift4 .

Créez une fonction sous le répertoire pod dans le fichier. 

func loadImageBundle(named imageName:String) -> UIImage? {
    let podBundle = Bundle(for: self.classForCoder)
    if let bundleURL = podBundle.url(forResource: "Update with directory name", withExtension: "bundle")
    {
        let imageBundel = Bundle(url:bundleURL )
        let image = UIImage(named: imageName, in: imageBundel, compatibleWith: nil)
        return image
    }
    return nil
}

Usage

imageView.image = loadImageBundle(named: "imagefile")
0
Durul Dalkanat

J'ai créé un module qui peut localiser les groupes de ressources dans des groupes. J'espère que le problème du "groupe de ressources CocoaPods" sera résolu une fois pour toutes.

https://github.com/haifengkao/PodAsset

0
Hai Feng Kao