Вопрос по uiimageview, frameworks, ios, xib – IOS Static Framework с ресурсами внутри

19

Я пытаюсь создать фреймворк, в котором хранится некоторый общий код, который я использую в своих проектах. Я нашел онлайн-учебники и сумел создать фреймворк, но у меня все еще есть одна проблема, связанная с ресурсами (XIB, изображения и т. Д.).

Допустим, у меня естьMainViewController.xib который имеетUIImageView используяtest.png, Все это в моем пакете.

Когда я использую фреймворк в другом проекте, я добавляю его в раздел «Копировать ресурсы комплекта». фаза сборки. Проблема в том, что XIB доступен только с помощью пути, какdummy.framework/Resources/MainViewController.xib иUIImageView внутри не может загрузитьtest.png.

Похоже, что UIImageView попытается загрузить png из корня пакета, а не из соответствующей папки, где также хранится xib.

Кому-нибудь удалось создать фреймворк с кодом и ресурсами и использовать его в другом проекте?

Привет, Андрей, подскажите, пожалуйста, как вы добавляете файл .bundle в каталог фреймворков ... Я не могу этого сделать. в моем сценарии оболочки может быть какая-то ошибка. Apple

Ваш Ответ

7   ответов
5

Я больше не управляю фреймворками вручную, но использую ирекомендую CocoaPods вместо.


Original answer:

  1. Use the fake framework @wattson12 mentioned. It will compile and save the resources as well.
  2. Inspired by this script, add this to your target to copy the resources to your app:

    SOURCE_PATH="${TARGET_BUILD_DIR}/MYFramework.framework/Resources/"
    TARGET_PATH="${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/MYFrameworkResources.bundle"
    mkdir -p $TARGET_PATH
    cp -R $SOURCE_PATH $TARGET_PATH
    

Вы также можете просто перетащить инфраструктуру на шаг копирования ресурсов, но затем вы также добавите ненужные заголовки и скомпилированный код.

Edit

Чтобы использовать эти ресурсы из IB, например, файл png, замените:

MyImage

от:

MYFrameworkResources.bundle/MyImage.png

Он будет предварительно просматривать значок разбитого изображения, но будет работать при запуске.

Загрузите перо из кода:

[NSBundle loadNibNamed:@"MYFrameworkResources.bundle/MyNib" ...

Наконец, вы можете добавить эти методы в категорию NSBundle, чтобы упростить доступ к ресурсам Nib, которые могут быть в вашем основном комплекте или в MYFrameworkResources.bundle:

@implementation NSBundle (MyCategory)

+ (NSString *)pathForResource:(NSString *)name
                       ofType:(NSString *)extension
{
   , // First try with the main bundle
    NSBundle * mainBundle = [NSBundle mainBundle];
    NSString * path = [mainBundle pathForResource:name
                                           ofType:extension];
    if (path)
    {
        return path;
    }

    // Otherwise try with other bundles
    NSBundle * bundle;
    for (NSString * bundlePath in [mainBundle pathsForResourcesOfType:@"bundle"
                                                          inDirectory:nil])
    {
        bundle = [NSBundle bundleWithPath:bundlePath];
        path = [bundle pathForResource:name
                                ofType:extension];
        if (path)
        {
            return path;
        }
    }

    NSLog(@"No path found for: %@ (.%@)", name, extension);
    return nil;
}

+ (NSArray *)loadNibNamed:(NSString *)name
                    owner:(id)owner
                  options:(NSDictionary *)options
{
    // First try with the main bundle
    NSBundle * mainBundle = [NSBundle mainBundle];
    if ([mainBundle pathForResource:name
                             ofType:@"nib"])
    {
        NSLog(@"Loaded Nib named: '%@' from mainBundle", name);
        return [mainBundle loadNibNamed:name
                                  owner:owner
                                options:options];
    }

    // Otherwise try with other bundles
    NSBundle * bundle;
    for (NSString * bundlePath in [mainBundle pathsForResourcesOfType:@"bundle"
                                                          inDirectory:nil])
    {
        bundle = [NSBundle bundleWithPath:bundlePath];
        if ([bundle pathForResource:name
                             ofType:@"nib"])
        {
            NSLog(@"Loaded Nib named: '%@' from bundle: '%@' ", name, bundle.bundleIdentifier);
            return [bundle loadNibNamed:name
                                  owner:owner
                                options:options];
        }
    }

    NSLog(@"Couldn't load Nib named: %@", name);
    return nil;
}

@end

Сначала он изучит ваш пакет приложений, а затем - MYFrameworkResources.bundle и т. Д.

Спасибо, но разработчик интерфейса по-прежнему не может правильно определить ресурсы Andrei Stanescu
У вас проблемы с изображениями? (достаточно предварения пути) или с помощью перьев? Вы также можете проверить каталог сборки, чтобы увидеть, куда копируются ресурсы внутри вашего приложения.
7

Я создал целевой объект фреймворка и для доступа к изображениям внутри его каталога ресурсов сделал следующее:

UIImage *img = [UIImage imageNamed:@"IMAGE_NAME_HERE" inBundle:[NSBundle bundleForClass:[self class]] compatibleWithTraitCollection:[UITraitCollection traitCollectionWithDisplayScale:[UIScreen mainScreen].scale]];
Большое спасибо, вы потратили много времени, пытаясь найти решение для этого. и этот работал :)
Это для динамических структур, но не для статических, так как для статических.bundleForClass:self.class возвращает основной пакет приложения.
-1

