it-swarm.com.ru

Загрузить изображение из комплекта ресурсов CocoaPods

Я создаю личную библиотеку, которая включает в себя ресурсы, на которые ссылаются компоненты в библиотеке. Библиотека используется совместно с приложениями, использующими CocoaPods. В .podspec для библиотеки я включил такую ​​строку:

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

Одним из ресурсов в комплекте является каталог ресурсов с несколькими наборами изображений, один из которых называется «IXMKAnnotationIcons-Normal-Accident». Следующий код возвращает ноль:

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

Я нашел статью на mokacoding.com , описывающую, как загружать шрифты из модуля, но у меня это не сработало:

- (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;
    }
}

Веб-страница CocoaPods, описывающая ключевое слово resources , имеет следующее предупреждение:

Мы настоятельно рекомендуем разработчикам библиотек принять пакеты ресурсов как могут быть конфликты имен с использованием атрибута resources. Более того ресурсы, указанные с этим атрибутом, копируются непосредственно в цель клиента и поэтому они не оптимизированы Xcode.

Я в недоумении, что делать здесь.

19
David Potter

Это оказывается проблемой с каталогами активов, а не с CocoaPods или пакетами. Перемещение изображений из каталога активов решило проблему. Похоже, Apple не поддерживает каталоги активов в пакетах вторичных ресурсов. Жалость.

11
David Potter

Например 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)
  }
}

Здесь Paramount.Toolbar.self может быть любым классом в этой структуре

5
onmyway133

Очевидное решение, которое нигде не было указано, - это использование сгенерированного Cocoapods комплекта (которого на самом деле папки нет) в качестве NSBundle:

попробуйте: http://blog.flaviocaetano.com/post/cocoapods-and-resource_bundles/

у меня это сработало !!

3
plusmancn

Что касается меня, мне пришлось добавить «s.resources» в .podspec. До этого не хватало. 

Только s.resource_bundles были установлены таким образом: 'BPPicker/Assets /. ', также изменил его на' 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

Этот ответ работает с Swift3 и Swift4 .

Создайте функцию в каталоге pod в файл. 

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
}

Использование

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

Я создал модуль, который может находить пакеты ресурсов в модулях .. Надеюсь, это раз и навсегда положит конец проблеме "Пакет ресурсов CocoaPods".

https://github.com/haifengkao/PodAsset

0
Hai Feng Kao