组件化---私有库中的图片和xib

私有库中出现以下情况要注意了

1、加载图片:例如YHTestOne

1》场景:在UIViewController上用纯代码方式添加一个按钮

用[headBtn setImage:[UIImage imageNamed:@"Enterprise_bots_woyaotikuan"] forState:UIControlStateNormal]

给vc的button加载图片时可以的。

2》Enterprise_bots_woyaotikuan.png图片资源要放在与Classes同级的Assets文件夹下。

3》把本地组件工程库的podspec文件的

s.resource_bundles = {

       'YHTestThree' => ['YHTestThree/Assets/*.png']

   }文件打开

注意:很多博客说UIImage imageNamed默认是从mainbundle中加载图片,因为所有需要用相应的bundle来加载图片,亲测这种说法是不对的,用UIImage imageNamed方式加载图片没报错

2、控制器创建时使用xib方式创建,例如YHTestThree

1》场景:在UIViewController上用纯代码方式添加两个按钮,一个直接在xib上给图片,一个按钮拉线给图片

2》将xib文件放在与Classes同级的Assets文件夹下

3》把本地组件工程库的podspec文件的s.resource_bundles改为

s.resource_bundles = {

       'YHTestThree' => ['YHTestThree/Assets/*']

   }

 这是xib写进私有库的一大坑

报错:

-> YHTestThree (0.0.1)

    - WARN  | url: The URL (https://gitee.com/denggun/YHTestThree) is not reachable.

    - NOTE  | xcodebuild:  note: Using new build system

    - NOTE  | [iOS] xcodebuild:  note: Planning build

    - NOTE  | [iOS] xcodebuild:  note: Constructing build description

    - NOTE  | [iOS] xcodebuild:  warning: Skipping code signing because the target does not have an Info.plist file. (in target 'App')

 

Analyzed 1 podspec.

解决:把下图红框的勾去掉即可,即去掉安全区域限制

组件化---私有库中的图片和xib_第1张图片

pod spec lint --allow-warnings 报错

 -> YHTestThree (0.0.1)

    - WARN  | url: The URL (https://gitee.com/denggun/YHTestThree) is not reachable.

    - ERROR | [iOS] xcodebuild: Returned an unsuccessful exit code. You can use `--verbose` for more information.

    - NOTE  | xcodebuild:  note: Using new build system

    - NOTE  | [iOS] xcodebuild:  note: Planning build

    - NOTE  | [iOS] xcodebuild:  note: Constructing build description

    - NOTE  | [iOS] xcodebuild:  warning: Skipping code signing because the target does not have an Info.plist file. (in target 'App')

    - NOTE  | [iOS] xcodebuild:  YHTestThree/YHTestThree/Classes/YHTestThree.xib:Q5M-cg-NOt: error: Safe Area Layout Guide before iOS 9.0 [12]

解决:把podspec文件里的s.ios.deployment_target = '8.0' 改成s.ios.deployment_target = '9.0'即可

 

 YHTestThree *testThree = [[YHTestThree alloc] init];

    [self presentViewController:testThree animated:YES completion:nil];

    方式推出YHTestThree

报错:Warning: Attempt to present on whose view is not in the window hierarchy!

模拟器运行推出来的YHTestThree控制器是黑屏

现在私有库获取YHTestThree.xib不在mainBundle中了,需要到相应的bundle中找此xib。

通过path找bundle:

   NSBundle *bundle = [NSBundle bundleForClass:[YHTestThree class]];

    //在这个路径下找到子bundle的路径

    NSString *path = [bundle pathForResource:@"YHTestThree" ofType:@"bundle"];

    //根据路径拿到子bundle

    NSBundle *bundel = [NSBundle bundleWithPath:path];

    YHTestThree *cc =  [[YHTestThree alloc] initWithNibName:@"YHTestThree" bundle:bundel];

    [self presentViewController:cc animated:YES completion:nil];

按这种做法,运行正常

以上找xib所在bundle的方法,在我用自己的另一个私有库YHTestFour时,并不能正确找到xib的位置。

YHTestFour私有库里包含一个TableViewContraller,这个控制器里的cell是通过xib自定义的。

这个私有库的xib是这样找到:

 NSBundle *bundle = [NSBundle bundleForClass:NSClassFromString(@"YHTestFour")];

NSString *pathpath =  bundle.bundlePath;

NSString *newPath = [NSString stringWithFormat:@"%@/Frameworks/YHTestFour.framework/YHTestFour.bundle",pathpath];

NSBundle *bundel = [NSBundle bundleWithPath:newPath];

[self.tableView registerNib:[UINib nibWithNibName:@"YHTestFourCell" bundle:bundel] forCellReuseIdentifier:@"fourCell"]

这样工程就可以正常运行了。

其实YHTestFour这个找相应bundle的方法是最通用的,根据包的目录结构找到对应的budle路径,找到对应xib

3、如果私有库里有xib,则在用到此xib的工程的Podfile文件里要打开use_frameworks!,否则找不到此xib

注意:以私有库YHTestFour为例,如果YHTestFour已经上传传到远程仓库,工程用到此私有库产生崩溃,例如找不到YHTestFourCell,unlock此私有库并修改代码后直接运行,还是报错,这时候一定要卸载工程并clean工程后再运行。已经pod到工程的私有库,经常出现私有库代码已经修改正确了,但运行依旧报错误(可能是编译或缓存的问题),这时候切记要卸载并clean)

如果,卸载并clean工程后运行成功,要将修改后的代码复制到本地的私有代码工程中,将修改后的版本提交到远程私有库,再重新pod install到工程,再次运行,直到运行成功。


 

 

 

 

你可能感兴趣的:(移动)