Начиная с Xcode 7 теперь мы можем использовать каталоги активов. В своих экспериментах я обнаружил, что вы можете ссылаться на файлы в одной и той же рабочей области в разных проектах, что устраняет необходимость микроуправления активами на этапах сборки или беспокоит цели.

Этот ответ не имеет отношения к вопросу
1

Чтобы загрузить изображение из динамического каркаса вSwift 3:

UIImage(named: "name", in: Bundle(for: type(of: self)), compatibleWith: nil)

Работает отлично. Каков был мой сценарий, я использовал свою пользовательскую среду с активами, но не смог использовать изображения ресурсов. Но это сработало для меня
14

Я знаю, что это старая ветка, но чтобы помешать новым людям совершать те же ошибки, вот примечание:

Начиная с Xcode 6 и iOS8, у Apple есть полностью поддерживаемое встроенное решение Dynamic Framework. Для получения дополнительной информации смотрите здесь:https://developer.apple.com/library/ios/documentation/DeveloperTools/Conceptual/WhatsNewXcode/Articles/xcode_6_0.html#//apple_ref/doc/uid/TP40014509-SW14

Но если коротко, создайте новый проект и выберите шаблон Cocoa Touch Framework.

Вам не нужно дурачиться с созданием связки или чего-то еще. Платформа Xcode обрабатывает это для вас. Но вы должны загрузить их из этого пакета по умолчанию. Я считаю полезным создать категорию NSBundle с ярлыком для категории фреймворков.
Все хорошо, но удалось ли вам включить ресурсы изображений в Dynamic Framework, созданный в Xcode 6. Я сам все пробовал, но не могу заставить его работать! Кажется, очень мало документации от Apple на это.
Да. это было довольно просто, но, возможно, не очевидно. Просто включите ваши изображения в ваш фреймворк как обычно, но чтобы загрузить их, вам нужно сослаться на пакет вашего фреймворка. Так[NSBundle bundleWithIdentifier:@"com.<#company#>.<#framework#>"];
Да, это работает сimageNamed:inBundle:compatibleWithTraitCollection, Отправка inBundle:[NSBundle bundleWithClass[self class]] или что-либо подходящее, учитывая то, где я использую изображение.
Кроме того, что касается будущих проблем, у вас будет большой успех в поиске справки и документации, если вы будете искать платформы Mac или платформы Cocoa Touch. Они - новички для нас, разработчиков для iOS, но они не новы для мира. Было много хорошей документации по Mac, которая выровнялась, и вот как я узнал, что они создают свой собственный пакет.
1

Короткий ответ: вы не можете.

Когда вы компилируете приложение, пакет генерируется с использованием ресурсов & quot; main & quot; проект, игнорируя ресурсы в связанных рамках. Это включает в себя изображения, xib, plist и т. Д. (Все, что не является исходным файлом)

Что вам нужно сделать, так это добавить эти ресурсы в ваш основной проект, чтобы они были доступны для использования внутри вашего приложения, причем не самым удачным образом, но это сработает.

@doozMen Хотите объяснить, как?
Это самый близкий ответ к реальным фактам. Однако вы можете заставить xcode копировать ресурсы из фреймворка, но они будут помещены в подпапку в основном комплекте. Это делает загрузку их болью в задницу. Andrei Stanescu
Ну, ресурсы скопированы, но в подпапке. Andrei Stanescu
Вы можете сделать это сейчас
1

Базовые структуры не включают большинство видов ресурсов, включая использование ресурсов.это "подделка" каркасная библиотека

В итоге вы получите папку .embeddedframework, которая содержит реальную платформу, но также включает в себя любые ресурсы, которые вы добавляете на этапе сборки Copy Bundle Resources. Я использовал его, чтобы включить XIB, основные модели данных, изображения и списки

Да, но если у вас есть (в структуре) XIB, который использует ресурс, который также находится в структуре (скажем, изображение). Сможете ли вы загрузить XIB в тестовое приложение? Andrei Stanescu
Я пришел к выводу, что то, чего я хочу достичь, на самом деле невозможно. Из-за неспособности Интерфейсного Разработчика отображать изображения, которые находятся во вложенных папках (хотя они работают во время выполнения), действительно невозможно доставить какие-либо ресурсы в форме пакета. Лучшим способом было бы просто добавить zip вместе со статической библиотекой, и пользователь может использовать эту папку в своем проекте. Andrei Stanescu
Вы можете ссылаться на ресурсы, вложенные во вложенные папки из IB, добавив путь: MyResources.bundle / image.png. Он не будет хорошо выглядеть внутри IB, но будет работать
У меня нет этого проекта передо мной, но я уверен, что все будет в порядке, попробуй ...

Похожие вопросы