diff --git a/FULiveDemo.xcodeproj/project.pbxproj b/FULiveDemo.xcodeproj/project.pbxproj index 0376b0d4..ff362110 100644 --- a/FULiveDemo.xcodeproj/project.pbxproj +++ b/FULiveDemo.xcodeproj/project.pbxproj @@ -4200,7 +4200,7 @@ CLANG_WARN_DOCUMENTATION_COMMENTS = NO; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 41; + CURRENT_PROJECT_VERSION = 50; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_ASSET_PATHS = ""; DEVELOPMENT_TEAM = 35A6KD62ZJ; @@ -4267,7 +4267,7 @@ CLANG_WARN_DOCUMENTATION_COMMENTS = NO; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 41; + CURRENT_PROJECT_VERSION = 50; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_ASSET_PATHS = ""; DEVELOPMENT_TEAM = 35A6KD62ZJ; diff --git a/FULiveDemo/AppSupportFiles/Info.plist b/FULiveDemo/AppSupportFiles/Info.plist index 1856336e..f7ef8aa3 100644 --- a/FULiveDemo/AppSupportFiles/Info.plist +++ b/FULiveDemo/AppSupportFiles/Info.plist @@ -24,6 +24,8 @@ 1.0 CFBundleVersion $(CURRENT_PROJECT_VERSION) + ITSAppUsesNonExemptEncryption + LSRequiresIPhoneOS NSAppTransportSecurity diff --git a/FULiveDemo/Lib/FURenderKit.framework/FURenderKit b/FULiveDemo/Lib/FURenderKit.framework/FURenderKit index faffad18..69c59b4f 100755 Binary files a/FULiveDemo/Lib/FURenderKit.framework/FURenderKit and b/FULiveDemo/Lib/FURenderKit.framework/FURenderKit differ diff --git a/FULiveDemo/Lib/FURenderKit.framework/Headers/FUMakeup.h b/FULiveDemo/Lib/FURenderKit.framework/Headers/FUMakeup.h index b009d67d..ab267367 100644 --- a/FULiveDemo/Lib/FURenderKit.framework/Headers/FUMakeup.h +++ b/FULiveDemo/Lib/FURenderKit.framework/Headers/FUMakeup.h @@ -37,6 +37,9 @@ NS_ASSUME_NONNULL_BEGIN */ - (void)updateMakeupPackage:(FUItem * __nullable)makeupPackage needCleanSubItem:(BOOL)needCleanSubItem; +//修改整体妆容程度值 +@property (nonatomic, assign) double intensity; + ////组合装对象,内部包含当前组合装所有部位子妆 //@property (nonatomic, strong, nullable) FUItem *makeupPackage; diff --git a/FULiveDemo/Lib/FURenderKit.framework/Info.plist b/FULiveDemo/Lib/FURenderKit.framework/Info.plist index a310e18c..01a456b7 100644 Binary files a/FULiveDemo/Lib/FURenderKit.framework/Info.plist and b/FULiveDemo/Lib/FURenderKit.framework/Info.plist differ diff --git a/FULiveDemo/Modules/BGSegmentation/VC/FUBGSegmentationController.m b/FULiveDemo/Modules/BGSegmentation/VC/FUBGSegmentationController.m index acfde413..f82cf078 100644 --- a/FULiveDemo/Modules/BGSegmentation/VC/FUBGSegmentationController.m +++ b/FULiveDemo/Modules/BGSegmentation/VC/FUBGSegmentationController.m @@ -115,6 +115,8 @@ - (void)itemsViewDidSelectedItem:(NSString *)item indexPath:(NSIndexPath *)index image = [weak.segmentManager.segment readFirstFrame]; } if (image) { + model.iconImage = image; + [weak.segmentManager saveModel: model]; [weak saveImg:image withName:CUSTOMBG]; } else { //未获取当前录像的第一帧,移除自定义背景 diff --git a/FULiveDemo/Modules/Beauty/FUAPIDemoBar/FUBeautyView.m b/FULiveDemo/Modules/Beauty/FUAPIDemoBar/FUBeautyView.m index a6a8ef74..3ea18ba0 100644 --- a/FULiveDemo/Modules/Beauty/FUAPIDemoBar/FUBeautyView.m +++ b/FULiveDemo/Modules/Beauty/FUAPIDemoBar/FUBeautyView.m @@ -50,15 +50,26 @@ - (__kindof UICollectionViewCell *)collectionView:(UICollectionView *)collection } - BOOL selected = _selectedIndex == indexPath.row ; - + BOOL selected = _selectedIndex == indexPath.row ; + + if (selected) { + imageName = opened ? [modle.mTitle stringByAppendingString:@"-3"] : [modle.mTitle stringByAppendingString:@"-2"] ; + }else { + imageName = opened ? [modle.mTitle stringByAppendingString:@"-1"] : [modle.mTitle stringByAppendingString:@"-0"] ; + } + + /* icon 未找到, 尝试处理 多语言图片 */ + UIImage *imageIcon = [UIImage imageWithName:imageName]; + if (imageIcon == nil) { if (selected) { - imageName = opened ? [modle.mTitle stringByAppendingString:@"-3.png"] : [modle.mTitle stringByAppendingString:@"-2.png"] ; + imageName = opened ? [modle.mTitle stringByAppendingString:@"-3"] : [modle.mTitle stringByAppendingString:@"-2"] ; }else { - imageName = opened ? [modle.mTitle stringByAppendingString:@"-1.png"] : [modle.mTitle stringByAppendingString:@"-0.png"] ; + imageName = opened ? [modle.mTitle stringByAppendingString:@"-1"] : [modle.mTitle stringByAppendingString:@"-0"] ; } + imageIcon = [UIImage localizedImageWithName:imageName countrySimple:nil]; + } - cell.imageView.image = [UIImage imageWithName:imageName]; + cell.imageView.image = imageIcon; cell.titleLabel.text = FUNSLocalizedString(modle.mTitle,nil); cell.titleLabel.textColor = _selectedIndex == indexPath.row ? [UIColor colorWithHexColorString:@"5EC7FE"] : [UIColor whiteColor]; } diff --git a/FULiveDemo/Modules/Beauty/FUAPIDemoBar/Media.xcassets/style/Style7-3.imageset/Contents.json b/FULiveDemo/Modules/Beauty/FUAPIDemoBar/Media.xcassets/style/Style7-0_en.imageset/Contents.json similarity index 100% rename from FULiveDemo/Modules/Beauty/FUAPIDemoBar/Media.xcassets/style/Style7-3.imageset/Contents.json rename to FULiveDemo/Modules/Beauty/FUAPIDemoBar/Media.xcassets/style/Style7-0_en.imageset/Contents.json diff --git a/FULiveDemo/Modules/Beauty/FUAPIDemoBar/Media.xcassets/style/Style7-3.imageset/demo_icon_en_style_7_nor.png b/FULiveDemo/Modules/Beauty/FUAPIDemoBar/Media.xcassets/style/Style7-0_en.imageset/demo_icon_en_style_7_nor.png similarity index 100% rename from FULiveDemo/Modules/Beauty/FUAPIDemoBar/Media.xcassets/style/Style7-3.imageset/demo_icon_en_style_7_nor.png rename to FULiveDemo/Modules/Beauty/FUAPIDemoBar/Media.xcassets/style/Style7-0_en.imageset/demo_icon_en_style_7_nor.png diff --git a/FULiveDemo/Modules/Beauty/FUAPIDemoBar/Media.xcassets/style/Style7-3.imageset/demo_icon_en_style_7_nor@2x.png b/FULiveDemo/Modules/Beauty/FUAPIDemoBar/Media.xcassets/style/Style7-0_en.imageset/demo_icon_en_style_7_nor@2x.png similarity index 100% rename from FULiveDemo/Modules/Beauty/FUAPIDemoBar/Media.xcassets/style/Style7-3.imageset/demo_icon_en_style_7_nor@2x.png rename to FULiveDemo/Modules/Beauty/FUAPIDemoBar/Media.xcassets/style/Style7-0_en.imageset/demo_icon_en_style_7_nor@2x.png diff --git a/FULiveDemo/Modules/Beauty/FUAPIDemoBar/Media.xcassets/style/Style7-3.imageset/demo_icon_en_style_7_nor@3x.png b/FULiveDemo/Modules/Beauty/FUAPIDemoBar/Media.xcassets/style/Style7-0_en.imageset/demo_icon_en_style_7_nor@3x.png similarity index 100% rename from FULiveDemo/Modules/Beauty/FUAPIDemoBar/Media.xcassets/style/Style7-3.imageset/demo_icon_en_style_7_nor@3x.png rename to FULiveDemo/Modules/Beauty/FUAPIDemoBar/Media.xcassets/style/Style7-0_en.imageset/demo_icon_en_style_7_nor@3x.png diff --git a/FULiveDemo/Modules/Beauty/FUAPIDemoBar/Media.xcassets/style/Style7-0.imageset/Contents.json b/FULiveDemo/Modules/Beauty/FUAPIDemoBar/Media.xcassets/style/Style7-0_zh.imageset/Contents.json similarity index 100% rename from FULiveDemo/Modules/Beauty/FUAPIDemoBar/Media.xcassets/style/Style7-0.imageset/Contents.json rename to FULiveDemo/Modules/Beauty/FUAPIDemoBar/Media.xcassets/style/Style7-0_zh.imageset/Contents.json diff --git a/FULiveDemo/Modules/Beauty/FUAPIDemoBar/Media.xcassets/style/Style7-0.imageset/demo_icon_style_7_nor.png b/FULiveDemo/Modules/Beauty/FUAPIDemoBar/Media.xcassets/style/Style7-0_zh.imageset/demo_icon_style_7_nor.png similarity index 100% rename from FULiveDemo/Modules/Beauty/FUAPIDemoBar/Media.xcassets/style/Style7-0.imageset/demo_icon_style_7_nor.png rename to FULiveDemo/Modules/Beauty/FUAPIDemoBar/Media.xcassets/style/Style7-0_zh.imageset/demo_icon_style_7_nor.png diff --git a/FULiveDemo/Modules/Beauty/FUAPIDemoBar/Media.xcassets/style/Style7-0.imageset/demo_icon_style_7_nor@2x.png b/FULiveDemo/Modules/Beauty/FUAPIDemoBar/Media.xcassets/style/Style7-0_zh.imageset/demo_icon_style_7_nor@2x.png similarity index 100% rename from FULiveDemo/Modules/Beauty/FUAPIDemoBar/Media.xcassets/style/Style7-0.imageset/demo_icon_style_7_nor@2x.png rename to FULiveDemo/Modules/Beauty/FUAPIDemoBar/Media.xcassets/style/Style7-0_zh.imageset/demo_icon_style_7_nor@2x.png diff --git a/FULiveDemo/Modules/Beauty/FUAPIDemoBar/Media.xcassets/style/Style7-0.imageset/demo_icon_style_7_nor@3x.png b/FULiveDemo/Modules/Beauty/FUAPIDemoBar/Media.xcassets/style/Style7-0_zh.imageset/demo_icon_style_7_nor@3x.png similarity index 100% rename from FULiveDemo/Modules/Beauty/FUAPIDemoBar/Media.xcassets/style/Style7-0.imageset/demo_icon_style_7_nor@3x.png rename to FULiveDemo/Modules/Beauty/FUAPIDemoBar/Media.xcassets/style/Style7-0_zh.imageset/demo_icon_style_7_nor@3x.png diff --git a/FULiveDemo/Modules/Beauty/FUAPIDemoBar/Media.xcassets/style/Style7-sel.imageset/Contents.json b/FULiveDemo/Modules/Beauty/FUAPIDemoBar/Media.xcassets/style/Style7-2_en.imageset/Contents.json similarity index 100% rename from FULiveDemo/Modules/Beauty/FUAPIDemoBar/Media.xcassets/style/Style7-sel.imageset/Contents.json rename to FULiveDemo/Modules/Beauty/FUAPIDemoBar/Media.xcassets/style/Style7-2_en.imageset/Contents.json diff --git a/FULiveDemo/Modules/Beauty/FUAPIDemoBar/Media.xcassets/style/Style7-sel.imageset/demo_icon_en_style_7_sel.png b/FULiveDemo/Modules/Beauty/FUAPIDemoBar/Media.xcassets/style/Style7-2_en.imageset/demo_icon_en_style_7_sel.png similarity index 100% rename from FULiveDemo/Modules/Beauty/FUAPIDemoBar/Media.xcassets/style/Style7-sel.imageset/demo_icon_en_style_7_sel.png rename to FULiveDemo/Modules/Beauty/FUAPIDemoBar/Media.xcassets/style/Style7-2_en.imageset/demo_icon_en_style_7_sel.png diff --git a/FULiveDemo/Modules/Beauty/FUAPIDemoBar/Media.xcassets/style/Style7-sel.imageset/demo_icon_en_style_7_sel@2x.png b/FULiveDemo/Modules/Beauty/FUAPIDemoBar/Media.xcassets/style/Style7-2_en.imageset/demo_icon_en_style_7_sel@2x.png similarity index 100% rename from FULiveDemo/Modules/Beauty/FUAPIDemoBar/Media.xcassets/style/Style7-sel.imageset/demo_icon_en_style_7_sel@2x.png rename to FULiveDemo/Modules/Beauty/FUAPIDemoBar/Media.xcassets/style/Style7-2_en.imageset/demo_icon_en_style_7_sel@2x.png diff --git a/FULiveDemo/Modules/Beauty/FUAPIDemoBar/Media.xcassets/style/Style7-sel.imageset/demo_icon_en_style_7_sel@3x.png b/FULiveDemo/Modules/Beauty/FUAPIDemoBar/Media.xcassets/style/Style7-2_en.imageset/demo_icon_en_style_7_sel@3x.png similarity index 100% rename from FULiveDemo/Modules/Beauty/FUAPIDemoBar/Media.xcassets/style/Style7-sel.imageset/demo_icon_en_style_7_sel@3x.png rename to FULiveDemo/Modules/Beauty/FUAPIDemoBar/Media.xcassets/style/Style7-2_en.imageset/demo_icon_en_style_7_sel@3x.png diff --git a/FULiveDemo/Modules/Beauty/FUAPIDemoBar/Media.xcassets/style/Style7-2.imageset/Contents.json b/FULiveDemo/Modules/Beauty/FUAPIDemoBar/Media.xcassets/style/Style7-2_zh.imageset/Contents.json similarity index 100% rename from FULiveDemo/Modules/Beauty/FUAPIDemoBar/Media.xcassets/style/Style7-2.imageset/Contents.json rename to FULiveDemo/Modules/Beauty/FUAPIDemoBar/Media.xcassets/style/Style7-2_zh.imageset/Contents.json diff --git a/FULiveDemo/Modules/Beauty/FUAPIDemoBar/Media.xcassets/style/Style7-2.imageset/demo_icon_style_7_sel.png b/FULiveDemo/Modules/Beauty/FUAPIDemoBar/Media.xcassets/style/Style7-2_zh.imageset/demo_icon_style_7_sel.png similarity index 100% rename from FULiveDemo/Modules/Beauty/FUAPIDemoBar/Media.xcassets/style/Style7-2.imageset/demo_icon_style_7_sel.png rename to FULiveDemo/Modules/Beauty/FUAPIDemoBar/Media.xcassets/style/Style7-2_zh.imageset/demo_icon_style_7_sel.png diff --git a/FULiveDemo/Modules/Beauty/FUAPIDemoBar/Media.xcassets/style/Style7-2.imageset/demo_icon_style_7_sel@2x.png b/FULiveDemo/Modules/Beauty/FUAPIDemoBar/Media.xcassets/style/Style7-2_zh.imageset/demo_icon_style_7_sel@2x.png similarity index 100% rename from FULiveDemo/Modules/Beauty/FUAPIDemoBar/Media.xcassets/style/Style7-2.imageset/demo_icon_style_7_sel@2x.png rename to FULiveDemo/Modules/Beauty/FUAPIDemoBar/Media.xcassets/style/Style7-2_zh.imageset/demo_icon_style_7_sel@2x.png diff --git a/FULiveDemo/Modules/Beauty/FUAPIDemoBar/Media.xcassets/style/Style7-2.imageset/demo_icon_style_7_sel@3x.png b/FULiveDemo/Modules/Beauty/FUAPIDemoBar/Media.xcassets/style/Style7-2_zh.imageset/demo_icon_style_7_sel@3x.png similarity index 100% rename from FULiveDemo/Modules/Beauty/FUAPIDemoBar/Media.xcassets/style/Style7-2.imageset/demo_icon_style_7_sel@3x.png rename to FULiveDemo/Modules/Beauty/FUAPIDemoBar/Media.xcassets/style/Style7-2_zh.imageset/demo_icon_style_7_sel@3x.png diff --git a/FULiveDemo/Modules/Beauty/FUAPIDemoBar/UIImage+demobar.h b/FULiveDemo/Modules/Beauty/FUAPIDemoBar/UIImage+demobar.h index 8a2fdde0..ae405765 100644 --- a/FULiveDemo/Modules/Beauty/FUAPIDemoBar/UIImage+demobar.h +++ b/FULiveDemo/Modules/Beauty/FUAPIDemoBar/UIImage+demobar.h @@ -11,4 +11,11 @@ @interface UIImage (demobar) + (UIImage *)imageWithName:(NSString *)name; + +/** + * 适配图片多语言文案问题 + * countrySimple 国家简写标识, countrySimple == nil,获取系统分配的国家语言简写标识, countrySimple == @""表示不加国家简写后缀 + * 多语言图片适配规则 name + '_' + countrySimple, 图片命名必须严格按照该规则 'Style7-3_en' + */ ++ (UIImage *)localizedImageWithName:(NSString *)name countrySimple:(NSString *)countrySimple; @end diff --git a/FULiveDemo/Modules/Beauty/FUAPIDemoBar/UIImage+demobar.m b/FULiveDemo/Modules/Beauty/FUAPIDemoBar/UIImage+demobar.m index 5f8d9da6..1fe843cd 100644 --- a/FULiveDemo/Modules/Beauty/FUAPIDemoBar/UIImage+demobar.m +++ b/FULiveDemo/Modules/Beauty/FUAPIDemoBar/UIImage+demobar.m @@ -19,4 +19,29 @@ + (UIImage *)imageWithName:(NSString *)name { return image; } +/** + * 适配图片多语言文案问题 + * countrySimple 国家简写标识, == nil,获取系统分配的国家语言简写标识 + */ ++ (UIImage *)localizedImageWithName:(NSString *)name countrySimple:(NSString *)countrySimple { + UIImage *image = [UIImage imageNamed:name inBundle:[NSBundle bundleForClass:FUAPIDemoBar.class] compatibleWithTraitCollection:nil]; + if (image) { + return image; + } + + if (countrySimple == nil) { + NSDictionary *dic = [NSLocale componentsFromLocaleIdentifier:[NSLocale currentLocale].localeIdentifier]; + NSString *kCFLocaleLanguageCodeKey = [dic objectForKey:NSLocaleLanguageCode]; + countrySimple = kCFLocaleLanguageCodeKey; + } + + if (countrySimple.length == 0) { + image = [UIImage imageNamed:name]; + } else { + // * 多语言图片适配规则 name + '_' + countrySimple, 图片命名必须严格按照该规则 'Style7-3_en' + image = [UIImage imageNamed:[NSString stringWithFormat:@"%@_%@",name,countrySimple]]; + } + return image; +} + @end diff --git a/Pods/Pods.xcodeproj/project.pbxproj b/Pods/Pods.xcodeproj/project.pbxproj index 8142b190..5c233afd 100644 --- a/Pods/Pods.xcodeproj/project.pbxproj +++ b/Pods/Pods.xcodeproj/project.pbxproj @@ -15,6 +15,7 @@ dependencies = ( ); name = Bugly; + productName = Bugly; }; /* End PBXAggregateTarget section */ @@ -75,7 +76,6 @@ 301CD9395E474DE10CF30B1582E1193A /* SDWebImagePrefetcher.m in Sources */ = {isa = PBXBuildFile; fileRef = 1C617A23A78E396B058A259B265DAC48 /* SDWebImagePrefetcher.m */; }; 304FB2F3CB19F5C44D812D90AA2F1121 /* UIRefreshControl+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = 1C3D2D6321E895200A6A13F739CBB08F /* UIRefreshControl+AFNetworking.m */; }; 32164C652FC5A1BE5B37AD5698C99CC9 /* LOTPlatformCompat.h in Headers */ = {isa = PBXBuildFile; fileRef = 397C12CB0EA11BE020D15D50E27E3EB0 /* LOTPlatformCompat.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 337C8A9592224E2629F71F4759AE0DF2 /* UIWebView+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = BD36579E36D893E5C5744CAC17D9E6CA /* UIWebView+AFNetworking.h */; settings = {ATTRIBUTES = (Project, ); }; }; 33A53F28EA81B362E5E7F018F0404E0A /* SDImageCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 394E0E96AD11B0F576A5F7E582895B18 /* SDImageCache.m */; }; 34E253EB078AE14E619398EB86C16A2F /* MJExtension.h in Headers */ = {isa = PBXBuildFile; fileRef = 3BB47D0D3E452438785E7054E9339FAE /* MJExtension.h */; settings = {ATTRIBUTES = (Project, ); }; }; 3618E67E015EEEB32EBE43CE0097FEF9 /* LOTBezierData.m in Sources */ = {isa = PBXBuildFile; fileRef = 2D0DD0D1A2E351630F5444FF86ABED76 /* LOTBezierData.m */; }; @@ -118,7 +118,6 @@ 551EDABAFCE6F89BB75C7174D4D9D059 /* UIActivityIndicatorView+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = B05A506AC25AF4A4E6F706BCC44BB658 /* UIActivityIndicatorView+AFNetworking.m */; }; 560772924855508A02702CAECDF31ECB /* FLAnimatedImage.m in Sources */ = {isa = PBXBuildFile; fileRef = 59706ED3A7981B3A14C85D897328289A /* FLAnimatedImage.m */; }; 5607AF83703C0AEDB12115740B6672BD /* AFAutoPurgingImageCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 165EDC3E6050B7D9F85C1D07ED24B562 /* AFAutoPurgingImageCache.m */; }; - 5671A72ECAB90A855ECF6F69B750B4E1 /* UIWebView+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = 5BF0F38AF71CA66E13784BDFD29BFE20 /* UIWebView+AFNetworking.m */; }; 5672C08B2E4A956A54FBBC0BFC17DC82 /* MJProperty.h in Headers */ = {isa = PBXBuildFile; fileRef = D9398D8281E32547FB8913A8B69543B6 /* MJProperty.h */; settings = {ATTRIBUTES = (Project, ); }; }; 572D05B146EAA3EF5530A0D0E34904A0 /* MASViewConstraint.m in Sources */ = {isa = PBXBuildFile; fileRef = B4A4A069CF2A03E3BB04F8A0D39FEFA1 /* MASViewConstraint.m */; }; 57DE48AA24434C2275EAAC780346F9D1 /* LOTPathInterpolator.m in Sources */ = {isa = PBXBuildFile; fileRef = 11FF09B885100A0CAF2884B36AD0C01C /* LOTPathInterpolator.m */; }; @@ -405,7 +404,7 @@ 1DA6EC10D0A94E417B5EB1D8470F968E /* LOTShapeTrimPath.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = LOTShapeTrimPath.m; path = "lottie-ios/Classes/Models/LOTShapeTrimPath.m"; sourceTree = ""; }; 1DEA46B9159052E599F2B737AD3E76C6 /* AFURLResponseSerialization.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFURLResponseSerialization.h; path = AFNetworking/AFURLResponseSerialization.h; sourceTree = ""; }; 1EE8B898C6649C0E95A39CC2D947782D /* LOTRenderGroup.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LOTRenderGroup.h; path = "lottie-ios/Classes/RenderSystem/RenderNodes/LOTRenderGroup.h"; sourceTree = ""; }; - 1FFED36A657123030ABB700256D73F15 /* libMasonry.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = libMasonry.a; path = libMasonry.a; sourceTree = BUILT_PRODUCTS_DIR; }; + 1FFED36A657123030ABB700256D73F15 /* libMasonry.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libMasonry.a; sourceTree = BUILT_PRODUCTS_DIR; }; 2006AD3748045C5F25E8039084B884EA /* lottie-ios-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "lottie-ios-prefix.pch"; sourceTree = ""; }; 20D0A108C721E90DBBB747DC2547D850 /* SDWebImageCompat.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageCompat.m; path = SDWebImage/SDWebImageCompat.m; sourceTree = ""; }; 20F9B2DDF0E51D89980546525C2DE7FC /* FLAnimatedImage-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "FLAnimatedImage-prefix.pch"; sourceTree = ""; }; @@ -417,7 +416,7 @@ 25DB2CE73DCAA4968695B626A04AFA98 /* UIView+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+WebCache.m"; path = "SDWebImage/UIView+WebCache.m"; sourceTree = ""; }; 265A5D04331FD078A94585D275978104 /* SDWebImageCoderHelper.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageCoderHelper.m; path = SDWebImage/SDWebImageCoderHelper.m; sourceTree = ""; }; 29B4663BBEE1E1B89C7F6CF8A163690C /* MASUtilities.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASUtilities.h; path = Masonry/MASUtilities.h; sourceTree = ""; }; - 2B276B0A79173A1D6E83C9B4FB9A4A57 /* libMJExtension.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = libMJExtension.a; path = libMJExtension.a; sourceTree = BUILT_PRODUCTS_DIR; }; + 2B276B0A79173A1D6E83C9B4FB9A4A57 /* libMJExtension.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libMJExtension.a; sourceTree = BUILT_PRODUCTS_DIR; }; 2B2F1AC2DBBAF256533C49651E8F1DA0 /* SDWebImageManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageManager.h; path = SDWebImage/SDWebImageManager.h; sourceTree = ""; }; 2BAF5AFBDD57F9D1B535F41CE52C6DA1 /* SDWebImageCoderHelper.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageCoderHelper.h; path = SDWebImage/SDWebImageCoderHelper.h; sourceTree = ""; }; 2D0DD0D1A2E351630F5444FF86ABED76 /* LOTBezierData.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = LOTBezierData.m; path = "lottie-ios/Classes/AnimatableProperties/LOTBezierData.m"; sourceTree = ""; }; @@ -432,7 +431,7 @@ 33746C330DE5C6937C0FD42EEB26B087 /* Bugly.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Bugly.release.xcconfig; sourceTree = ""; }; 347ADE8B91F09ADDB19F0D628D257798 /* NSObject+MJKeyValue.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSObject+MJKeyValue.m"; path = "MJExtension/NSObject+MJKeyValue.m"; sourceTree = ""; }; 349ABC62A616CFFFA9A38207E8BBE26C /* MJExtensionConst.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJExtensionConst.h; path = MJExtension/MJExtensionConst.h; sourceTree = ""; }; - 3673B994EDE0CD2EC135C263D5C1BAF6 /* libPods-FULiveDemo.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = "libPods-FULiveDemo.a"; path = "libPods-FULiveDemo.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + 3673B994EDE0CD2EC135C263D5C1BAF6 /* libPods-FULiveDemo.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-FULiveDemo.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 36B8383BE996BBEFE37DED6B240D03D3 /* SDWebImageDownloader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDownloader.m; path = SDWebImage/SDWebImageDownloader.m; sourceTree = ""; }; 36DBDAB9A1BCFD3591AEF9F58636085D /* LOTMask.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LOTMask.h; path = "lottie-ios/Classes/Models/LOTMask.h"; sourceTree = ""; }; 37EE3C50B82AD40657776B2E772986EF /* LOTPointInterpolator.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = LOTPointInterpolator.m; path = "lottie-ios/Classes/RenderSystem/InterpolatorNodes/LOTPointInterpolator.m"; sourceTree = ""; }; @@ -476,7 +475,7 @@ 4F956095F7D9C856D2F972135B0B797B /* SVProgressAnimatedView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SVProgressAnimatedView.m; path = SVProgressHUD/SVProgressAnimatedView.m; sourceTree = ""; }; 509EF0197BD44AE07D5AB0172C6429CA /* UIBezierPath.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = UIBezierPath.m; path = "lottie-ios/Classes/MacCompatibility/UIBezierPath.m"; sourceTree = ""; }; 512483D09C19BAA9DDB0147F65F43826 /* NSButton+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSButton+WebCache.h"; path = "SDWebImage/NSButton+WebCache.h"; sourceTree = ""; }; - 51BA97E8B5085EFFB47BC9C0B785CEA7 /* liblottie-ios.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = "liblottie-ios.a"; path = "liblottie-ios.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + 51BA97E8B5085EFFB47BC9C0B785CEA7 /* liblottie-ios.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "liblottie-ios.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 538367BC493FDB9DE3B7285B225BFB53 /* LOTShapeRepeater.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = LOTShapeRepeater.m; path = "lottie-ios/Classes/Models/LOTShapeRepeater.m"; sourceTree = ""; }; 5390B582062C7533EAC25FCDB1708177 /* CGGeometry+LOTAdditions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "CGGeometry+LOTAdditions.h"; path = "lottie-ios/Classes/Extensions/CGGeometry+LOTAdditions.h"; sourceTree = ""; }; 543407BC9267CBD06558A966E03A46E3 /* LOTShapeRectangle.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = LOTShapeRectangle.m; path = "lottie-ios/Classes/Models/LOTShapeRectangle.m"; sourceTree = ""; }; @@ -574,7 +573,7 @@ 9B1E487E943E70F9946BC1858EB02F10 /* LOTShapeGroup.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = LOTShapeGroup.m; path = "lottie-ios/Classes/Models/LOTShapeGroup.m"; sourceTree = ""; }; 9B5B1C58996084DBA5BC98FF6F976FFA /* LOTKeypath.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LOTKeypath.h; path = "lottie-ios/Classes/PublicHeaders/LOTKeypath.h"; sourceTree = ""; }; 9BE8B0C15A44C6C24B40D603B99A3B57 /* LOTValueCallback.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LOTValueCallback.h; path = "lottie-ios/Classes/PublicHeaders/LOTValueCallback.h"; sourceTree = ""; }; - 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; + 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 9E5E72B44A01897C35302467983E9705 /* UIView+WebCacheOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+WebCacheOperation.h"; path = "SDWebImage/UIView+WebCacheOperation.h"; sourceTree = ""; }; 9E8C0828927974AEFC28F5746D529102 /* LOTShapeCircle.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = LOTShapeCircle.m; path = "lottie-ios/Classes/Models/LOTShapeCircle.m"; sourceTree = ""; }; 9EDE7F7E5DA3AC7A99CBF372EE12C236 /* AFURLRequestSerialization.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFURLRequestSerialization.m; path = AFNetworking/AFURLRequestSerialization.m; sourceTree = ""; }; @@ -585,7 +584,7 @@ A171DC951174B1D86587D987B443336C /* NSObject+MJKeyValue.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSObject+MJKeyValue.h"; path = "MJExtension/NSObject+MJKeyValue.h"; sourceTree = ""; }; A1EC9D848909BFCA5C644AE690D119F3 /* Pods-FULiveDemo-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-FULiveDemo-acknowledgements.plist"; sourceTree = ""; }; A38795771E0B1BAA55F9A2F4945E000E /* UIImage+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+AFNetworking.h"; path = "UIKit+AFNetworking/UIImage+AFNetworking.h"; sourceTree = ""; }; - A4FA15D44DF6BAC7550EDEED10862AA3 /* libAFNetworking.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = libAFNetworking.a; path = libAFNetworking.a; sourceTree = BUILT_PRODUCTS_DIR; }; + A4FA15D44DF6BAC7550EDEED10862AA3 /* libAFNetworking.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libAFNetworking.a; sourceTree = BUILT_PRODUCTS_DIR; }; A5DF9E307B7FCF66D01B7468B7F8AB20 /* UIImageView+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImageView+WebCache.m"; path = "SDWebImage/UIImageView+WebCache.m"; sourceTree = ""; }; A6384A9C7A4B505D22EE0B97FAD48D7E /* LOTAnimationView_Internal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LOTAnimationView_Internal.h; path = "lottie-ios/Classes/Private/LOTAnimationView_Internal.h"; sourceTree = ""; }; A8160267DF181EAD585F88F57BCC0F32 /* NSArray+MASAdditions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSArray+MASAdditions.h"; path = "Masonry/NSArray+MASAdditions.h"; sourceTree = ""; }; @@ -598,7 +597,7 @@ B03DB51956AF5CCBB10F7F922165D667 /* UIColor+Expanded.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIColor+Expanded.h"; path = "lottie-ios/Classes/Extensions/UIColor+Expanded.h"; sourceTree = ""; }; B041B07321FB9FB9D40E00522991FD2E /* MJExtension.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = MJExtension.debug.xcconfig; sourceTree = ""; }; B05A506AC25AF4A4E6F706BCC44BB658 /* UIActivityIndicatorView+AFNetworking.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIActivityIndicatorView+AFNetworking.m"; path = "UIKit+AFNetworking/UIActivityIndicatorView+AFNetworking.m"; sourceTree = ""; }; - B0B214D775196BA7CA8E17E53048A493 /* libSDWebImage.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = libSDWebImage.a; path = libSDWebImage.a; sourceTree = BUILT_PRODUCTS_DIR; }; + B0B214D775196BA7CA8E17E53048A493 /* libSDWebImage.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libSDWebImage.a; sourceTree = BUILT_PRODUCTS_DIR; }; B1D38F67415F4F75166504E3FF9A1F16 /* AFNetworking.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = AFNetworking.debug.xcconfig; sourceTree = ""; }; B3127FB384E0C64EA7B819C74DBD2268 /* MJPropertyType.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJPropertyType.m; path = MJExtension/MJPropertyType.m; sourceTree = ""; }; B38F64048EE686C7E7BACAF746D4CB3B /* AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFNetworking.h; path = AFNetworking/AFNetworking.h; sourceTree = ""; }; @@ -663,7 +662,7 @@ E6849C29B98E6E9E1D6CC007B644B9BA /* LOTAsset.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LOTAsset.h; path = "lottie-ios/Classes/Models/LOTAsset.h"; sourceTree = ""; }; E6AF57F06BB4A6F60C55B97FF7AFD22F /* Bugly.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Bugly.framework; sourceTree = ""; }; E7354366D89B9ADE2EC24E6297356A95 /* LOTLayerGroup.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LOTLayerGroup.h; path = "lottie-ios/Classes/Models/LOTLayerGroup.h"; sourceTree = ""; }; - E97D43C46A45EE515A4DA3AF94398441 /* libSVProgressHUD.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = libSVProgressHUD.a; path = libSVProgressHUD.a; sourceTree = BUILT_PRODUCTS_DIR; }; + E97D43C46A45EE515A4DA3AF94398441 /* libSVProgressHUD.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libSVProgressHUD.a; sourceTree = BUILT_PRODUCTS_DIR; }; ECF362E3B2B73D76B5B67847947090B7 /* Masonry.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Masonry.debug.xcconfig; sourceTree = ""; }; ED7B22DF4FA3B637113026E7BB0CA7F0 /* LOTPointInterpolator.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LOTPointInterpolator.h; path = "lottie-ios/Classes/RenderSystem/InterpolatorNodes/LOTPointInterpolator.h"; sourceTree = ""; }; EDAA48BFF0D31B5965484FB75E5C38FF /* Masonry-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Masonry-dummy.m"; sourceTree = ""; }; @@ -680,7 +679,7 @@ FA22F35A528CC18D6A78F59D21A2860F /* UIProgressView+AFNetworking.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIProgressView+AFNetworking.m"; path = "UIKit+AFNetworking/UIProgressView+AFNetworking.m"; sourceTree = ""; }; FA452448D31CEC31AE48B0A45EA8B8E9 /* LOTAnimationView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = LOTAnimationView.m; path = "lottie-ios/Classes/Private/LOTAnimationView.m"; sourceTree = ""; }; FA95A3566E37272FAB1AA93FFB0BCC0A /* MASConstraint.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASConstraint.h; path = Masonry/MASConstraint.h; sourceTree = ""; }; - FAA5F2D71B90788C908800A94534AA92 /* libFLAnimatedImage.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = libFLAnimatedImage.a; path = libFLAnimatedImage.a; sourceTree = BUILT_PRODUCTS_DIR; }; + FAA5F2D71B90788C908800A94534AA92 /* libFLAnimatedImage.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libFLAnimatedImage.a; sourceTree = BUILT_PRODUCTS_DIR; }; FDC8FD83687D1731A0ACC1D6919B82EB /* AFNetworkReachabilityManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFNetworkReachabilityManager.h; path = AFNetworking/AFNetworkReachabilityManager.h; sourceTree = ""; }; FE6846FB412B63086F43F8A3F1733BDD /* LOTAnimationCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = LOTAnimationCache.m; path = "lottie-ios/Classes/Private/LOTAnimationCache.m"; sourceTree = ""; }; FFEAB1FDB0A78F291B256BD92D2A3F6C /* MASCompositeConstraint.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASCompositeConstraint.h; path = Masonry/MASCompositeConstraint.h; sourceTree = ""; }; @@ -865,7 +864,6 @@ C28C0F983DE4B54D49FE44A6EB124750 /* Support Files */, 560E089C1B4E25AAA814B2D7119CC892 /* UIKit */, ); - name = AFNetworking; path = AFNetworking; sourceTree = ""; }; @@ -883,7 +881,6 @@ 25A65B92FBCEB98E68A15DEC3167312E /* Resources */, FBC48AF3C79C7F1C42FBB83A585BAD99 /* Support Files */, ); - name = SVProgressHUD; path = SVProgressHUD; sourceTree = ""; }; @@ -992,7 +989,6 @@ 3013A1E0D9933FE960522FADD1EFC99F /* Frameworks */, 55419CD2392DD52241048BBAB05C4A6B /* Support Files */, ); - name = Bugly; path = Bugly; sourceTree = ""; }; @@ -1026,7 +1022,6 @@ 9F332F9612FDC500048A689B53E85A5E /* ViewController+MASAdditions.m */, DBD42C7C031867F04773E1BF81F68AF1 /* Support Files */, ); - name = Masonry; path = Masonry; sourceTree = ""; }; @@ -1202,7 +1197,6 @@ D7848CF8B1266AAE8B3B7B5A978A32EC /* UIColor+Expanded.m */, 2971FAB5B5DF85E61394705BD8D098D8 /* Support Files */, ); - name = "lottie-ios"; path = "lottie-ios"; sourceTree = ""; }; @@ -1243,7 +1237,6 @@ 5A48F7B21B3722568D75F421248CFDB8 /* NSString+MJExtension.m */, EF1F2DE54A79CFCE7E6CEE1B59A4545F /* Support Files */, ); - name = MJExtension; path = MJExtension; sourceTree = ""; }; @@ -1263,7 +1256,6 @@ 8966079F7FA4A59D6B88A3513E6B779B /* FLAnimatedImageView.m */, A46CDAAACED3BC47C53BE8476D18EF72 /* Support Files */, ); - name = FLAnimatedImage; path = FLAnimatedImage; sourceTree = ""; }; @@ -1318,7 +1310,6 @@ 08F0656087571314F129606B8EAD6F79 /* Core */, 3734D5FED34DCE6E902B3565AB736782 /* Support Files */, ); - name = SDWebImage; path = SDWebImage; sourceTree = ""; }; @@ -1347,7 +1338,6 @@ C1EE07F0E0B54668574633B545FBCE48 /* UIKit+AFNetworking.h in Headers */, D3DC240631E1FA883A5604B3E99BAE2B /* UIProgressView+AFNetworking.h in Headers */, A845819E8332E3CA279E6B00EAA55366 /* UIRefreshControl+AFNetworking.h in Headers */, - 337C8A9592224E2629F71F4759AE0DF2 /* UIWebView+AFNetworking.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1729,7 +1719,6 @@ 40F9C3B7C0CCD0982FD14728F2595632 /* UIImageView+AFNetworking.m in Sources */, 894126828AF68F98598CA7B53E737AEF /* UIProgressView+AFNetworking.m in Sources */, 304FB2F3CB19F5C44D812D90AA2F1121 /* UIRefreshControl+AFNetworking.m in Sources */, - 5671A72ECAB90A855ECF6F69B750B4E1 /* UIWebView+AFNetworking.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -2167,8 +2156,7 @@ MTL_FAST_MATH = YES; PRODUCT_NAME = "$(TARGET_NAME)"; STRIP_INSTALLED_PRODUCT = NO; - SWIFT_COMPILATION_MODE = wholemodule; - SWIFT_OPTIMIZATION_LEVEL = "-O"; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; SWIFT_VERSION = 5.0; SYMROOT = "${SRCROOT}/../build"; }; diff --git a/Pods/Pods.xcodeproj/xcuserdata/fu-mobile.xcuserdatad/xcschemes/xcschememanagement.plist b/Pods/Pods.xcodeproj/xcuserdata/fu-mobile.xcuserdatad/xcschemes/xcschememanagement.plist index 6c9093a7..96a0373c 100644 --- a/Pods/Pods.xcodeproj/xcuserdata/fu-mobile.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/Pods/Pods.xcodeproj/xcuserdata/fu-mobile.xcuserdatad/xcschemes/xcschememanagement.plist @@ -7,47 +7,47 @@ AFNetworking.xcscheme_^#shared#^_ orderHint - 2 + 10 Bugly.xcscheme_^#shared#^_ orderHint - 1 + 9 FLAnimatedImage.xcscheme_^#shared#^_ orderHint - 8 + 11 MJExtension.xcscheme_^#shared#^_ orderHint - 11 + 6 Masonry.xcscheme_^#shared#^_ orderHint - 4 + 3 Pods-FULiveDemo.xcscheme_^#shared#^_ orderHint - 9 + 4 SDWebImage.xcscheme_^#shared#^_ orderHint - 3 + 5 SVProgressHUD.xcscheme_^#shared#^_ orderHint - 10 + 8 lottie-ios.xcscheme_^#shared#^_ orderHint - 5 + 1 diff --git "a/docs/\347\247\273\345\212\250\347\253\257\346\226\207\346\241\243/FURenderKit\345\277\253\351\200\237\351\233\206\346\210\220\346\226\207\346\241\243.md" "b/docs/\347\247\273\345\212\250\347\253\257\346\226\207\346\241\243/FURenderKit\345\277\253\351\200\237\351\233\206\346\210\220\346\226\207\346\241\243.md" new file mode 100644 index 00000000..28339c9c --- /dev/null +++ "b/docs/\347\247\273\345\212\250\347\253\257\346\226\207\346\241\243/FURenderKit\345\277\253\351\200\237\351\233\206\346\210\220\346\226\207\346\241\243.md" @@ -0,0 +1,519 @@ +# 快速集成文档 + +## 初始化 + +```objective-c +// 初始化 FURenderKit +FUSetupConfig *setupConfig = [[FUSetupConfig alloc] init]; +setupConfig.authPack = FUAuthPackMake(g_auth_package, **sizeof**(g_auth_package)); +[FURenderKit setupWithSetupConfig:setupConfig]; +``` + +## 加载AI模型 + +```objective-c +// 加载人脸 AI 模型 +NSString *faceAIPath = [[NSBundle mainBundle] pathForResource:@"ai_face_processor" ofType:@"bundle"]; +[FUAIKit loadAIModeWithAIType:FUAITYPE_FACEPROCESSOR dataPath:faceAIPath]; + +// 加载身体 AI 模型 +NSString *bodyAIPath = [[NSBundle mainBundle] pathForResource:@"ai_human_processor" ofType:@"bundle"]; +[FUAIKit loadAIModeWithAIType:FUAITYPE_HUMAN_PROCESSOR dataPath:bodyAIPath]; + +// 加载手势 AI 模型 +NSString *handAIPath = [[NSBundle mainBundle] pathForResource:@"ai_hand_processor" ofType:@"bundle"]; +[FUAIKit loadAIModeWithAIType:FUAITYPE_HANDGESTURE dataPath:handAIPath]; + +// 加载头发 AI 模型 +NSString *hairAIPath = [[NSBundle mainBundle] pathForResource:@"ai_hairseg" ofType:@"bundle"]; +[FUAIKit loadAIModeWithAIType:FUAITYPE_HAIRSEGMENTATION dataPath:hairAIPath]; +``` + + + +## 设置显示View + +FURenderKit 提供了显示渲染结果的 FUGLDisplayView 类(如果使用自定义渲染可忽略本步骤),用户可直接在外部初始化一个 FUGLDisplayView 实例,并赋值给 FURenderKit 单例。FURenderKit 会将渲染结果直接绘制到该 FUGLDisplayView 实例。示例代码如下: + +```objective-c +// set glDisplayView +FUGLDisplayView *glDisplayView = [[FUGLDisplayView alloc] initWithFrame:self.view.bounds]; +[self.view addSubview:glDisplayView]; +[FURenderKit shareRenderKit].glDisplayView = glDisplayView; +[FURenderKit shareRenderKit].glDisplayView.contentMode = FUGLDisplayViewContentModeScaleAspectFit; //设置图像适配模式 +``` + +用户也可以不将 FUGLDisplayView 实例赋值给 FURenderKit 单例,直接在外部使用 FUGLDisplayView 的相关接口显示图像。 + +## 内部相机 + +FURenderKit 提供了采集图像的 FUCaptureCamera 类(如果使用外部相机可忽略本步骤),用户可直接掉用下面的函数开启或关闭内部相机功能。 + +```objective-c +// 开启内部相机 +[[FURenderKit shareRenderKit] startInternalCamera]; + +// 关闭内部相机 +[[FURenderKit shareRenderKit] stopInternalCamera]; +``` + +**FURenderKit 单例有一个 internalCameraSetting 实例,启动内部相机时会根据 internalCameraSetting 的参数配置相机,internalCameraSetting 具体属性及默认值如下,用户可以通过修改这些参数直接修改相机的相关属性:** + +```objective-c +@interface FUInternalCameraSetting : NSObject +@property (nonatomic, assign) int format; //default kCVPixelFormatType_32BGRA +@property (nonatomic, copy) AVCaptureSessionPreset sessionPreset; // default AVCaptureSessionPreset1280x720 +@property (nonatomic, assign) AVCaptureDevicePosition position; // default AVCaptureDevicePositionFront +@property (nonatomic, assign) int fps; // default 30 +// default NO, 需要注意的是,在打开内部虚拟相机时,用户如果使用Scene相关需要真实相机的功能,内部会自动开启真实相机,并且当用户关闭相关Scene功能时,内部会自动关闭。 +@property (nonatomic, assign) BOOL useVirtualCamera; + +/// 如果使用内部相机时,SDK会自动判断当前是否需要使用系统相机,如果不需相机,内部会模拟一个相机并循环输出图像。 +/// 该属性可以设置输出图像的宽高,默认宽高为:720x1280,如果设置为CGSizeZero,则会使用 sessionPreset 的宽高。 +@property (nonatomic, assign) CGSize virtualCameraResolution; +@end +``` + +**用户也可以直接使用 FUCaptureCamera 在外部初始化相机实例,并通过 FUCaptureCamera 相关接口获取图像,再将图像传入 FURenderKit 的渲染接口处理图像。 ** + + + +## FURenderKit 主要接口说明: + +### 渲染接口 + +#### 1. 输入 + +FURenderKit 定义了 FURenderInput 类作为输入,该类的具体定义如下: + +```objective-c +@interface FURenderInput : NSObject + +/// 输入的纹理 +@property (nonatomic, assign) FUTexture texture; + +/// 输入的 pixelBuffer +@property (nonatomic, assign) CVPixelBufferRef pixelBuffer; + +/// 输入的 imageBuffer,如果同时传入了 pixelBuffer,将优先使用 pixelBuffer +/// 输入 imageBuffer,在 renderConfig 的 onlyOutputTexture 为 NO 时,render 结果会直接读会输入的 imageBuffer,大小格式与输入均保持一致。 +@property (nonatomic, assign) FUImageBuffer imageBuffer; + +/// 设置render相关的输入输出配置,详细参数请查看 FURenderConfig 类的接口注释。 +@property (nonatomic, strong) FURenderConfig *renderConfig; + +@end +``` + +用户可以根据自己代码中的数据,选择输入一种或多种格式的图像,如果传入多种格式时,如果同时传入了 pixelBuffer 和 imageBuffer,会优先使用 pixelBuffer 进行图像处理。FUTexture 及 FUImageBuffer相关属性,请查看相关头文件。 + +### 2. 配置 + +FURenderInput 中有一个 FURenderConfig 类,该类用来配置一些输入及输出的相关设置,具体定义如下: + +```objective-c +@interface FURenderConfig : NSObject + +// 自定义输出结果的大小,当前只会对输出的纹理及pixelBuffer有效 +@property (nonatomic, assign) CGSize customOutputSize; + +// 当前图片是否来源于前置摄像头 +@property (nonatomic, assign) BOOL isFromFrontCamera; + +// 原始图像的朝向 +@property (nonatomic, assign) FUImageOrientation imageOrientation; + +// 重力开关,开启此功能可以根据已设置的 imageRotation 自动适配AI检测的方向。 +@property (nonatomic, assign) BOOL gravityEnable; + +// 设置为YES 只会生效美颜结果 +@property (nonatomic, assign) BOOL onlyRenderBeauty; + +// 设置输入纹理的旋转方向,设置该属性会影响输出纹理的方向。由于默认创建的纹理是倒着的,所以该参数的默认值为 CCROT0_FLIPVERTICAL,如已转正,请将该参数设置为 DEFAULT +@property (nonatomic, assign) TRANSFORM_MATRIX textureTransform; + +// 设置输入pixelBuffer/imageBuffer的旋转方向,以使buffer数据与textureTransform作用后纹理的方向一致,该参数仅用于AI算法检测,不会改变buffer的方向或镜像属性 +@property (nonatomic, assign) TRANSFORM_MATRIX bufferTransform; + +// 是否渲染到当前的FBO,设置为YES时,返回的 FURenderOutput 内的所有数据均为空值。 +@property (nonatomic, assign) BOOL renderToCurrentFBO; + +// 设置为YES 且 renderToCurrentFBO 为 NO 时,只会输出纹理,不会输出CPU层的图像。 +@property (nonatomic, assign) BOOL onlyOutputTexture; + +@end + +``` + +### 3. 输出 + +FURenderKit 定义了 FURenderOutput 类作为输出,该类的具体定义如下: 输出的图像类型及个数与输入相同。 + +```objective-c +@interface FURenderOutput : NSObject + +// 设置输入纹理的旋转方向,设置该属性会影响输出纹理的方向。由于默认创建的纹理是倒着的,所以该参数的默认值为 CCROT0_FLIPVERTICAL,如已转正,请将该参数设置为 DEFAULT +@property (nonatomic, assign) TRANSFORM_MATRIX textureTransform; + +// 设置输入pixelBuffer/imageBuffer的旋转方向,以使buffer数据与textureTransform作用后纹理的方向一致,该参数仅用于AI算法检测,不会改变buffer的方向或镜像属性 +@property (nonatomic, assign) TRANSFORM_MATRIX bufferTransform; + +// 设置输入pixelBuffer/imageBuffer的旋转方向,以使buffer数据与textureTransform作用后纹理的方向一致,该参数仅用于AI算法检测,不会改变buffer的方向或镜像属性 +@property (nonatomic, assign) TRANSFORM_MATRIX outputTransform; + +// 输出的纹理 +@property (nonatomic, assign) FUTexture texture; + +// 输出的 pixelBuffer +@property (nonatomic, assign) CVPixelBufferRef pixelBuffer; + +// 输出的 imageBuffer,内部数据与输入的 imageBuffer 一致。 +@property (nonatomic, assign) FUImageBuffer imageBuffer; + +@end +``` + + + +### 内部渲染回调 + +FURenderKit 定义了一个 FURenderKitDelegate 协议,该协议包含三个接口,一个是使用内部相机时即将处理图像时输入回调,另一个是使用内部相机时处理图像后的输出回调 + +```objective-c +// 使用内部相机时,即将处理图像时输入 +- (void)renderKitWillRenderFromRenderInput:(FURenderInput *)renderInput; + +// 使用内部相机时,处理图像后的输出 +- (void)renderKitDidRenderToOutput:(FURenderOutput *)renderOutput; + +// 使用内部相机时,内部是否进行render处理,返回NO,renderKitDidRenderToOutput接口将直接输出原图. YES,renderKitDidRenderToOutput接口输出带渲染道具的图 +- (BOOL)renderKitShouldDoRender; +``` + +### 外部渲染接口 + +FURenderKit 提供了下面的接口处理图像,用户可以在外部将图像传入该接口获取处理之后的图像。 + +``` +- (FURenderOutput *)renderWithInput:(FURenderInput *)input; +``` + +示例如下: + +```objective-c +FURenderInput *renderInput = [[FURenderInput alloc] init]; +renderInput.pixelBuffer = pixelBuffer; +FURenderOutput *renderOutput = [[FURenderKit shareRenderKit] renderWithInput:renderInput]; +return renderOutput.pixelBuffer; +``` + + + +## 开启关闭相机 + +```objective-c +#pragma mark - internalCamera + +- (void)startInternalCamera; + +- (void)stopInternalCamera; +``` + + + +## 根据证书校验模块权限 + +```objective-c +/** + * 获取证书里面的模块权限 + * code get i-th code, currently available for 0 and 1 + */ ++ (int)getModuleCode:(int)code; +``` + + + +## 销毁 + +#### 内部会销毁相机、各个的渲染模型(美颜、美妆、道具贴纸等),释放ai资源以及销毁底层相关的资源 + +```objective-c +- (void)destroy +``` + + + +## 清除 + +#### 和destory 区别 只会清除各个的渲染模型(美颜、美妆、道具贴纸等),其他不处理 + +```objective-c ++ (void)clear; +``` + + + +## 录像和拍照 + +```objective-c +#pragma mark - Record && capture +//手指按下录像按钮调用 ++ (void)startRecordVideoWithFilePath:(NSString *)filePath; +//手指松开录像按钮调用 ++ (void)stopRecordVideoComplention:(void(^)(NSString *filePath))complention; +//捕获当前帧作为图片 ++ (UIImage *)captureImage; +``` + + + +## FUAIKit + +AI能力相关的功能都通过FUAIKit 加载或获取 + +部分接口和属性介绍 + +```objective-c +@property (nonatomic, assign) int maxTrackFaces; // 设置最大的人脸跟踪个数 default is 1 + +@property (nonatomic, assign, readonly) int trackedFacesCount; // 跟踪到的人脸个数 + +@property (nonatomic, assign) FUFaceProcessorDetectMode faceProcessorDetectMode; // 图像加载模式 default is FUFaceProcessorDetectModeVideo + +@property (nonatomic, assign) BOOL asyncTrackFace; //设置是否进行异步人脸跟踪 + +//加载 AI bundle ++ (void)loadAIModeWithAIType:(FUAITYPE)type dataPath:(NSString *)dataPath; +//卸载 AI bundle ++ (void)unloadAIModeForAIType:(FUAITYPE)type; +//卸载所有 AI bundle ++ (void)unloadAllAIMode; + ++ (BOOL)loadedAIType:(FUAITYPE)type; +//加载舌头驱动 ++ (void)loadTongueMode:(NSString *)modePath; +//脸部类型 单独加载 ++ (void)setTrackFaceAIType:(FUAITYPE)type; + ++ (int)trackFaceWithInput:(FUTrackFaceInput *)trackFaceInput; +// Reset ai model HumanProcessor's tracking state. ++ (void)resetHumanProcessor; +//get ai model HumanProcessor's tracking result. ++ (int)aiHumanProcessorNums; +``` + +其他接口参考 FUAIKit.h + + + +## 功能模块: 功能模块加载的bundle 名称可以自己定义,示例代码名称根据自己定义的名称来加载 + +### 美颜 + +#### 初始化美颜 + +使用 FUBeauty 类初始化美颜实例,并将美颜实例赋值给 FURenderKit 即可, 内部是同步线程串行队列处理,处理会耗时。外部可以自己用线程管理。 + +```objective-c +NSString *path = [[NSBundle mainBundle] pathForResource:@"face_beautification" ofType:@"bundle"]; +FUBeauty *beauty = [[FUBeauty alloc] initWithPath:path name:@"face_beautification"]; +[FURenderKit shareRenderKit].beauty = beauty; + +``` + +#### 修改美颜参数 + +可以直接修改 FUBeauty 的相关属性,也可以初始化一个新的美颜实例,修改好参数后直接赋值给 FURenderKit;修改属性示例如下,属性对应的含义详见FUBeauty.h 注释: + +```objective-c +beauty.blurUseMask = NO; +滤镜FileName 对应的value 值FURenderKit 已经做了对应的映射关系,直接调用即可 +beauty.filterLevel = 1; +beauty.filterName = FUFilterOrigin; + +beauty.colorLevel = 0.3; +beauty.redLevel = 0.3; +beauty.blurLevel = 0.7*6; +beauty.heavyBlur = 0; +beauty.blurType = 2; + +beauty.sharpen = 0.2; +beauty.eyeBright = 0.0; +beauty.toothWhiten = 0.0; + +beauty.removePouchStrength = 0.0; +beauty.removeNasolabialFoldsStrength = 0.0; + +beauty.faceShapeLevel = 1.0; +beauty.changeFrames = 0; +beauty.faceShape = 4; + +beauty.eyeEnlarging = 0.4; +beauty.cheekThinning = 0.0; +beauty.cheekV = 0.5; +beauty.cheekNarrow = 0; +beauty.cheekSmall = 0; +beauty.intensityNose = 0.5; +beauty.intensityForehead = 0.3; +beauty.intensityMouth = 0.4; +beauty.intensityChin = 0.3; +beauty.intensityPhiltrum = 0.5; +beauty.intensityLongNose = 0.5; +beauty.intensityEyeSpace = 0.5; +beauty.intensityEyeRotate = 0.5; +beauty.intensitySmile = 0.0; +beauty.intensityCanthus = 0.5; +beauty.intensityCheekbones = 0; +beauty.intensityLowerJaw= 0.0; +beauty.intensityEyeCircle = 0.0; +``` + + + +### 贴纸 + +使用 FUSticker或其子类初始化贴纸实例,FURenderKit 内部提供了一个 FUStickerContainer 类来管理贴纸,只需将贴纸实例添加、替换到 FUStickerContainer 实例即可实现贴纸的显示,然后可以掉用 FUStickerContainer 的删除接口移除贴纸效果。示例如下: + +```objective-c +// 添加 +NSString *path = [[NSBundle mainBundle] pathForResource:@"sdlu" ofType:@"bundle"]; +FUSticker *sticker = [[FUSticker alloc] initWithPath:path name:@"sticker"]; +[[FURenderKit shareRenderKit].stickerContainer addSticker:sticker]; + +// 替换 +NSString *path1 = [[NSBundle mainBundle] pathForResource:@"gaoshiqing" ofType:@"bundle"]; +FUSticker *sticker1 = [[FUSticker alloc] initWithPath:path1 name:@"sticker"]; +[[FURenderKit shareRenderKit].stickerContainer replaceSticker:sticker withSticker:sticker1 completion:nil]; + +// 删除 +[[FURenderKit shareRenderKit].stickerContainer removeSticker:sticker1]; +``` + +带属性的特殊贴纸说明: + +```objective-c +1. 人像分割 FUAISegment - 外轮廓bundle 的用法 +NSString *path = [[NSBundle mainBundle] pathForResource:@"human_outline" ofType:@"bundle"]; +FUAISegment *outline = [FUAISegment alloc] initWithPath:path name:@"sticker"]; +outline.lineGap = 2.8; //轮廓分割线和人之间的间距 +outline.lineSize = 2.8; //轮廓分割线宽度 +outline.lineColor = FUColorMake(255/255.0, 180/255.0, 0.0, 0.0); //线的颜色 +[[FURenderKit shareRenderKit].stickerContainer addSticker:outline]; + +1. 人像分割 FUAISegment - 自定义背景视频 +NSString *path = [[NSBundle mainBundle] pathForResource:@"bg_segment" ofType:@"bundle"]; +FUAISegment *segment = [FUAISegment alloc] initWithPath:path name:@"sticker"]; +segment.videoPath = @“背景视频路径”;//NSURL or NSString +[segment startVideoDecode]; +//获取视频解析的第一帧图片 +UIImage *image = [segment readFirstFrame]; +[[FURenderKit shareRenderKit].stickerContainer replaceSticker:outline withSticker:segment completion:nil]; + +1. 人像分割 FUAISegment - 自定义背景照片 +segment.setBackgroundImage = @"自定义图片"; + +2. FUAnimoji - 表情 +NSString *path = [[NSBundle mainBundle] pathForResource:@"animoji" ofType:@"bundle"]; +FUAnimoji *animoji = [FUAnimoji alloc] initWithPath:path name:@"animoji"]; +animoji.flowEnable = YES; //卡通表情是否跟随人物移动而移动, YES,跟随, NO 不跟随 + +3. FUGesture -- 手势 +NSString *path = [[NSBundle mainBundle] pathForResource:@"fugesture" ofType:@"bundle"]; +FUGesture *gesture = [FUGesture alloc] initWithPath:path name:@"animoji"]; +gesture.handOffY = YES; //可以单独调整比心的偏移量,> 0 向上,< 0 向下 + +4. FUMusicFilter - 音乐滤镜 +NSString *path = [[NSBundle mainBundle] pathForResource:@"music" ofType:@"bundle"]; +FUMusicFilter *music = [FUMusicFilter alloc] initWithPath:path name:@"music"]; +music.musicPath = "音乐文件路径"; +``` + + + + + +### 海报换脸 + +使用 FUPoster 初始化一个海报换脸实例,与其他功能不同,不需要将海报换脸实例赋值给 FURenderKit,直接使用海报换脸实例掉用相关接口处理图像即可 + +示例代码: + +```objective-c +[FUAIKit shareKit].maxTrackFaces = 4; + +[FUAIKit shareKit].faceProcessorDetectMode = 0; + +NSString *path = [[NSBundle mainBundle] pathForResource:@"change_face" ofType:@"bundle"]; +FUPoster *poster = [[FUPoster alloc] initWithPath:path name:@"change_face"]; +poster.delegate = "具体实现代理的类"; + +[poster renderWithInputImage:"需要换脸的image" templateImage: "海报image"]]; +``` + +#### 接口说明 + +```objective-c +/** + * inputImage 需要替换包含人脸图片 + * templateImage 背景模板包含人脸的图片 + */ +- (void)renderWithInputImage:(UIImage *)inputImage templateImage:(UIImage *)templateImage; + +/** + * 替换背景图片 + */ +- (void)changeTempImage:(UIImage *)tempImage; + +/** + * 计算人脸区域 + */ ++ (CGRect)cacluteRectWithIndex:(int)index height:(int)originHeight width:(int)orighnWidth; + +/** + * 选择某张具体的人脸, + * faceId 通过 checkPosterWithFaceIds:rectsMap 获取 + */ +- (void)chooseFaceID:(int)faceID; + + +@protocol FUPosterProtocol + +@optional +/** + * 检测输入照片人脸结果异常调用, 用于处理异常提示 UI逻辑. + * code: -1, 人脸异常(检测到人脸但是角度不对返回-1),0: 未检测到人脸 + */ +- (void)poster:(FUPoster *)poster inputImageTrackErrorCode:(int)code; + +/** + * 检测海报模版背景图片人脸结果(异常调用) + * code: -1, 人脸异常(检测到人脸但是角度不对返回-1) 0: 未检测到人脸 + */ +- (void)poster:(FUPoster *)poster tempImageTrackErrorCode:(int)code; + +/** + * 输入照片检测到多张人脸回调此方法,用于UI层绘制多人脸 UI + */ +- (void)poster:(FUPoster *)poster trackedMultiFaceInfos:(NSArray *)faceInfos; + +/** + * inputImage 和 蒙板image 合成的结果回调 + * data : 海报蒙板和照片合成之后的图片数据 + */ + +- (void)poster:(FUPoster *)poster didRenderToImage:(UIImage *)image; + +/** + * 设置模板弯曲度,需要外部传入 + * return double 对象 + */ +- (NSNumber *)renderOfWarp; +``` + + + +## 其他模块 + +FURenderKit 定义了不同功能的模型类,除了贴纸和海报换脸,其他功能的使用与美颜类似,用户只需要初始化对应功能的实例,并赋值给 FURenderKit ,然后通过修改对应示例的属性或调用相关接口即可实现功能的配置,具体文档待补充。 + + diff --git "a/docs/\347\247\273\345\212\250\347\253\257\346\226\207\346\241\243/Nama-\344\270\232\345\212\241\346\250\241\345\236\213\346\226\207\346\241\243\350\257\264\346\230\216.md" "b/docs/\347\247\273\345\212\250\347\253\257\346\226\207\346\241\243/Nama-\344\270\232\345\212\241\346\250\241\345\236\213\346\226\207\346\241\243\350\257\264\346\230\216.md" new file mode 100644 index 00000000..3f947210 --- /dev/null +++ "b/docs/\347\247\273\345\212\250\347\253\257\346\226\207\346\241\243/Nama-\344\270\232\345\212\241\346\250\241\345\236\213\346\226\207\346\241\243\350\257\264\346\230\216.md" @@ -0,0 +1,874 @@ + + +---- + +创建时间: 2020-01-22 + +---- + +### 1.0 Nama基础模型 FUItem + +* 说明: 关于nama所有item部分说明: 所有业务模块item底层都基于FUItem 来实现,FUItem 实现了和公司内部库通信功能,中间有一层缓存FUParamsCacheItem 主要为了缓存FUParam ,所以后续文档需要缓存的item都会继承于FUParamsCacheItem,不需要缓存则直接继承FUItem,后续不会在每个业务模块item 里面解释一遍。 + +* Nama Item 的属性是在键值对基础上进行属性一层封装,更加方便的设置想要的功能。***如果设置项过多建议直接使用封装的键值对setParam或setParam:forName:paramType:方法设置,目前会针对美颜、美妆等封装一层key-value接口提供方便设置,后续会在每个item做详细说明*** + +* FURenderKit.h 文件声明了所有NamaItem的属性或容器,实际业务开发在初始化之后赋值给 FURenderKit的对应属性值即可. 不用NamaItem 需要把FURenderKit对应的item 设置为nil,FURenderKit 内部就移除对应的效果 + + * 示例代码 + + ```objective-c + //美颜示例 + NSString *path = [[NSBundle mainBundle] pathForResource:@"face_beautification" ofType:@"bundle"]; + FUBeautiItem *item = [[FUBeautiItem alloc] initWithPath:path name:@"face_beautification" autoLoad:YES]; + self.beautiyItem = item; + //加载item + [FURenderKit shareRenderKit].beautifulItem = item; + + //移除item + [FURenderKit shareRenderKit].beautifulItem = nil; + + //道具贴纸示例 + NSString *path = [[NSBundle mainBundle] pathForResource:@"baozi" ofType:@"bundle"]; + FUStickerItem *item = [[FUStickerItem alloc] initWithPath:path name:@"baozi" autoLoad:YES]; + self.arMaskItem = item; + //添加到stickerContainer 这个道具贴纸容器中,内部会自动处理叠加道具, + [[FURenderKit shareRenderKit].stickerContainer addStickerItem:item]; + + //如果不希望叠加 需要移除对应的道具对象 + [[FURenderKit shareRenderKit].stickerContainer removeStickerItem:item]; + + //按照加载路径移除 + [[FURenderKit shareRenderKit].stickerContainer removeStickerItemForPath:item.path]; + + //释放所有加载的道具 + [[FURenderKit shareRenderKit].stickerContainer removeAllSticks]; + + ``` + + + + + +#### 1.1 接口说明 #### + +* 根据道具路径创建道具对象,可支持自动加载 + +``` objective-c +/** +* @param path 道具路径 +* @param autoLoad 是否自动加载道具 +**/ + ++ (instancetype)initWithPath:(NSString *)path name:(nullable NSString *)name autoLoad:(BOOL)autoLoad; + +/** +* 实例方法 +**/ +- (instancetype)itemWithPath:(NSString *)path name:(nullable NSString *)name autoLoad:(BOOL)autoLoad; +``` + +* 加载ItemID + +```objective-c +带回调 +- (void)loadAsync:(void (^)(BOOL successed))completion; + +不带回调 +- (BOOL)loadSync; +``` + + + +* 设置键值对参数,封装成 FUParam 对象 + +```objective-c + +- (int)setParam:(FUParam *)param; +``` + + + +* 参数名称具体可查询对应模块的[文档](http://192.168.0.118/quanlongli/FULiveDemo/tree/master/docs) + +```objective-c + 设置键值对参数 + + /** +* @param param 参数值 +* @param name 参数名称 + +- (int)setParam:(id)param forName:(NSString *)name paramType:(FUParamType)paramType; +``` + + + +* 根据参数名称和类型来获取当前参数值 + +``` +\- (**id**)getParamForName:(NSString *)name paramType:(FUParamType)paramType; +``` + +#### 1.2 属性说明 #### + +| 属性名 | 字段类型 | 说明 | +| ------------- | -------- | ------------------------------------------ | +| name | NSString | 道具名称 | +| path | NSString | 道具绝对路径 | +| itemID | int | 只读,内部生成的道具ID | +| loaded | BOOL | 是否已经加载 | +| binded | BOOL | 是否已经绑定,用于绑定到其他道具的普通道具 | +| supportARMode | BOOL | 是否支持 AR 模式 | + +____ + +____ + +### 2.0 美颜 FUBeautiItem ### + +* 2.1.0 说明: 美颜模块继承自FUParamsCacheItem, 美颜模块分为主体和三个类扩展: 美肤(skin)、美型(shapre)、滤镜(Filter), 需要证书秘钥包含该功能才可以使用。 + +* 2.1.1 属性说明 + +| 属性名称 | 类型 | 说明 | key | +| --------- | ---- | ------------------------------------------------------------ | ---------- | +| heavyBlur | int | 朦胧磨皮开关,0为清晰磨皮,1为朦胧磨皮 | heavy_blur | +| blurType | int | 此参数优先级比heavyBlur低,在使用时要将heavy_blur设为0,0 清晰磨皮 1 朦胧磨皮 2精细磨皮 | blur_type | + +____ + +#### 2.2 美肤 FUBeautiItem (Skin) #### + +* 属性说明 + +| 属性名称 | 类型 | 说明 | key | +| ----------------------------- | ------ | ------------------------------------------------------------ | -------------------------------- | +| blurLevel | double | 精细磨皮,磨皮程度,取值范围0.0-6.0,默认6.0 | blur_level | +| colorLevel | double | 美白 取值范围 0.0-2.0,0.0为无效果,2.0为最大效果,默认值0.2 | color_level | +| redLevel | double | 红润 取值范围 0.0-2.0,0.0为无效果,2.0为最大效果,默认值0.5 | red_level | +| sharpen | double | 锐化 锐化程度,取值范围0.0-1.0,默认0.2 | sharpen | +| eyeBright | double | 亮眼 0.0-1.0, 0.0为无效果,1.0为最大效果,默认值1.0 亮眼为高级美颜功能,需要相应证书权限才能使用 | eye_bright | +| toothWhiten | double | 美牙 取值范围 0.0-1.0, 0.0为无效果,1.0为最大效果,默认值1.0 美牙为高级美颜功能,需要相应证书权限才能使用 | tooth_whiten | +| removePouchStrength | double | 去黑眼圈 范围0.0~1.0, 0.0为无效果,1.0最强,默认0.0 去黑眼圈为高级美颜功能,需要相应证书权限才能使用 | remove_pouch_strength | +| removeNasolabialFoldsStrength | double | 去法令纹 范围0.0~1.0, 0.0为无效果,1.0最强,默认0.0 去法令纹为高级美颜功能,需要相应证书权限才能使用 | remove_nasolabial_folds_strength | + +____ + +#### 2.3 美型 FUBeautiItem (Shap) #### + +* 属性说明 + +| 属性名称 | 类型 | 说明 | key | +| -------------------- | ------ | ------------------------------------------------------------ | -------------------- | +| faceShape | int | 变形取值 0:女神变形 1:网红变形 2:自然变形 3:默认变形 4:精细变形 | face_shape | +| changeFrames | int | 0为关闭 ,大于0开启渐变,值为渐变所需要的帧数 change_frames | change_frames | +| faceShapeLevel | double | 美型的整体程度由face_shape_level参数控制 取值范围 0.0-1.0, 0.0为无效果,1.0为最大效果,默认值1.0 face_shape_level | face_shape_level | +| cheekThinning | double | 瘦脸 瘦脸程度范围0.0-1.0 默认0.5 | cheek_thinning | +| cheekV | double | v脸程度范围0.0-1.0 默认0.0 | cheek_v | +| cheekNarrow | double | 窄脸程度范围0.0-1.0 默认0.0 | cheek_narrow | +| cheekSmall | double | 小脸程度范围0.0-1.0 默认0.0 | cheek_small | +| intensityCheekbones | double | 瘦颧骨程度范围0.0~1.0 1.0程度最强 默认0.0 | intensity_cheekbones | +| intensityLowerJaw | double | 瘦下颌骨程度范围0.0~1.0 1.0程度最强 默认0.0 | intensity_lower_jaw | +| eyeEnlarging | double | 大眼程度范围0.0-1.0 默认0.5 | eye_enlarging | +| intensityChin | double | 下巴调整程度范围0.0-1.0,0-0.5是变小,0.5-1是变大 默认0.5 | intensity_chin | +| intensityForehead | double | 额头调整程度范围0.0-1.0,0-0.5是变小,0.5-1是变大 默认0.5 | intensity_forehead | +| intensityNose | double | 瘦鼻程度范围0.0-1.0 默认0.0 | intensity_nose | +| intensityMouth | double | 嘴巴调整程度范围0.0-1.0,0-0.5是变大,0.5-1是变小 默认0.5 | intensity_mouth | +| intensityCanthus | double | 开眼角程度范围0.0~1.0 1.0程度最强 默认0.0 | intensity_canthus | +| intensityEyeSpace | double | 眼距调节范围0.0~1.0, 0.5-0.0变长,0.5-1.0变短 默认0.5 | intensity_eye_space | +| intensityEyeRotate | double | 眼睛角度调节范围0.0~1.0, 0.5-0.0逆时针旋转,0.5-1.0顺时针旋转 默认0.5 | intensity_eye_rotate | +| intensityLongNose | double | 鼻子长度调节范围0.0~1.0, 0.5-0.0变长,0.5-1.0变短 默认0.5 | intensity_long_nose | +| intensityPhiltrum | double | 人中调节范围0.0~1.0, 0.5-1.0变长,0.5-0.0变短 默认0.5 | intensity_philtrum | +| intensitySmile | double | 微笑嘴角程度范围0.0~1.0 1.0程度最强 默认0.0 | intensity_smile | +| intensity_eye_circle | double | 圆眼程度范围0.0~1.0 1.0程度最强 | intensity_eye_circle | + +____ + +#### 2.4 滤镜 #### + +* 属性说明 + +| 属性名 | 类型 | 说明 | key | +| ----------- | -------- | ------------------------------------------------------------ | ------------ | +| filterName | NSString | 取值为一个字符串,默认值为 “origin” ,origin即为使用原图效果 | filter_name | +| filterLevel | double | filter_level 取值范围 0.0-1.0,0.0为无效果,1.0为最大效果,默认值1.0 | filter_level | + +* 接口说明 + + key-value 设置属性 + + ```objective-c + - (void)setFilterValue:(double)value forKey:(FUFilter)filterKey; + ``` + + 通过key名称获取对应的value值 + + ````objective-c + - (double)filterValueForKey:(NSString *)filterForKey; + ```` + + 获取所有的key名称 + + ````objective-c + - (NSArray *)allFilterKeys; + ```` + +* 滤镜键Key 可选范围 + + | Key | + | ------------ | + | origin | + | ziran1 | + | ziran2 | + | ziran3 | + | ziran4 | + | ziran5 | + | ziran6 | + | ziran7 | + | ziran8 | + | zhiganhui1 | + | zhiganhui2 | + | zhiganhui3 | + | zhiganhui4 | + | zhiganhui5 | + | zhiganhui6 | + | zhiganhui7 | + | zhiganhui8 | + | mitao1 | + | mitao2 | + | mitao3 | + | mitao4 | + | mitao5 | + | mitao6 | + | mitao7 | + | mitao8 | + | bailiang1 | + | bailiang2 | + | bailiang3 | + | bailiang4 | + | bailiang5 | + | bailiang6 | + | bailiang7 | + | fennen1 | + | fennen2 | + | fennen3 | + | fennen5 | + | fennen6 | + | fennen7 | + | fennen8 | + | lengsediao1 | + | lengsediao2 | + | lengsediao3 | + | lengsediao4 | + | lengsediao7 | + | lengsediao8 | + | lengsediao11 | + | nuansediao1 | + | nuansediao2 | + | gexing1 | + | gexing2 | + | gexing3 | + | gexing4 | + | gexing5 | + | gexing7 | + | gexing10 | + | gexing11 | + | xiaoqingxin1 | + | xiaoqingxin3 | + | xiaoqingxin4 | + | xiaoqingxin6 | + | heibai1 | + | heibai2 | + | heibai3 | + | heibai4 | + + + +---- + +___ + +### 3.0 美妆 (FUMakeUpItem) + +* 3.1.0 整体说明: 美妆模块包含组合妆和子妆,当业务层选中某组合装时候直接添加该组合妆对象(FUMakeUpSubject)实例赋值给美妆(FUMakeUpItem)实例的subjectItem属性即可。粉底、腮红、这些属性在美妆(FUMakeUpItem)实例上设置。 +* 3.1.1 属性说明 + +| 属性名称 | 类型 | 说明 | key | +| ------------- | ---- | ------------------------------------------------------------ | --------------- | +| isMakeUpOn | Int | 美妆开关,1开 0关 | is_makeup_on | +| isClearMakeup | int | 在解绑妆容时是否清空除口红以外的妆容,0表示不清空,1表示清空,口红可由强度进行设置 | is_clear_makeup | +| lipType | int | 口红类型 0雾面 2润泽 3珠光 6高性能(不支持双色) | lip_type | +| isTwoColor | int | 口红双色开关,0为关闭,1为开启,如果想使用咬唇,开启双色开关,并且将makeup_lip_color2的值都设置为0 | is_two_color | +| isFlipPoints | int | 点位镜像,0为关闭,1为开启 | is_flip_points | +| browWarpType | int | 眉毛变形类型 0柳叶眉 1一字眉 2远山眉 3标准眉 4扶形眉 5日常风 6日系风 | brow_warp_type | +| browWarp | int | 是否使用眉毛变形 ,1为开 0为关 | brow_warp | + +* 3.2 主题妆 FUMakeUpItem (Subject) + + * 属性说明 + + | 属性名称 | 类型 | 说明 | + | ------------- | --------------- | ------------------------------------------------------------ | + | subjectItem | FUMakeUpSubject | 组合装对象,通过bundle文件路径生成,此bundle包含该妆的所有局部妆(眼影、眉毛等)资源 | + | texBrow | FUItem | 眉毛对象 | + | texEye1 | FUItem | 眼影1对象 | + | texEye2 | FUItem | 眼影2对象 | + | texEye3 | FUItem | 眼影3对象 | + | texEye4 | FUItem | 眼影4对象 | + | texPupil | FUItem | 美瞳对象 | + | texEyeLash | FUItem | 睫毛对象 | + | texEyeLiner | FUItem | 眼线对象 | + | texBlusher1 | FUItem | 腮红1对象 | + | texBlusher2 | FUItem | 腮红2对象 | + | texFoundation | FUItem | 粉底对象 | + | texHighlight | FUItem | 高光对象 | + | texShadow | FUItem | 阴影对象 | + +* 3.3,0 图层混合 FUMakeUpItem (blend) + + * 属性说明 + + 统一说明: 所有眼妆和腮红妆容支持更改图层混合模式,现在的图层混合模式有两种,0为正片叠底,1为正常混合(alpha混合),2为叠加,3为柔光,默认为0。 + + | 属性名称 | 类型 | 说明 | key | + | ---------------- | ---- | ------------------- | ----------------------- | + | blendTexEye1 | int | 第1层眼影的混合模式 | blend_type_tex_eye | + | blendTexEye2 | int | 第2层眼影的混合模式 | blend_type_tex_eye2 | + | blendTexEye3 | int | 第3层眼影的混合模式 | blend_type_tex_eye3 | + | blendTexEye4 | int | 第4层眼影的混合模式 | blend_type_tex_eye4 | + | blendTexEyeLash | int | 睫毛的混合模式 | blend_type_tex_eyeLash | + | blendTexEyeLiner | int | 眼线的混合模式 | blend_type_tex_eyeLiner | + | blendTexBlusher1 | int | 第1层腮红的混合模式 | blend_type_tex_blusher | + | blendTexBlusher2 | int | 第2层腮红的混合模式 | blend_type_tex_blusher2 | + | blendTexTexPupil | int | 美瞳的混合模式 | blend_type_tex_pupil | + + + +* 3.4.0 子妆 FUMakeUpItem (Child) + + * 3.4.1 属性说明 + + | 属性名称 | 类型 | 说明 | key | + | ------------------- | ------ | -------- | --------------------------- | + | intensityFoundation | double | 粉底强度 | makeup_intensity_foundation | + | intensityBlusher | double | 腮红强度 | makeup_intensity_blusher | + | intensityEye | double | 眼影强度 | makeup_intensity_eyeBrow | + | intensityEyelash | double | 睫毛强度 | makeup_intensity_eyelash | + | intensityHighlight | double | 高光强度 | makeup_intensity_highlight | + | intensityShadow | double | 阴影强度 | makeup_intensity_shadow | + | intensityPupil | double | 美瞳强度 | makeup_intensity_pupil | + + * 3.4.2 接口说明 + + ````objective-c + /** + * 设置眉毛需 需要额外特殊处理, + * type : 眉毛变形类型 0柳叶眉 1一字眉 2远山眉 3标准眉 4扶形眉 5日常风 6日系风 + * enable, 眉毛是否变形开关, 0 关闭变形,1 开启变形 + */ + - (void)setEyeBrowValue:(double)value + eyeBrowtype:(int)type + enable:(int)enable; + ```` + + ```objective-c + /** + * 口红特殊处理 + * type: 0雾面 2润泽 3珠光 6高性能(不支持双色) + * enable 口红双色开关,0为关闭,1为开启,如果想使用咬唇,开启双色开关,并且将makeup_lip_color2的值都设置为0 + */ + - (void)setLipValue:(double)value + lipType:(int)type + enable:(int)enable + ``` + + ```objective-c + //键值对的形式设置 子妆的属性,主要是为了多个属性的情况下方便设置。效果和属性一致 + - (void)setChildValue:(double)value forKey:(FUMakeUpChildStrengthKey)key; + ``` + + ```objective-c + //获取当前所有子妆强度key值数组 + - (NSArray *)allMakeUpChildKeys; + ``` + + *** + + + +* 3.5.0 颜色 FUMakeUpItem (Color) + + * 3.5.1 属性说明 + + | 属性名称 | 类型 | 说明 | key | + | --------------- | ------- | ------------------------------------------------------------ | ----------------------- | + | foundationColor | FUColor | 粉底调色参数,数组的第四个值(对应alpha)为0时,会关闭粉底的调色功能,大于0时会开启 | makeup_foundation_color | + | lipColor | FUColor | 为口红颜色 | makeup_lip_color | + | lipColor2 | FUColor | 如果is_two_color为1,会启用这个颜色,外圈颜色为makeup_lip_color2,内圈颜色为makeup_lip_color,如果makeup_lip_color2都为0,则外圈为透明,即为咬唇效果 | makeup_lip_color2 | + | blusherColor | FUColor | 第一层腮红调色参数,数组的第四个值(对应alpha)为0时,会关闭这一层腮红的调色功能,大于0时会开启 | makeup_blusher_color | + | eyeBrowColor | FUColor | 眉毛调色参数,数组的第四个值(对应alpha)为0时,会关闭眉毛的调色功能,大于0时会开启 | makeup_eyeBrow_color | + | eyeLinerColor | FUColor | 眼线调色参数,数组的第四个值(对应alpha)为0时,会关闭眼线的调色功能,大于0时会开启 | makeup_eyeLiner_color | + | eyelashColor | FUColor | 睫毛调色参数,数组的第四个值(对应alpha)为0时,会关闭睫毛的调色功能,大于0时会开启 | makeup_eyelash_color | + | highlightColor | FUColor | 高光调色参数,数组的第四个值(对应alpha)为0时,会关闭高光的调色功能,大于0时会开启 | makeup_highlight_color | + | shadowColor | FUColor | 阴影调色参数,数组的第四个值(对应alpha)为0时,会关闭阴影的调色功能,大于0时会开启 | makeup_shadow_color | + | pupilColor | FUColor | 美瞳调色参数,数组的第四个值(对应alpha)为0时,会关闭美瞳的调色功能,大于0时会开启 | makeup_pupil_color | + + * 3.5.2 接口说明 + + ```objective-c + /** + * 眼影特殊处理 + * //如果is_two_color为1,会启用这个颜色,外圈颜色为makeup_lip_color2,内圈颜色为makeup_lip_color,如果makeup_lip_color2都为0,则外圈为透明,即为咬唇效果 + * makeup_eye_color:[0.0,0.0,0.0,0.0],//第一层眼影调色参数,数组的第四个值(对应alpha)为0时,会关闭这层的调色功能,大于0时会开启 + * makeup_eye_color2:[0.0,0.0,0.0,0.0],//第二层眼影调色参数,数组的第四个值(对应alpha)为0时,会关闭这层的调色功能,大于0时会开启 + * makeup_eye_color3:[0.0,0.0,0.0,0.0],//第三层眼影调色参数,数组的第四个值(对应alpha)为0时,会关闭这层的调色功能,大于0时会开启 + * makeup_eye_color4:[0.0,0.0,0.0,0.0],//第四层眼影调色参数,数组的第四个值(对应alpha)为0时,会关闭这层的调色功能,大于0时会开启 + */ + - (void)setEyeColor:(FUColor)color + color1:(FUColor)color1 + color2:(FUColor)color2 + color3:(FUColor)color3; + ``` + + ```objective-c + //键值对的形式设置颜色属性 + - (void)setColor:(FUColor)color forKey:(FUMakeUpColor)colorKey + ``` + + ```objective-c + //获取当前所有colorKey数组 + - (NSArray *)allFUMakeUpColorKeys; + ``` + + * 3.6.0 人脸点位 FULightMakeUpItem (landMark) + + * 属性说明 + + | 属性名称 | 类型 | 说明 | key | + | ------------- | ---------- | ------------------------------------------------------------ | --------------- | + | isUserFix | int | 这个参数控制是否使用修改过得landmark点,如果设为1为使用,0为不使用 | is_use_fix | + | fixMakeUpData | FULandMark | 这个参数为一个数组,需要客户端传递一个数组进去,传递的数组的长度为 150*人脸数,也就是将所有的点位信息存储的数组中传递进来。 | fix_makeup_data | + + + +*** + +*** + +### 4.0 轻美妆 (FULightMakeUpItem) + +* 4.1.0属性说明 + + | 属性名称 | 类型 | 说明 | key | + | --------------- | ---- | ------------------------------------------------------------ | --------------- | + | isMakeUpOn | int | 美妆开关 1 开 0 关 | is_makeup_on | + | lipType | int | 口红类型 0雾面 2润泽 3珠光 6高性能(不支持双色) | lip_type | + | isTwoColor | int | 口红双色开关,0为关闭,1为开启,如果想使用咬唇,开启双色开关,并且将makeup_lip_color2的值都设置为0 | is_two_color | + | makeup_lip_mask | int | 嘴唇优化效果开关,1 开 0 关 | makeup_lip_mask | + +* 接口说明 + + ```objective-c + //图片纹理形式添加,底部调用fuCreateTexForItem接口 + - (void)setLightMakeUpImage:(UIImage *)image forKey:(FULightMakeUpTextureKey)key; + ``` + + ```objective-c + //获取所有纹理图片key数组 + - (NSArray *)allImageMakeUpKeys; + ``` + +* 4.2.0 子妆 FULightMakeUpItem (Child) + + * 4.2.1 属性说明 + + | 属性说明 | 类型 | 说明 | key | + | ----------------- | ------ | -------- | ------------------------- | + | intensityBlusher | double | 腮红强度 | makeup_intensity_blusher | + | intensityEye | double | 眼影强度 | makeup_intensity_eye | + | intensityEyeLiner | double | 眼线强度 | makeup_intensity_eyeLiner | + | intensityEyelash | double | 睫毛强度 | makeup_intensity_eyelash | + | intensityPupil | double | 美瞳强度 | makeup_intensity_pupil | + | intensityEyeBrow | double | 眉毛强度 | makeup_intensity_eyeBrow | + + * 4.2.2 接口说明 + + ```objective-c + /** + * 口红特殊处理 + * type: 0雾面 2润泽 3珠光 6高性能(不支持双色) + * enable 口红双色开关,0为关闭,1为开启,如果想使用咬唇,开启双色开关,并且将makeup_lip_color2的值都设置为0 + */ + - (void)setLipType:(int)type enable:(int)enable; + ``` + +* 4.3.0 FULightMakeUpItem (Color) + + * 属性说明 + + | 属性说明 | 类型类型 | 说明 | key | + | -------------- | -------- | --------------------------------------- | ---------------- | + | makeUpLipColor | double | [0,0,0,0] //长度为4的数组,rgba颜色值 | makeup_lip_color | + + + +* 4.4.0 人脸点位 FUMakeUpItem (landMark) + + * 属性说明 + + | 属性名称 | 类型 | 说明 | key | + | ------------- | ---------- | ------------------------------------------------------------ | --------------- | + | isUserFix | int | 这个参数控制是否使用修改过得landmark点,如果设为1为使用,0为不使用 | is_use_fix | + | fixMakeUpData | FULandMark | 这个参数为一个数组,需要客户端传递一个数组进去,传递的数组的长度为 150*人脸数,也就是将所有的点位信息存储的数组中传递进来。 | fix_makeup_data | + + + +*** + +*** + +### 5.0 海报换脸 FUPoster ### + +* 接口说明 + +```objective-c +/** + * inputImage 需要替换包含人脸图片 + * templateImage 背景模板包含人脸的图片 + * 特殊说明:该方法内部会自动检测需要替换的图像inputImage 和 templateImage海报模板的图片人脸是否合法,如果都合法并且都只有一张人脸,自动进行人脸替换合成操作,调用者可以直接在renderResultWithImageData代理方法里面直接获取到已经渲染融合后的UIImage, + 其他情况(多人脸)会根据协议FUPosterProtocol的回调方法进行业务处理。 + */ +- (void)renderWithInputImage:(UIImage *)inputImage templateImage:(UIImage *)templateImage +``` + + + +```objective-c +/** + * 替换海报蒙版背景图片 + */ +- (void)changeTempImage:(UIImage *)tempImage; + +``` + +```objective-c +/** + * 选择某张具体的人脸, + * faceId 通过 checkPosterWithFaceIds:rectsMap获取 + */ +- (void)chooseFaceIds:(int)faceId; +``` + +```objective-c +/** + * 特殊蒙板需要设置弯曲度 + */ +@property (nonatomic, copy) void(^WarpBlock)(NSNumber *warp); +``` + +```objective-c +/** + * 检测输入照片人脸结果异常调用, 用于处理异常提示 UI逻辑. + * code: -1, 人脸异常(检测到人脸但是角度不对返回-1),0: 未检测到人脸 + */ +- (void)checkInputFaceWithResultCode:(int)code; +``` + +```objective-c +/** + * 输入照片检测到多张人脸回调此方法,用于UI层绘制多人脸 UI + */ +- (void)checkPosterWithFaceInfos:(NSArray *)faceInfos; +``` + +```objective-c +/** + * 检测海报模版背景图片人脸结果(异常调用) + * code: -1, 人脸异常(检测到人脸但是角度不对返回-1) 0: 未检测到人脸 + */ +- (void)checkTempImageWithResultCode:(int)code; +``` + +```objective-c +/** + * inputImage图片 和 海报蒙板图片合成的结果回调 + * data : inputImage图片和海报蒙板图片合成之后的图片数据 + */ +- (void)renderResultWithImageData:(UIImage *)data; +``` + +*** + +*** + +### 6.0 绿幕 FUGreenScreenItem + +* 接口说明 + +```objective-c +/** + * 根据传入的图进和点位进行取色,获取到的颜色需要生效直接设置 self.keyColor + */ ++ (UIColor *)pixelColorWithmage:(UIImage *)originImage point:(CGPoint)point; +``` + +```objective-c +/** + * 根据传入的CVPixelBufferRef和点位进行取色 + */ ++ (UIColor *)pixelColorWithPixelBuffer:(CVPixelBufferRef)buffer point:(CGPoint)point; +``` + +```objective-c +/** + * 绿幕背景视频设置,内部逐帧解析渲染。 + */ +- (void)setUpVideoDecodeWithUrl:(NSURL *)url; + +``` + +```objective-c +/** + * 取消视频播放,内部停止渲染视频帧 + */ +- (void)stopVideoDecode; +``` + +* 属性说明 + +| 属性名称 | 类型 | 说明 | key | +| ------------ | ------- | ------------------------------------------------------------ | ---------------- | +| keyColor | FUColor | 设置绿幕取色, 颜色值按照十六进制大小设置 ex: RGBA (255.0, 255.0, 255.0, 1.0) | key_color | +| chromaThres | double | | chroma_thres | +| chromaThrest | double | | chroma_thres_T | +| alphal | double | | alpha_L | +| center | CGPoint | 当前图片偏移量 | start_x、start_y | +| scale | float | 图片宽高放大值 | end_x、end_y | +| rotationMode | int | 当前设备方向0、1、2、3 | rotation_mode | +| isBgra | int | | is_bgra | +| cutouting | BOOL | 当前是否正在进行抠图,抠图就停止绿慕渲染 | | + +*** + +*** + +### 7.0 道具贴纸 FUStickerItem + +* 说明 + + 无特殊设置项的道具直接使用此类实例化 + + FUMusicFilterItem音乐滤镜、FUAnimojiItem 表情、FUGestureItem手势道具、FUAISegmentItem 人像分割 用各自具体子类实例化 + +*** + +*** + +### 8.0 音乐滤镜 FUMusicFilterItem :FUStickerItem + +* 接口说明 + +```objective-c +/** + * 立即播放音乐 + */ +- (void)playWithMusicName:(NSString *)music; +``` + +```objective-c +/** + * 设置音乐名称,但不播放,等到乐滤镜在底层苦渲染时自动播放音乐 + * 同步音乐和渲染效果 + */ +- (void)setMusicName:(NSString *)music; +``` + +```objective-c +/** + * 播放当前已经设置的音乐 + */ +- (void)play; + +/** + * 继续播放 + */ +- (void)resume; +/** + * 停止播放 + */ +- (void)stop; +/** + * 暂停 + */ +- (void)pause; +/** + * 获取播放进度 + */ +- (float)playProgress; +/** + * 获取当前媒体播放时间 + */ +- (NSTimeInterval)currentTime; +``` + +*** + +*** + +### 9.0 表情 FUAnimojiItem + +* 属性说明 + +| 属性名称 | 类型 | 说明 | key | +| ---------- | ---- | ---------------- | ------------------------------------------------ | +| flowEnable | int | 表情是否跟随人脸 | @"{\"thing\":\"\",\"param\":\"follow\"}" | + +*** + +*** + +### 10.0 手势道具 FUGestureItem + +* 属性说明 + +| 属性名称 | 类型 | 说明 | key | +| -------- | ------ | ---------------------- | -------- | +| rotMode | double | 设备方向参数 | rotMode | +| handOffY | double | 调整手部比星的位置参数 | handOffY | + +*** + +*** + +### 11.0 人像分割 FUAISegmentItem + +* 属性说明 + +| 属性名称 | 类型 | 说明 | key | +| ---------- | ---- | -------------- | ----------- | +| cameraMode | int | 设置相机前后置 | camera_mode | + +*** + +*** + +### 12.0 道具叠加容器 FUStickerContainer + +* 接口说明 + +```objective-c +/** + * 添加item,移除当前已经加载的所有item + * flag: YES 移除,NO 叠加(不移除) + */ +- (void)addStickerItem:(FUStickerItem *)item removeCurrent:(BOOL)flag; +/** +* 单个FUStickerItem操作接口 +* 内部已经加锁,外部无序需处理 +*/ +- (void)addStickerItem:(FUStickerItem *)item; +- (void)removeStickerItem:(FUStickerItem *)item; +- (void)updateStickerItem:(FUStickerItem *)item; +//按照路径移除 +- (void)removeStickerItemForPath:(NSString *)itemPath; +``` + +```objective-c +/** +* 多个FUStickerItem操作接口 +* 内部已经加锁,外部无序需处理 +*/ +- (void)addStickerItems:(NSArray *)items; +- (void)removeStickerItems:(NSArray *)items; +- (void)updateStickerItems:(NSArray *)items; +- (void)removeStickerItemsForPaths:(NSArray *)itemPaths; +``` + +```objective-c +/** +* 移除所有已经添加的FUStickerItem +* 内部已经枷锁,外部无需处理 +*/ +- (void)removeAllSticks; +/** +* 获取所有已经添加的FUStickerItem +*/ +- (NSArray *)allStickerItemItems; +``` + +*** + +*** + +### 13.0 动漫滤镜 FUAnimationFilterItem + +* 接口说明 + +| 属性名称 | 类型 | 说明 | key | +| -------- | ------ | -------------------------------------- | ----- | +| style | double | 范围 0.0 - 7.0,对应不同的动漫滤镜效果 | style | + +* style 值介绍 + + | style | Value | + | ----- | ---------------------- | + | -1 | 移除滤镜,使用原图效果 | + | 0 | 动漫 | + | 1 | 素描 | + | 2 | 人像 | + | 3 | 油画 | + | 4 | 沙画 | + | 5 | 钢笔画 | + | 6 | 铅笔画 | + | 7 | 涂鸦 | + +*** + +*** + +### 14.0 美发 FUHairItem + +* 属性说明 + +| 属性名称 | 类型 | 说明 | key | +| -------------- | ---------- | ------------------------------------------------------------ | ---------------------- | +| index | int | 单色美发道具 index 对应的值范围 0 - 7,渐变色美发道具,index对应的值范围 0 - 4 | Index | +| strength | double | 0对应无效果,1对应最强效果,中间连续过渡。 | Strength | +| normalColor | FULABColor | 内部会分别设置LAB颜色色值 | Col_L、Col_A、Col_B | +| shine | double | 正常头发的亮度值 | Shine | +| gradientColor0 | FULABColor | 渐变色头发颜色设置,内部会分别设置LAB颜色色值 | Col0_L、Col0_A、Col0_B | +| gradientColor1 | FULABColor | | Col1_L、Col1_A、Col1_B | +| shine0 | double | | Shine0 | +| shine1 | double | | Shine1 | + +*** + +*** + +### 15.0 美体 FUBodyBeautyItem + +* 属性说明 + +| 属性名称 | 类型 | 说明 | key | +| -------------------- | ------ | ------------------------------------------------------------ | -------------------- | +| bodySlimStrength | double | 瘦身:0.0表示强度为0,值越大,强度越大,瘦身效果越明显,默认为0.0 | bodySlimStrength | +| LegSlimStrength | double | 长腿:0.0表示强度为0,值越大,腿越长,默认为0.0 | LegSlimStrength | +| WaistSlimStrength | double | 瘦腰:0.0表示强度为0,值越大,腰越细,默认为0.0 | WaistSlimStrength | +| ShoulderSlimStrength | double | 美肩:0.5表示强度为0,0.5到1.0,值越大,肩膀越宽,0.5到0.0,值越小,肩膀越窄,0.5为默认值 | ShoulderSlimStrength | +| HipSlimStrength | double | 美臀:0.0表示强度为0,值越大,强度越大, 提臀效果越明显,默认为0.0 | HipSlimStrength | +| clearSlim | int | 重置:清空所有的美体效果,恢复为默认值 | clearSlim | +| Debug | int | 是否开启debug点位,0表示关闭,1表示开启,默认关闭 | Debug | +| HeadSlim | double | 小头:0.0表示强度为0,值越大,小头效果越明显,默认为0.0 | HeadSlim | +| orientation | int | 方向参数 取值范围 0 - 3 | Orientation | + +*** + +*** + +### 16.0 动作识别 FUActionRecognition + +* 直接初始化实例即可,无需设置额外参数 + + + + +