Commit 31699c21 cgx

引入GKPhotoBrowser(YYImage)解决反馈图片查看问题

1 个父辈 2e89dba8
正在显示 33 个修改的文件 包含 3638 行增加125 行删除
...@@ -145,6 +145,16 @@ ...@@ -145,6 +145,16 @@
D0F8090428042A0B0097899F /* SafeSleepCell.m in Sources */ = {isa = PBXBuildFile; fileRef = D0F8090328042A0B0097899F /* SafeSleepCell.m */; }; D0F8090428042A0B0097899F /* SafeSleepCell.m in Sources */ = {isa = PBXBuildFile; fileRef = D0F8090328042A0B0097899F /* SafeSleepCell.m */; };
D0F80907280431100097899F /* UILabel+Extras.m in Sources */ = {isa = PBXBuildFile; fileRef = D0F80906280431100097899F /* UILabel+Extras.m */; }; D0F80907280431100097899F /* UILabel+Extras.m in Sources */ = {isa = PBXBuildFile; fileRef = D0F80906280431100097899F /* UILabel+Extras.m */; };
D0F82286280C44D10039F586 /* SetTableView.m in Sources */ = {isa = PBXBuildFile; fileRef = D0F82285280C44D10039F586 /* SetTableView.m */; }; D0F82286280C44D10039F586 /* SetTableView.m in Sources */ = {isa = PBXBuildFile; fileRef = D0F82285280C44D10039F586 /* SetTableView.m */; };
D0FAC41C281B817D00D4B859 /* GKLoadingView.m in Sources */ = {isa = PBXBuildFile; fileRef = D0FAC406281B817D00D4B859 /* GKLoadingView.m */; };
D0FAC41D281B817D00D4B859 /* GKPhotoBrowser.m in Sources */ = {isa = PBXBuildFile; fileRef = D0FAC40C281B817D00D4B859 /* GKPhotoBrowser.m */; };
D0FAC41E281B817D00D4B859 /* GKPhotoManager.m in Sources */ = {isa = PBXBuildFile; fileRef = D0FAC40F281B817D00D4B859 /* GKPhotoManager.m */; };
D0FAC41F281B817D00D4B859 /* UIScrollView+GKPhotoBrowser.m in Sources */ = {isa = PBXBuildFile; fileRef = D0FAC410281B817D00D4B859 /* UIScrollView+GKPhotoBrowser.m */; };
D0FAC420281B817D00D4B859 /* GKPhotoBrowserConfigure.m in Sources */ = {isa = PBXBuildFile; fileRef = D0FAC411281B817D00D4B859 /* GKPhotoBrowserConfigure.m */; };
D0FAC421281B817D00D4B859 /* GKPhotoView.m in Sources */ = {isa = PBXBuildFile; fileRef = D0FAC413281B817D00D4B859 /* GKPhotoView.m */; };
D0FAC422281B817D00D4B859 /* GKPanGestureRecognizer.m in Sources */ = {isa = PBXBuildFile; fileRef = D0FAC414281B817D00D4B859 /* GKPanGestureRecognizer.m */; };
D0FAC425281B817D00D4B859 /* GKPhotoBrowser.bundle in Resources */ = {isa = PBXBuildFile; fileRef = D0FAC41B281B817D00D4B859 /* GKPhotoBrowser.bundle */; };
D0FAC429281B865300D4B859 /* GKYYWebImageManager.m in Sources */ = {isa = PBXBuildFile; fileRef = D0FAC427281B865300D4B859 /* GKYYWebImageManager.m */; };
D0FAC662281BAACB00D4B859 /* YYAnimationImageView+Fix.m in Sources */ = {isa = PBXBuildFile; fileRef = D0FAC661281BAACB00D4B859 /* YYAnimationImageView+Fix.m */; };
/* End PBXBuildFile section */ /* End PBXBuildFile section */
/* Begin PBXFileReference section */ /* Begin PBXFileReference section */
...@@ -415,6 +425,26 @@ ...@@ -415,6 +425,26 @@
D0F80906280431100097899F /* UILabel+Extras.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "UILabel+Extras.m"; sourceTree = "<group>"; }; D0F80906280431100097899F /* UILabel+Extras.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "UILabel+Extras.m"; sourceTree = "<group>"; };
D0F82284280C44D10039F586 /* SetTableView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SetTableView.h; sourceTree = "<group>"; }; D0F82284280C44D10039F586 /* SetTableView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SetTableView.h; sourceTree = "<group>"; };
D0F82285280C44D10039F586 /* SetTableView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SetTableView.m; sourceTree = "<group>"; }; D0F82285280C44D10039F586 /* SetTableView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SetTableView.m; sourceTree = "<group>"; };
D0FAC406281B817D00D4B859 /* GKLoadingView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GKLoadingView.m; sourceTree = "<group>"; };
D0FAC407281B817D00D4B859 /* GKWebImageProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GKWebImageProtocol.h; sourceTree = "<group>"; };
D0FAC408281B817D00D4B859 /* GKPhotoManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GKPhotoManager.h; sourceTree = "<group>"; };
D0FAC409281B817D00D4B859 /* UIScrollView+GKPhotoBrowser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIScrollView+GKPhotoBrowser.h"; sourceTree = "<group>"; };
D0FAC40A281B817D00D4B859 /* GKPanGestureRecognizer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GKPanGestureRecognizer.h; sourceTree = "<group>"; };
D0FAC40B281B817D00D4B859 /* GKPhotoView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GKPhotoView.h; sourceTree = "<group>"; };
D0FAC40C281B817D00D4B859 /* GKPhotoBrowser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GKPhotoBrowser.m; sourceTree = "<group>"; };
D0FAC40D281B817D00D4B859 /* GKPhotoBrowserConfigure.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GKPhotoBrowserConfigure.h; sourceTree = "<group>"; };
D0FAC40E281B817D00D4B859 /* GKLoadingView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GKLoadingView.h; sourceTree = "<group>"; };
D0FAC40F281B817D00D4B859 /* GKPhotoManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GKPhotoManager.m; sourceTree = "<group>"; };
D0FAC410281B817D00D4B859 /* UIScrollView+GKPhotoBrowser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIScrollView+GKPhotoBrowser.m"; sourceTree = "<group>"; };
D0FAC411281B817D00D4B859 /* GKPhotoBrowserConfigure.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GKPhotoBrowserConfigure.m; sourceTree = "<group>"; };
D0FAC412281B817D00D4B859 /* GKPhotoBrowser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GKPhotoBrowser.h; sourceTree = "<group>"; };
D0FAC413281B817D00D4B859 /* GKPhotoView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GKPhotoView.m; sourceTree = "<group>"; };
D0FAC414281B817D00D4B859 /* GKPanGestureRecognizer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GKPanGestureRecognizer.m; sourceTree = "<group>"; };
D0FAC41B281B817D00D4B859 /* GKPhotoBrowser.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = GKPhotoBrowser.bundle; sourceTree = "<group>"; };
D0FAC427281B865300D4B859 /* GKYYWebImageManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GKYYWebImageManager.m; sourceTree = "<group>"; };
D0FAC428281B865300D4B859 /* GKYYWebImageManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GKYYWebImageManager.h; sourceTree = "<group>"; };
D0FAC660281BAACB00D4B859 /* YYAnimationImageView+Fix.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "YYAnimationImageView+Fix.h"; sourceTree = "<group>"; };
D0FAC661281BAACB00D4B859 /* YYAnimationImageView+Fix.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "YYAnimationImageView+Fix.m"; sourceTree = "<group>"; };
F02C34A5649294F60932630C /* Pods-DreamSleep.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-DreamSleep.release.xcconfig"; path = "Target Support Files/Pods-DreamSleep/Pods-DreamSleep.release.xcconfig"; sourceTree = "<group>"; }; F02C34A5649294F60932630C /* Pods-DreamSleep.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-DreamSleep.release.xcconfig"; path = "Target Support Files/Pods-DreamSleep/Pods-DreamSleep.release.xcconfig"; sourceTree = "<group>"; };
/* End PBXFileReference section */ /* End PBXFileReference section */
...@@ -973,8 +1003,9 @@ ...@@ -973,8 +1003,9 @@
D01814D927FFD91100583D4E /* DataSource */, D01814D927FFD91100583D4E /* DataSource */,
D01814CA27FFCBAF00583D4E /* CWCarousel */, D01814CA27FFCBAF00583D4E /* CWCarousel */,
D046FDF528100342000295AC /* UMSocial_6.10.4 */, D046FDF528100342000295AC /* UMSocial_6.10.4 */,
D01C9D6828168BFC00163567 /* WSDaePickerView */, D0FAC404281B817D00D4B859 /* GKPhotoBrowser */,
D07DAC912810557D0067A1BF /* RSKImageCropper */, D07DAC912810557D0067A1BF /* RSKImageCropper */,
D01C9D6828168BFC00163567 /* WSDaePickerView */,
D0E65FF32807A654006562F2 /* HYBUnicodeReadable */, D0E65FF32807A654006562F2 /* HYBUnicodeReadable */,
D0878F49280BEFF9005F1B7F /* YBAttributeTextTapAction */, D0878F49280BEFF9005F1B7F /* YBAttributeTextTapAction */,
D08F79B6281A1838000D99DD /* TZImagePickerController */, D08F79B6281A1838000D99DD /* TZImagePickerController */,
...@@ -1061,6 +1092,49 @@ ...@@ -1061,6 +1092,49 @@
path = FallAsleep; path = FallAsleep;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
D0FAC404281B817D00D4B859 /* GKPhotoBrowser */ = {
isa = PBXGroup;
children = (
D0FAC405281B817D00D4B859 /* Core */,
D0FAC426281B865300D4B859 /* YYWebImage */,
D0FAC41B281B817D00D4B859 /* GKPhotoBrowser.bundle */,
);
path = GKPhotoBrowser;
sourceTree = "<group>";
};
D0FAC405281B817D00D4B859 /* Core */ = {
isa = PBXGroup;
children = (
D0FAC406281B817D00D4B859 /* GKLoadingView.m */,
D0FAC407281B817D00D4B859 /* GKWebImageProtocol.h */,
D0FAC408281B817D00D4B859 /* GKPhotoManager.h */,
D0FAC409281B817D00D4B859 /* UIScrollView+GKPhotoBrowser.h */,
D0FAC40A281B817D00D4B859 /* GKPanGestureRecognizer.h */,
D0FAC40B281B817D00D4B859 /* GKPhotoView.h */,
D0FAC40C281B817D00D4B859 /* GKPhotoBrowser.m */,
D0FAC40D281B817D00D4B859 /* GKPhotoBrowserConfigure.h */,
D0FAC40E281B817D00D4B859 /* GKLoadingView.h */,
D0FAC40F281B817D00D4B859 /* GKPhotoManager.m */,
D0FAC410281B817D00D4B859 /* UIScrollView+GKPhotoBrowser.m */,
D0FAC411281B817D00D4B859 /* GKPhotoBrowserConfigure.m */,
D0FAC412281B817D00D4B859 /* GKPhotoBrowser.h */,
D0FAC413281B817D00D4B859 /* GKPhotoView.m */,
D0FAC414281B817D00D4B859 /* GKPanGestureRecognizer.m */,
);
path = Core;
sourceTree = "<group>";
};
D0FAC426281B865300D4B859 /* YYWebImage */ = {
isa = PBXGroup;
children = (
D0FAC427281B865300D4B859 /* GKYYWebImageManager.m */,
D0FAC428281B865300D4B859 /* GKYYWebImageManager.h */,
D0FAC660281BAACB00D4B859 /* YYAnimationImageView+Fix.h */,
D0FAC661281BAACB00D4B859 /* YYAnimationImageView+Fix.m */,
);
path = YYWebImage;
sourceTree = "<group>";
};
E9799C724D3AE78E7105C4CE /* Pods */ = { E9799C724D3AE78E7105C4CE /* Pods */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
...@@ -1135,6 +1209,7 @@ ...@@ -1135,6 +1209,7 @@
D01C9D6E28168BFC00163567 /* WSDatePickerView.xib in Resources */, D01C9D6E28168BFC00163567 /* WSDatePickerView.xib in Resources */,
D0C09ED828007D9100709D4C /* 478_lottie.json in Resources */, D0C09ED828007D9100709D4C /* 478_lottie.json in Resources */,
D046FE0D28100342000295AC /* UMSocialSDKResources.bundle in Resources */, D046FE0D28100342000295AC /* UMSocialSDKResources.bundle in Resources */,
D0FAC425281B817D00D4B859 /* GKPhotoBrowser.bundle in Resources */,
D04B3DB327F6F6070022F8DF /* Home.storyboard in Resources */, D04B3DB327F6F6070022F8DF /* Home.storyboard in Resources */,
D027EE3227FB5464004BBA61 /* pull_down.gif in Resources */, D027EE3227FB5464004BBA61 /* pull_down.gif in Resources */,
D020CE1F280D951400E7E82F /* invite_friend.webp in Resources */, D020CE1F280D951400E7E82F /* invite_friend.webp in Resources */,
...@@ -1209,9 +1284,12 @@ ...@@ -1209,9 +1284,12 @@
D04B3D9A27F6D4D90022F8DF /* LeadingController.m in Sources */, D04B3D9A27F6D4D90022F8DF /* LeadingController.m in Sources */,
D053BEE9280F9E310028CCFC /* CloseAlertView.m in Sources */, D053BEE9280F9E310028CCFC /* CloseAlertView.m in Sources */,
D062A0A128183FE000B4F48A /* FeedbackDetailController.m in Sources */, D062A0A128183FE000B4F48A /* FeedbackDetailController.m in Sources */,
D0FAC429281B865300D4B859 /* GKYYWebImageManager.m in Sources */,
D0BB9AA4281626F200DB209E /* ExceptionDefaultView.m in Sources */, D0BB9AA4281626F200DB209E /* ExceptionDefaultView.m in Sources */,
D0FAC420281B817D00D4B859 /* GKPhotoBrowserConfigure.m in Sources */,
D0B5ECD827F2F1B0003EDFE3 /* ServerAPIUtil.m in Sources */, D0B5ECD827F2F1B0003EDFE3 /* ServerAPIUtil.m in Sources */,
D0B5ECA627F2D9DE003EDFE3 /* AppDelegate.m in Sources */, D0B5ECA627F2D9DE003EDFE3 /* AppDelegate.m in Sources */,
D0FAC422281B817D00D4B859 /* GKPanGestureRecognizer.m in Sources */,
D07DACA82810557D0067A1BF /* RSKImageCropViewController.m in Sources */, D07DACA82810557D0067A1BF /* RSKImageCropViewController.m in Sources */,
D0E65FFB2807A654006562F2 /* NSDictionary+HYBUnicodeReadable.m in Sources */, D0E65FFB2807A654006562F2 /* NSDictionary+HYBUnicodeReadable.m in Sources */,
D0E65FFA2807A654006562F2 /* NSArray+HYBUnicodeReadable.m in Sources */, D0E65FFA2807A654006562F2 /* NSArray+HYBUnicodeReadable.m in Sources */,
...@@ -1226,9 +1304,11 @@ ...@@ -1226,9 +1304,11 @@
D0B5ECB727F2D9E0003EDFE3 /* main.m in Sources */, D0B5ECB727F2D9E0003EDFE3 /* main.m in Sources */,
D07DACA62810557D0067A1BF /* RSKTouchView.m in Sources */, D07DACA62810557D0067A1BF /* RSKTouchView.m in Sources */,
D09D0E9A280D507F008DEDAB /* ProfileAlertView.m in Sources */, D09D0E9A280D507F008DEDAB /* ProfileAlertView.m in Sources */,
D0FAC41F281B817D00D4B859 /* UIScrollView+GKPhotoBrowser.m in Sources */,
D0AEFE79281781CF00230DC6 /* MyFeedModel.m in Sources */, D0AEFE79281781CF00230DC6 /* MyFeedModel.m in Sources */,
D0506B0C280503A800229278 /* UIButton+Extras.m in Sources */, D0506B0C280503A800229278 /* UIButton+Extras.m in Sources */,
D0C50B3F27FD381000DC68F0 /* UIView+Extras.m in Sources */, D0C50B3F27FD381000DC68F0 /* UIView+Extras.m in Sources */,
D0FAC41E281B817D00D4B859 /* GKPhotoManager.m in Sources */,
D00291892816CD4500C0573B /* DsCacheUtils.m in Sources */, D00291892816CD4500C0573B /* DsCacheUtils.m in Sources */,
D07DAC902810546A0067A1BF /* DSImagePickerController.m in Sources */, D07DAC902810546A0067A1BF /* DSImagePickerController.m in Sources */,
D0DF90AE2814390000FC0F64 /* BannerModel.m in Sources */, D0DF90AE2814390000FC0F64 /* BannerModel.m in Sources */,
...@@ -1240,6 +1320,7 @@ ...@@ -1240,6 +1320,7 @@
D08F79E1281A1838000D99DD /* TZLocationManager.m in Sources */, D08F79E1281A1838000D99DD /* TZLocationManager.m in Sources */,
D04B3DBB27F6F7940022F8DF /* AISleepCoachController.m in Sources */, D04B3DBB27F6F7940022F8DF /* AISleepCoachController.m in Sources */,
D07A65832815911D00C15AF6 /* DsMaskView.m in Sources */, D07A65832815911D00C15AF6 /* DsMaskView.m in Sources */,
D0FAC41C281B817D00D4B859 /* GKLoadingView.m in Sources */,
D0BE32E62814D42B006539BE /* HomeRequestModel.m in Sources */, D0BE32E62814D42B006539BE /* HomeRequestModel.m in Sources */,
D0D3826728124E8A005BB219 /* FeedbackController.m in Sources */, D0D3826728124E8A005BB219 /* FeedbackController.m in Sources */,
D027EE2627FB3DC0004BBA61 /* NetLoadingStateView.m in Sources */, D027EE2627FB3DC0004BBA61 /* NetLoadingStateView.m in Sources */,
...@@ -1254,6 +1335,7 @@ ...@@ -1254,6 +1335,7 @@
D0E660052807D02C006562F2 /* UserRequestModel.m in Sources */, D0E660052807D02C006562F2 /* UserRequestModel.m in Sources */,
D0F82286280C44D10039F586 /* SetTableView.m in Sources */, D0F82286280C44D10039F586 /* SetTableView.m in Sources */,
D0930F1B2801874B006B497A /* UINavigationController+Pop.m in Sources */, D0930F1B2801874B006B497A /* UINavigationController+Pop.m in Sources */,
D0FAC662281BAACB00D4B859 /* YYAnimationImageView+Fix.m in Sources */,
D08F79D9281A1838000D99DD /* UIView+Layout.m in Sources */, D08F79D9281A1838000D99DD /* UIView+Layout.m in Sources */,
D08F79D8281A1838000D99DD /* NSBundle+TZImagePicker.m in Sources */, D08F79D8281A1838000D99DD /* NSBundle+TZImagePicker.m in Sources */,
D08F79E6281A198E000D99DD /* FeedImageCollectionCell.m in Sources */, D08F79E6281A198E000D99DD /* FeedImageCollectionCell.m in Sources */,
...@@ -1280,6 +1362,7 @@ ...@@ -1280,6 +1362,7 @@
D09BF337280E605900E5F06C /* NSObject+Extras.m in Sources */, D09BF337280E605900E5F06C /* NSObject+Extras.m in Sources */,
D07DACA72810557D0067A1BF /* UIApplication+RSKImageCropper.m in Sources */, D07DACA72810557D0067A1BF /* UIApplication+RSKImageCropper.m in Sources */,
D027EE2927FB51D0004BBA61 /* DSGifHeader.m in Sources */, D027EE2927FB51D0004BBA61 /* DSGifHeader.m in Sources */,
D0FAC421281B817D00D4B859 /* GKPhotoView.m in Sources */,
D08F79DA281A1838000D99DD /* TZPhotoPreviewController.m in Sources */, D08F79DA281A1838000D99DD /* TZPhotoPreviewController.m in Sources */,
D01814EE28002DC700583D4E /* HeaderDataModel.m in Sources */, D01814EE28002DC700583D4E /* HeaderDataModel.m in Sources */,
D0506B1B2805500E00229278 /* SafeHelperCollectionViewCell.m in Sources */, D0506B1B2805500E00229278 /* SafeHelperCollectionViewCell.m in Sources */,
...@@ -1291,6 +1374,7 @@ ...@@ -1291,6 +1374,7 @@
D0F808F52803D4E70097899F /* Track.m in Sources */, D0F808F52803D4E70097899F /* Track.m in Sources */,
D0E65FFC2807A654006562F2 /* NSSet+HYBUnicodeReadable.m in Sources */, D0E65FFC2807A654006562F2 /* NSSet+HYBUnicodeReadable.m in Sources */,
D0C50B3C27FD2EFD00DC68F0 /* PrivacyViewController.m in Sources */, D0C50B3C27FD2EFD00DC68F0 /* PrivacyViewController.m in Sources */,
D0FAC41D281B817D00D4B859 /* GKPhotoBrowser.m in Sources */,
D07A4B2A280EA6B600BA0EC0 /* UserInfoTableView.m in Sources */, D07A4B2A280EA6B600BA0EC0 /* UserInfoTableView.m in Sources */,
D0930F122801124E006B497A /* BaseNaviController.m in Sources */, D0930F122801124E006B497A /* BaseNaviController.m in Sources */,
D0878F4F280C087E005F1B7F /* LoginController.m in Sources */, D0878F4F280C087E005F1B7F /* LoginController.m in Sources */,
......
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
#import "FeedbackDetailController.h" #import "FeedbackDetailController.h"
#import "FeedbackRequestModel.h" #import "FeedbackRequestModel.h"
#import "GKPhotoBrowser.h"
@interface FeedbackDetailController () @interface FeedbackDetailController ()
@property (nonatomic, strong) UIScrollView *detailSV; @property (nonatomic, strong) UIScrollView *detailSV;
...@@ -25,7 +26,9 @@ ...@@ -25,7 +26,9 @@
@property (nonatomic, strong) ExceptionDefaultView *exceptionView; @property (nonatomic, strong) ExceptionDefaultView *exceptionView;
@end @end
@implementation FeedbackDetailController @implementation FeedbackDetailController {
NSMutableArray *_photos;
}
- (void)viewDidLoad { - (void)viewDidLoad {
[super viewDidLoad]; [super viewDidLoad];
...@@ -84,15 +87,22 @@ ...@@ -84,15 +87,22 @@
// 截取图片字符串链接 // 截取图片字符串链接
NSArray *imgUrls = [detailModel.content_img componentsSeparatedByString:@","]; NSArray *imgUrls = [detailModel.content_img componentsSeparatedByString:@","];
_photos = [NSMutableArray new];
for (int i = 0; i < imgUrls.count; i++) { for (int i = 0; i < imgUrls.count; i++) {
UIImageView *showIV = [[UIImageView alloc] initWithFrame:CGRectMake(i*(105 + 8), 0, 105, 105)]; UIImageView *showIV = [[UIImageView alloc] initWithFrame:CGRectMake(i*(105 + 8), 0, 105, 105)];
showIV.dk_alphaPicker = DKAlphaPickerWithAlphas(1.0, .5, .5); showIV.dk_alphaPicker = DKAlphaPickerWithAlphas(1.0, .5, .5);
[showIV yy_setImageWithURL:[NSURL URLWithString:imgUrls[i]] placeholder:[UIImage imageNamed:@"basicPlaceholder"]]; [showIV yy_setImageWithURL:[NSURL URLWithString:imgUrls[i]] placeholder:[UIImage imageNamed:@"basicPlaceholder"]];
[showIV cornerRadius:12.0]; [showIV cornerRadius:12.0];
showIV.tag = i;
[self.imgContainerView addSubview:showIV]; [self.imgContainerView addSubview:showIV];
UITapGestureRecognizer *tapGR = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapGRAction:)]; UITapGestureRecognizer *tapGR = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapGRAction:)];
[showIV addGestureRecognizer:tapGR]; [showIV addGestureRecognizer:tapGR];
showIV.userInteractionEnabled = YES; showIV.userInteractionEnabled = YES;
GKPhoto *photo = [GKPhoto new];
photo.url = [NSURL URLWithString:imgUrls[i]];
photo.sourceImageView = showIV;
[_photos addObject:photo];
} }
} }
...@@ -156,8 +166,10 @@ ...@@ -156,8 +166,10 @@
#pragma mark - 浏览图片 #pragma mark - 浏览图片
- (void)tapGRAction:(UITapGestureRecognizer *)gr { - (void)tapGRAction:(UITapGestureRecognizer *)gr {
UIImageView *showIV = (UIImageView *)gr.view; UIImageView *showIV = (UIImageView *)gr.view;
showIV.image; GKPhotoBrowser *browser = [GKPhotoBrowser photoBrowserWithPhotos:[_photos copy] currentIndex:showIV.tag];
DSLog(@"========="); browser.showStyle = GKPhotoBrowserShowStyleZoom;
browser.loadStyle = GKPhotoBrowserLoadStyleDeterminate;
[browser showFromVC:self];
} }
#pragma mark - 品牌模式 #pragma mark - 品牌模式
......
//
// GKLoadingView.h
// GKLoadingView
//
// Created by QuintGao on 2017/11/23.
// Copyright © 2017年 QuintGao. All rights reserved.
//
#import <UIKit/UIKit.h>
#import "GKPhotoBrowserConfigure.h"
typedef NS_ENUM(NSUInteger, GKLoadingStyle) {
GKLoadingStyleIndeterminate, // 不明确的加载方式
GKLoadingStyleIndeterminateMask, // 不明确的加载方式带阴影
GKLoadingStyleDeterminate, // 明确的加载方式--进度条
GKLoadingStyleCustom // 自定义
};
@interface GKLoadingView : UIView
+ (instancetype)loadingViewWithFrame:(CGRect)frame style:(GKLoadingStyle)style;
@property (nonatomic, assign) GKPhotoBrowserFailStyle failStyle;
@property (nonatomic, strong) UIButton *centerButton;
/** 线条宽度:默认4 */
@property (nonatomic, assign) CGFloat lineWidth;
/** 圆弧半径:默认24 */
@property (nonatomic, assign) CGFloat radius;
/** 圆弧的背景颜色:默认半透明黑色 */
@property (nonatomic, strong) UIColor *bgColor;
/** 进度的颜色:默认白色 */
@property (nonatomic, strong) UIColor *strokeColor;
/** 进度,loadingStyle为GKLoadingStyleDeterminate时使用 */
@property (nonatomic, assign) CGFloat progress;
@property (nonatomic, copy) NSString *failText;
@property (nonatomic, strong) UIImage *failImage;
@property (nonatomic, copy) void (^progressChange)(GKLoadingView *loadingView, CGFloat progress);
@property (nonatomic, copy) void (^tapToReload)(void);
/**
开始动画方法-loadingStyle为GKLoadingStyleIndeterminate,GKLoadingStyleIndeterminateMask时使用
*/
- (void)startLoading;
/**
结束动画方法
*/
- (void)stopLoading;
- (void)showFailure;
- (void)hideFailure;
- (void)hideLoadingView;
- (void)removeAnimation;
// 在duration时间内加载,
- (void)startLoadingWithDuration:(NSTimeInterval)duration completion:(void (^)(GKLoadingView *loadingView, BOOL finished))completion;
@end
//
// GKLoadingView.m
// GKLoadingView
//
// Created by QuintGao on 2017/11/23.
// Copyright © 2017年 QuintGao. All rights reserved.
//
#import "GKLoadingView.h"
@interface GKLoadingView()<CAAnimationDelegate>
// 动画layer
@property (nonatomic, strong) CAShapeLayer *animatedLayer;
// 半径layer
@property (nonatomic, strong) CAShapeLayer *backgroundLayer;
/** 加载方式 */
@property (nonatomic, assign) GKLoadingStyle loadingStyle;
@property (nonatomic, copy) void(^completion)(GKLoadingView *loadingView, BOOL finished);
@property (nonatomic, strong) UILabel *failureLabel;
@property (nonatomic, strong) UIImageView *failureImgView;
@end
@implementation GKLoadingView
+ (instancetype)loadingViewWithFrame:(CGRect)frame style:(GKLoadingStyle)style {
return [[self alloc] initWithFrame:frame loadingStyle:style];
}
- (instancetype)initWithFrame:(CGRect)frame loadingStyle:(GKLoadingStyle)loadingStyle {
if (self = [super initWithFrame:frame]) {
self.backgroundColor = [UIColor clearColor];
self.loadingStyle = loadingStyle;
// 设置默认值
self.lineWidth = 4;
self.radius = 24;
self.bgColor = [[UIColor blackColor] colorWithAlphaComponent:0.5];
self.strokeColor = [UIColor whiteColor];
[self addSubview:self.centerButton];
}
return self;
}
- (void)layoutSubviews {
[super layoutSubviews];
// centerButton必须保持在loadingView内部
CGFloat btnWH = self.radius * 2 - self.lineWidth;
self.centerButton.bounds = CGRectMake(0, 0, btnWH, btnWH);
self.centerButton.center = CGPointMake(CGRectGetWidth(self.bounds) * 0.5, CGRectGetHeight(self.bounds) * 0.5);
self.centerButton.layer.cornerRadius = btnWH * 0.5;
self.centerButton.layer.masksToBounds = YES;
if (self.failStyle == GKPhotoBrowserFailStyleOnlyText) {
self.failureLabel.center = CGPointMake(self.bounds.size.width * 0.5, self.bounds.size.height * 0.5);
}else if (self.failStyle == GKPhotoBrowserFailStyleOnlyImage) {
self.failureImgView.center = CGPointMake(self.bounds.size.width * 0.5, self.bounds.size.height * 0.5);
}else if (self.failStyle == GKPhotoBrowserFailStyleImageAndText) {
CGRect imgF = self.failureImgView.frame;
CGRect textF = self.failureLabel.frame;
imgF.origin.y = (self.bounds.size.height - imgF.size.height - 10 - textF.size.height) / 2;
self.failureImgView.frame = imgF;
textF.origin.y = imgF.origin.y + imgF.size.height + 10;
self.failureLabel.frame = textF;
}
}
- (void)willMoveToSuperview:(UIView *)newSuperview {
if (newSuperview) {
// [self layoutAnimatedLayer];
}else {
[self.animatedLayer removeFromSuperlayer];
self.animatedLayer = nil;
[self.backgroundLayer removeFromSuperlayer];
self.backgroundLayer = nil;
}
}
- (void)layoutAnimatedLayer {
CALayer *layer = self.animatedLayer;
[self.layer addSublayer:layer];
CGFloat viewW = CGRectGetWidth(self.bounds);
CGFloat viewH = CGRectGetHeight(self.bounds);
CGFloat layerW = CGRectGetWidth(layer.bounds);
CGFloat layerH = CGRectGetHeight(layer.bounds);
CGFloat widthDiff = viewW - layerW;
CGFloat heightDiff = viewH - layerH;
CGFloat positionX = viewW - layerW * 0.5 - widthDiff * 0.5;
CGFloat positionY = viewH - layerH * 0.5 - heightDiff * 0.5;
layer.position = CGPointMake(positionX, positionY);
self.backgroundLayer.position = layer.position;
}
#pragma mark - 懒加载
- (UIButton *)centerButton {
if (!_centerButton) {
_centerButton = [UIButton new];
// centerButton必须保持在loadingView内部
CGFloat btnWH = self.radius * 2 - self.lineWidth;
_centerButton.bounds = CGRectMake(0, 0, btnWH, btnWH);
_centerButton.center = CGPointMake(CGRectGetWidth(self.bounds) * 0.5, CGRectGetHeight(self.bounds) * 0.5);
_centerButton.layer.cornerRadius = btnWH * 0.5;
_centerButton.layer.masksToBounds = YES;
}
return _centerButton;
}
- (CAShapeLayer *)animatedLayer {
if (!_animatedLayer) {
[self.layer addSublayer:self.backgroundLayer];
CGPoint arcCenter = [self layerCenter];
_animatedLayer = [CAShapeLayer layer];
_animatedLayer.contentsScale = [UIScreen mainScreen].scale;
_animatedLayer.frame = CGRectMake(0, 0, arcCenter.x * 2, arcCenter.y * 2);
_animatedLayer.fillColor = [UIColor clearColor].CGColor;
_animatedLayer.strokeColor = self.strokeColor.CGColor;
_animatedLayer.lineWidth = self.lineWidth;
_animatedLayer.lineCap = kCALineCapRound;
_animatedLayer.lineJoin = kCALineJoinBevel;
switch (self.loadingStyle) {
case GKLoadingStyleIndeterminate:
[self setupIndeterminateAnim:_animatedLayer];
break;
case GKLoadingStyleIndeterminateMask:
[self setupIndeterminateMaskAnim:_animatedLayer];
break;
case GKLoadingStyleDeterminate:
[self setupDeterminateAnim:_animatedLayer];
break;
default:
break;
}
}
return _animatedLayer;
}
- (CAShapeLayer *)backgroundLayer {
if (!_backgroundLayer) {
CGPoint arcCenter = [self layerCenter];
UIBezierPath *smoothedPath = [UIBezierPath bezierPathWithArcCenter:arcCenter
radius:self.radius
startAngle:-M_PI_2
endAngle:M_PI + M_PI_2
clockwise:YES];
_backgroundLayer = [CAShapeLayer layer];
_backgroundLayer.contentsScale = [UIScreen mainScreen].scale;
_backgroundLayer.frame = CGRectMake(0.0f, 0.0f, arcCenter.x * 2, arcCenter.y * 2);
_backgroundLayer.fillColor = [UIColor clearColor].CGColor;
_backgroundLayer.strokeColor = self.bgColor.CGColor;
_backgroundLayer.lineWidth = self.lineWidth;
_backgroundLayer.lineCap = kCALineCapRound;
_backgroundLayer.lineJoin = kCALineJoinBevel;
_backgroundLayer.path = smoothedPath.CGPath;
_backgroundLayer.strokeEnd = 1.0f;
}
return _backgroundLayer;
}
- (UILabel *)failureLabel {
if (!_failureLabel) {
_failureLabel = [UILabel new];
_failureLabel.font = [UIFont systemFontOfSize:16.0f];
_failureLabel.textColor = [UIColor whiteColor];
_failureLabel.text = self.failText ? self.failText : @"图片加载失败";
_failureLabel.textAlignment = NSTextAlignmentCenter;
[_failureLabel sizeToFit];
_failureLabel.center = CGPointMake(self.bounds.size.width * 0.5, self.bounds.size.height * 0.5);
}
return _failureLabel;
}
- (UIImageView *)failureImgView {
if (!_failureImgView) {
_failureImgView = [UIImageView new];
_failureImgView.image = self.failImage ? self.failImage : GKPhotoBrowserImage(@"loading_error");
[_failureImgView sizeToFit];
_failureImgView.center = CGPointMake(self.bounds.size.width * 0.5, self.bounds.size.height * 0.5);
}
return _failureImgView;
}
- (void)setupIndeterminateAnim:(CAShapeLayer *)layer {
CGPoint arcCenter = [self layerCenter];
UIBezierPath *smoothedPath = [UIBezierPath bezierPathWithArcCenter:arcCenter
radius:self.radius
startAngle:-M_PI_2
endAngle:M_PI_2 - M_PI_4
clockwise:YES];
layer.path = smoothedPath.CGPath;
}
- (void)setupIndeterminateMaskAnim:(CAShapeLayer *)layer {
CGPoint arcCenter = [self layerCenter];
UIBezierPath *smoothedPath = [UIBezierPath bezierPathWithArcCenter:arcCenter
radius:self.radius
startAngle:(M_PI * 3 / 2)
endAngle:(M_PI / 2 + M_PI * 5)
clockwise:YES];
layer.path = smoothedPath.CGPath;
CALayer *maskLayer = [CALayer layer];
maskLayer.contents = (__bridge id)[GKPhotoBrowserImage(@"angle-mask") CGImage];
maskLayer.frame = layer.bounds;
layer.mask = maskLayer;
}
- (void)setupDeterminateAnim:(CAShapeLayer *)layer {
CGPoint arcCenter = [self layerCenter];
UIBezierPath *smoothedPath = [UIBezierPath bezierPathWithArcCenter:arcCenter
radius:self.radius
startAngle:-M_PI_2
endAngle:(M_PI + M_PI_2)
clockwise:YES];
layer.path = smoothedPath.CGPath;
layer.strokeEnd = 0.0f;
}
- (void)setFrame:(CGRect)frame {
if (!CGRectEqualToRect(frame, super.frame)) {
[super setFrame:frame];
}
}
- (void)setLineWidth:(CGFloat)lineWidth {
_lineWidth = lineWidth;
self.animatedLayer.lineWidth = lineWidth;
self.backgroundLayer.lineWidth = lineWidth;
[self layoutIfNeeded];
}
- (void)setRadius:(CGFloat)radius {
if (radius != _radius) {
_radius = radius;
[self.animatedLayer removeFromSuperlayer];
self.animatedLayer = nil;
[self.backgroundLayer removeFromSuperlayer];
self.backgroundLayer = nil;
}
[self layoutIfNeeded];
}
- (void)setBgColor:(UIColor *)bgColor {
_bgColor = bgColor;
self.backgroundLayer.strokeColor = bgColor.CGColor;
}
- (void)setStrokeColor:(UIColor *)strokeColor {
_strokeColor = strokeColor;
self.animatedLayer.strokeColor = strokeColor.CGColor;
}
- (void)setProgress:(CGFloat)progress {
_progress = progress;
[CATransaction begin];
[CATransaction setDisableActions:YES];
self.animatedLayer.strokeEnd = progress;
!self.progressChange ? : self.progressChange(self, progress);
[CATransaction commit];
}
- (CGSize)sizeThatFits:(CGSize)size {
CGFloat wh = (self.radius + self.lineWidth * 0.5 + 5 ) * 2;
return CGSizeMake(wh, wh);
}
- (CGPoint)layerCenter {
CGFloat xy = self.radius + self.lineWidth * 0.5 + 5;
return CGPointMake(xy, xy);
}
- (void)tapGestureAction:(UITapGestureRecognizer *)tap {
!self.tapToReload ? : self.tapToReload();
}
- (void)startLoading {
[self.failureLabel removeFromSuperview];
self.failureLabel = nil;
[self.failureImgView removeFromSuperview];
self.failureImgView = nil;
[self layoutAnimatedLayer];
if (self.loadingStyle == GKLoadingStyleIndeterminate) {
CABasicAnimation *rotateAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
rotateAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
rotateAnimation.fromValue = @0;
rotateAnimation.toValue = @(M_PI * 2);
rotateAnimation.duration = 0.8;
rotateAnimation.repeatCount = HUGE;
rotateAnimation.removedOnCompletion = NO;
[self.animatedLayer addAnimation:rotateAnimation forKey:nil];
}else if (self.loadingStyle == GKLoadingStyleIndeterminateMask) {
NSTimeInterval animationDuration = 1;
CAMediaTimingFunction *linearCurve = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform.rotation"];
animation.fromValue = @0;
animation.toValue = @(M_PI * 2);
animation.duration = animationDuration;
animation.timingFunction = linearCurve;
animation.removedOnCompletion = NO;
animation.repeatCount = HUGE;
animation.fillMode = kCAFillModeForwards;
animation.autoreverses = NO;
[self.animatedLayer.mask addAnimation:animation forKey:@"rotate"];
CAAnimationGroup *animationGroup = [CAAnimationGroup animation];
animationGroup.duration = animationDuration;
animationGroup.repeatCount = HUGE;
animationGroup.removedOnCompletion = NO;
animationGroup.timingFunction = linearCurve;
CABasicAnimation *strokeStartAnimation = [CABasicAnimation animationWithKeyPath:@"strokeStart"];
strokeStartAnimation.fromValue = @0.015;
strokeStartAnimation.toValue = @0.515;
CABasicAnimation *strokeEndAnimation = [CABasicAnimation animationWithKeyPath:@"strokeEnd"];
strokeEndAnimation.fromValue = @0.485;
strokeEndAnimation.toValue = @0.985;
animationGroup.animations = @[strokeStartAnimation, strokeEndAnimation];
[self.animatedLayer addAnimation:animationGroup forKey:@"progress"];
}
}
- (void)stopLoading {
[self hideLoadingView];
}
- (void)showFailure {
[self.animatedLayer removeFromSuperlayer];
self.animatedLayer = nil;
[self.backgroundLayer removeFromSuperlayer];
self.backgroundLayer = nil;
[self.layer removeAllAnimations];
if (self.failStyle == GKPhotoBrowserFailStyleOnlyText) {
[self addSubview:self.failureLabel];
}else if (self.failStyle == GKPhotoBrowserFailStyleOnlyImage) {
[self addSubview:self.failureImgView];
}else if (self.failStyle == GKPhotoBrowserFailStyleImageAndText) {
[self addSubview:self.failureLabel];
[self addSubview:self.failureImgView];
CGRect imgF = self.failureImgView.frame;
CGRect textF = self.failureLabel.frame;
imgF.origin.y = (self.bounds.size.height - imgF.size.height - 10 - textF.size.height) / 2;
self.failureImgView.frame = imgF;
textF.origin.y = imgF.origin.y + imgF.size.height + 10;
self.failureLabel.frame = textF;
}
}
- (void)hideFailure {
[self.animatedLayer removeFromSuperlayer];
self.animatedLayer = nil;
[self.backgroundLayer removeFromSuperlayer];
self.backgroundLayer = nil;
[self.layer removeAllAnimations];
[self.failureLabel removeFromSuperview];
[self.failureImgView removeFromSuperview];
}
- (void)hideLoadingView {
[self.animatedLayer removeFromSuperlayer];
self.animatedLayer = nil;
[self.backgroundLayer removeFromSuperlayer];
self.backgroundLayer = nil;
[self.layer removeAllAnimations];
[self removeFromSuperview];
}
- (void)removeAnimation {
[self.animatedLayer removeFromSuperlayer];
self.animatedLayer = nil;
[self.backgroundLayer removeFromSuperlayer];
self.backgroundLayer = nil;
[self.layer removeAllAnimations];
}
- (void)startLoadingWithDuration:(NSTimeInterval)duration completion:(void (^)(GKLoadingView *, BOOL))completion {
self.completion = completion;
self.progress = 1.0;
CABasicAnimation *pathAnimation = [CABasicAnimation animationWithKeyPath:@"strokeEnd"];
pathAnimation.duration = duration;
pathAnimation.fromValue = @(0.0);
pathAnimation.toValue = @(1.0);
pathAnimation.removedOnCompletion = YES;
pathAnimation.delegate = self;
[self.animatedLayer addAnimation:pathAnimation forKey:nil];
}
#pragma mark - CAAnimationDelegate
- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag {
!self.completion ? : self.completion(self, flag);
}
@end
//
// GKPanGestureRecognizer.h
// GKPhotoBrowserDemo
//
// Created by gaokun on 2019/8/15.
// Copyright © 2019 QuintGao. All rights reserved.
//
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
typedef NS_ENUM(NSUInteger, GKPanGestureRecognizerDirection) {
GKPanGestureRecognizerDirectionVertical,
GKPanGestureRecognizerDirectionHorizontal
};
@interface GKPanGestureRecognizer : UIPanGestureRecognizer
@property (nonatomic, assign) GKPanGestureRecognizerDirection direction;
@end
NS_ASSUME_NONNULL_END
//
// GKPanGestureRecognizer.m
// GKPhotoBrowserDemo
//
// Created by gaokun on 2019/8/15.
// Copyright © 2019 QuintGao. All rights reserved.
//
#import "GKPanGestureRecognizer.h"
int const static kDirectionPanThreshold = 5;
@interface GKPanGestureRecognizer()
@property (nonatomic, assign) BOOL isDrag;
@property (nonatomic, assign) int moveX;
@property (nonatomic, assign) int moveY;
@end
@implementation GKPanGestureRecognizer
- (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
[super touchesMoved:touches withEvent:event];
if (self.state == UIGestureRecognizerStateFailed) return;
CGPoint nowPoint = [[touches anyObject] locationInView:self.view];
CGPoint prevPoint = [[touches anyObject] previousLocationInView:self.view];
_moveX += prevPoint.x - nowPoint.x;
_moveY += prevPoint.y - nowPoint.y;
if (!self.isDrag) {
if (abs(_moveX) > kDirectionPanThreshold) {
if (_direction == GKPanGestureRecognizerDirectionVertical) {
self.state = UIGestureRecognizerStateFailed;
}else {
_isDrag = YES;
}
}else if (abs(_moveY) > kDirectionPanThreshold) {
if (_direction == GKPanGestureRecognizerDirectionHorizontal) {
self.state = UIGestureRecognizerStateFailed;
}else {
_isDrag = YES;
}
}
}
}
- (void)reset {
[super reset];
_isDrag = NO;
_moveX = 0;
_moveY = 0;
}
@end
//
// GKPhotoBrowser.h
// GKPhotoBrowser
//
// Created by QuintGao on 2017/10/20.
// Copyright © 2017年 QuintGao. All rights reserved.
//
#import <UIKit/UIKit.h>
#import "GKPhotoView.h"
NS_ASSUME_NONNULL_BEGIN
@class GKPhotoBrowser;
typedef void(^layoutBlock)(GKPhotoBrowser *photoBrowser, CGRect superFrame);
@protocol GKPhotoBrowserDelegate<NSObject>
@optional
// 滚动到一半时索引改变
- (void)photoBrowser:(GKPhotoBrowser *)browser didChangedIndex:(NSInteger)index;
// 选择photoView时回调
- (void)photoBrowser:(GKPhotoBrowser *)browser didSelectAtIndex:(NSInteger)index;
// 单击事件
- (void)photoBrowser:(GKPhotoBrowser *)browser singleTapWithIndex:(NSInteger)index;
// 长按事件
- (void)photoBrowser:(GKPhotoBrowser *)browser longPressWithIndex:(NSInteger)index;
// 旋转事件
- (void)photoBrowser:(GKPhotoBrowser *)browser onDeciceChangedWithIndex:(NSInteger)index isLandscape:(BOOL)isLandscape;
// 保存按钮点击事件
- (void)photoBrowser:(GKPhotoBrowser *)browser onSaveBtnClick:(NSInteger)index image:(UIImage *)image;
// 上下滑动消失
// 开始滑动时
- (void)photoBrowser:(GKPhotoBrowser *)browser panBeginWithIndex:(NSInteger)index;
// 结束滑动时 disappear:是否消失
- (void)photoBrowser:(GKPhotoBrowser *)browser panEndedWithIndex:(NSInteger)index willDisappear:(BOOL)disappear;
// 布局子视图
- (void)photoBrowser:(GKPhotoBrowser *)browser willLayoutSubViews:(NSInteger)index;
// browser完全消失回调
- (void)photoBrowser:(GKPhotoBrowser *)browser didDisappearAtIndex:(NSInteger)index;
// browser自定义加载方式时回调
- (void)photoBrowser:(GKPhotoBrowser *)browser loadImageAtIndex:(NSInteger)index progress:(float)progress isOriginImage:(BOOL)isOriginImage;
// browser加载失败自定义弹窗
- (void)photoBrowser:(GKPhotoBrowser *)browser loadFailedAtIndex:(NSInteger)index;
// browser UIScrollViewDelegate
- (void)photoBrowser:(GKPhotoBrowser *)browser scrollViewDidScroll:(UIScrollView *)scrollView;
- (void)photoBrowser:(GKPhotoBrowser *)browser scrollViewDidEndDecelerating:(UIScrollView *)scrollView;
- (void)photoBrowser:(GKPhotoBrowser *)browser scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate;
@end
@interface GKPhotoBrowser : UIViewController
/** 底部内容试图 */
@property (nonatomic, strong, readonly) UIView *contentView;
/** 图片模型数组 */
@property (nonatomic, strong, readonly) NSArray *photos;
/** 当前索引 */
@property (nonatomic, assign, readonly) NSInteger currentIndex;
/** 当前显示的photoView */
@property (nonatomic, strong, readonly) GKPhotoView *curPhotoView;
/** 是否是横屏 */
@property (nonatomic, assign, readonly) BOOL isLandscape;
/** 当前设备的方向 */
@property (nonatomic, assign, readonly) UIDeviceOrientation currentOrientation;
/** 显示方式 */
@property (nonatomic, assign) GKPhotoBrowserShowStyle showStyle;
/** 隐藏方式 */
@property (nonatomic, assign) GKPhotoBrowserHideStyle hideStyle;
/** 图片加载方式 */
@property (nonatomic, assign) GKPhotoBrowserLoadStyle loadStyle;
/** 原图加载加载方式 */
@property (nonatomic, assign) GKPhotoBrowserLoadStyle originLoadStyle;
/** 图片加载失败显示方式 */
@property (nonatomic, assign) GKPhotoBrowserFailStyle failStyle;
/** 代理 */
@property (nonatomic, weak) id<GKPhotoBrowserDelegate> delegate;
/// 是否跟随系统旋转,默认是NO,如果设置为YES,isScreenRotateDisabled属性将失效
@property (nonatomic, assign) BOOL isFollowSystemRotation;
/// 是否禁止屏幕旋转监测
@property (nonatomic, assign) BOOL isScreenRotateDisabled;
/// 是否禁用默认单击事件
@property (nonatomic, assign) BOOL isSingleTapDisabled;
/// 是否显示状态栏,默认NO:不显示状态栏
@property (nonatomic, assign) BOOL isStatusBarShow;
/// 状态栏样式,默认Light
@property (nonatomic, assign) UIStatusBarStyle statusBarStyle;
/// 滑动消失时是否隐藏原来的视图:默认YES
@property (nonatomic, assign) BOOL isHideSourceView;
/// 滑动切换图片时,是否恢复上(下)一张图片的缩放程度,默认是NO
/// 如果滑动超过一张,则恢复原状
@property (nonatomic, assign) BOOL isResumePhotoZoom;
/// 横屏时是否充满屏幕宽度,默认YES,为NO时图片自动填充屏幕
@property (nonatomic, assign) BOOL isFullWidthForLandScape;
/// 是否适配安全区域,默认NO,为YES时图片会自动适配iPhone X的安全区域
@property (nonatomic, assign) BOOL isAdaptiveSafeArea;
/// 是否启用滑动返回手势处理(当showStyle为GKPhotoBrowserShowStylePush时有效)
@property (nonatomic, assign) BOOL isPopGestureEnabled;
/// 是否隐藏countLabel,默认NO
@property (nonatomic, assign) BOOL hidesCountLabel;
/// 图片最大放大倍数
@property (nonatomic, assign) CGFloat maxZoomScale;
/// 双击放大倍数,默认maxZoomScale,不能超过maxZoomScale
@property (nonatomic, assign) CGFloat doubleZoomScale;
/// 动画时间,默认0.3
@property (nonatomic, assign) NSTimeInterval animDuration;
/// 浏览器背景(默认黑色)
@property (nonatomic, strong) UIColor *bgColor;
/// 数量Label,默认显示,若要隐藏需设置hidesCountLabel为YES
@property (nonatomic, strong) UILabel *countLabel;
/// 页码,默认隐藏
@property (nonatomic, strong) UIPageControl *pageControl;
/// 保存按钮,默认隐藏
@property (nonatomic, strong) UIButton *saveBtn;
/// 加载失败时显示的文字或图片
@property (nonatomic, copy) NSString *failureText;
@property (nonatomic, strong) UIImage *failureImage;
// 初始化方法
/**
创建图片浏览器
@param photos 包含GKPhoto对象的数组
@param currentIndex 当前的页码
@return 图片浏览器对象
*/
+ (instancetype)photoBrowserWithPhotos:(NSArray<GKPhoto *> *)photos currentIndex:(NSInteger)currentIndex;
- (instancetype)initWithPhotos:(NSArray<GKPhoto *> *)photos currentIndex:(NSInteger)currentIndex;
/// 自定义图片请求类
/// @param protocol 需实现GKWebImageProtocol协议
- (void)setupWebImageProtocol:(id<GKWebImageProtocol>)protocol;
/**
为浏览器添加自定义遮罩视图
@param coverViews 视图数组
@param layoutBlock 布局
*/
- (void)setupCoverViews:(NSArray *)coverViews layoutBlock:(layoutBlock)layoutBlock;
/**
显示图片浏览器
@param vc 控制器
*/
- (void)showFromVC:(UIViewController *)vc;
/**
隐藏图片浏览器
*/
- (void)dismiss;
/**
选中指定位置的内容
@param index 位置索引
*/
- (void)selectedPhotoWithIndex:(NSInteger)index animated:(BOOL)animated;
/**
移除指定位置的内容
@param index 位置索引
*/
- (void)removePhotoAtIndex:(NSInteger)index;
/**
重置图片浏览器
@param photos 图片内容数组
*/
- (void)resetPhotoBrowserWithPhotos:(NSArray *)photos;
/**
加载原图方法,外部调用
*/
- (void)loadCurrentPhotoImage;
@end
NS_ASSUME_NONNULL_END
//
// GKPhotoBrowser.m
// GKPhotoBrowser
//
// Created by QuintGao on 2017/10/20.
// Copyright © 2017年 QuintGao. All rights reserved.
//
#import "GKPhotoBrowser.h"
#import "GKPanGestureRecognizer.h"
#if __has_include(<GKYYWebImageManager.h>)
#import "GKYYWebImageManager.h"
#elif __has_include(<GKSDWebImageManager.h>)
#import "GKSDWebImageManager.h"
#endif
static Class imageManagerClass = nil;
@interface GKPhotoBrowser()<UIScrollViewDelegate, UIGestureRecognizerDelegate>
@property (nonatomic, strong, readwrite) UIView *contentView;
@property (nonatomic, strong, readwrite) NSArray *photos;
@property (nonatomic, assign, readwrite) NSInteger currentIndex;
@property (nonatomic, strong, readwrite) GKPhotoView *curPhotoView;
@property (nonatomic, assign, readwrite) BOOL isLandscape;
@property (nonatomic, strong) UIScrollView *photoScrollView;
@property (nonatomic, strong) NSMutableArray *visiblePhotoViews;
@property (nonatomic, strong) NSMutableSet *reusablePhotoViews;
@property (nonatomic, assign) BOOL isShow;
@property (nonatomic, strong) NSArray *coverViews;
@property (nonatomic, copy) layoutBlock layoutBlock;
/** 当前设备方向 */
@property (nonatomic, assign, readwrite) UIDeviceOrientation currentOrientation;
/** 上一次的设备方向 */
@property (nonatomic, assign) UIDeviceOrientation originalOrientation;
/** 正在发生屏幕旋转 */
@property (nonatomic, assign) BOOL isRotation;
/** 状态栏是否显示 */
@property (nonatomic, assign) BOOL isStatusBarShowing;
/// 原始状态栏
@property (nonatomic, assign) UIStatusBarStyle originStatusBarStyle;
/** 正在滑动缩放隐藏 */
@property (nonatomic, assign) BOOL isZoomScale;
// 是否已经显示
@property (nonatomic, assign) BOOL isAppeared;
@property (nonatomic, strong) GKPanGestureRecognizer *panGesture;
@property (nonatomic, assign) CGPoint firstMovePoint;
@property (nonatomic, assign) CGPoint startLocation;
@property (nonatomic, assign) CGRect startFrame;
@property (nonatomic, strong) id<GKWebImageProtocol> imageProtocol;
/** 20200312 是否已经开始开始监听屏幕旋转,用于修复issue 67 和 issue 71
添加本参数的原因说明:
(1).iOS 13.x要求
endGeneratingDeviceOrientationNotifications 和
beginGeneratingDeviceOrientationNotifications 需要成对调用,如果已经调用过beginGeneratingDeviceOrientationNotifications,再次调用的话,会导致crash。
报错:NSInternalInconsistencyException原因:threading violation: expected the main thread
(2).解决GKPhotoBrowser可能在endGeneratingDeviceOrientationNotifications时影响了App本身的屏幕旋转监听的问题。
**/
@property(nonatomic, assign) BOOL isGeneratingDeviceOrientationNotificationsBegunBeforePhotoBrowserAppeared;
/// 20200312 用于防止多次addObserver,添加监听UIDeviceOrientationDidChangeNotification通知的flag
@property(nonatomic, assign) BOOL isOrientationNotiObserverAdded;
/// 状态栏处理
@property (nonatomic, assign) BOOL statusBarAppearance;
@end
@implementation GKPhotoBrowser
+ (instancetype)photoBrowserWithPhotos:(NSArray<GKPhoto *> *)photos currentIndex:(NSInteger)currentIndex {
return [[self alloc] initWithPhotos:photos currentIndex:currentIndex];
}
- (instancetype)initWithPhotos:(NSArray<GKPhoto *> *)photos currentIndex:(NSInteger)currentIndex {
if (self = [super init]) {
self.photos = photos;
self.currentIndex = currentIndex;
// 初始化
self.originStatusBarStyle = [UIApplication sharedApplication].statusBarStyle;
self.isStatusBarShow = NO;
self.isHideSourceView = YES;
self.statusBarStyle = UIStatusBarStyleLightContent;
self.isFullWidthForLandScape = YES;
self.maxZoomScale = kMaxZoomScale;
self.doubleZoomScale = self.maxZoomScale;
self.animDuration = kAnimationDuration;
// 20200312
self.isGeneratingDeviceOrientationNotificationsBegunBeforePhotoBrowserAppeared = [UIDevice currentDevice].isGeneratingDeviceOrientationNotifications;
_visiblePhotoViews = [NSMutableArray new];
_reusablePhotoViews = [NSMutableSet new];
imageManagerClass = NSClassFromString(@"GKSDWebImageManager");
if (!imageManagerClass) {
imageManagerClass = NSClassFromString(@"GKYYWebImageManager");
}
if (imageManagerClass) {
self.imageProtocol = [imageManagerClass new];
}
// 状态栏外观处理
NSDictionary *infoDict = [NSBundle mainBundle].infoDictionary;
BOOL hasKey = [infoDict.allKeys containsObject:@"UIViewControllerBasedStatusBarAppearance"];
BOOL appearance = [[infoDict objectForKey:@"UIViewControllerBasedStatusBarAppearance"] boolValue];
self.statusBarAppearance = (hasKey && appearance) || !hasKey;
}
return self;
}
- (void)setupWebImageProtocol:(id<GKWebImageProtocol>)protocol {
self.imageProtocol = protocol;
}
- (instancetype)init {
NSAssert(NO, @"Use initWithPhotos:currentIndex: instead.");
return nil;
}
- (void)viewDidLoad {
[super viewDidLoad];
// 设置UI
[self setupUI];
}
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
if (self.isAppeared) return;
self.isAppeared = YES;
// 手势和监听
[self addGestureAndObserver];
GKPhoto *photo = [self currentPhoto];
GKPhotoView *photoView = [self currentPhotoView];
self.curPhotoView = photoView;
if ([_imageProtocol imageFromMemoryForURL:photo.url] || photo.image) {
[photoView setupPhoto:photo];
}else {
photoView.imageView.image = photo.placeholderImage ? photo.placeholderImage : photo.sourceImageView.image;
[photoView adjustFrame];
}
if ([self.delegate respondsToSelector:@selector(photoBrowser:didSelectAtIndex:)]) {
[self.delegate photoBrowser:self didSelectAtIndex:self.currentIndex];
}
switch (self.showStyle) {
case GKPhotoBrowserShowStyleNone:
[self browserNoneShow];
break;
case GKPhotoBrowserShowStylePush:
[self browserPushShow];
break;
case GKPhotoBrowserShowStyleZoom:{
[self browserZoomShow];
}
break;
default:
break;
}
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
if ([self.imageProtocol respondsToSelector:@selector(clearMemory)]) {
[self.imageProtocol clearMemory];
}
}
- (void)viewDidDisappear:(BOOL)animated {
[super viewDidDisappear:animated];
if ([self.delegate respondsToSelector:@selector(photoBrowser:didDisappearAtIndex:)]) {
[self.delegate photoBrowser:self didDisappearAtIndex:self.currentIndex];
}
}
- (void)setupUI {
if (!self.navigationController.navigationBarHidden && !self.navigationController.navigationBar.hidden) {
[self.navigationController setNavigationBarHidden:YES];
}
self.view.backgroundColor = self.bgColor ? : [UIColor blackColor];
CGFloat width = self.view.bounds.size.width;
CGFloat height = self.view.bounds.size.height;
BOOL isLandscape = width > height;
if (self.isAdaptiveSafeArea) {
if (isLandscape) {
width -= (kSafeTopSpace + kSafeBottomSpace);
}else {
height -= (kSafeTopSpace + kSafeBottomSpace);
}
}
self.contentView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, width, height)];
self.contentView.center = self.view.center;
self.contentView.backgroundColor = [UIColor clearColor];
[self.view addSubview:self.contentView];
[self.contentView addSubview:self.photoScrollView];
if (self.coverViews) {
[self.coverViews enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
[self.contentView addSubview:obj];
}];
}else {
[self setupDefaultCovers];
}
[self layoutSubviews];
CGRect frame = self.photoScrollView.bounds;
CGSize contentSize = CGSizeMake(frame.size.width * self.photos.count, frame.size.height);
self.photoScrollView.contentSize = contentSize;
CGPoint contentOffset = CGPointMake(frame.size.width * self.currentIndex, 0);
[self.photoScrollView setContentOffset:contentOffset animated:NO];
if (self.photoScrollView.contentOffset.x == 0) {
[self scrollViewDidScroll:self.photoScrollView];
}
}
- (void)setupDefaultCovers {
[self.contentView addSubview:self.countLabel];
[self.contentView addSubview:self.pageControl];
[self.contentView addSubview:self.saveBtn];
if (self.hidesCountLabel) {
self.countLabel.hidden = YES;
}else {
self.countLabel.hidden = self.photos.count == 1;
}
self.pageControl.numberOfPages = self.photos.count;
if (self.pageControl.hidesForSinglePage) {
self.pageControl.hidden = self.photos.count <= 1;
}
CGSize size = [self.pageControl sizeForNumberOfPages:self.photos.count];
self.pageControl.bounds = CGRectMake(0, 0, size.width, size.height);
[self updateViewIndex];
}
- (void)addGestureAndObserver {
[self addGestureRecognizer];
if (self.isFollowSystemRotation) return;
if (!self.isScreenRotateDisabled) {
[self addDeviceOrientationObserver];
}
}
#pragma mark - Setter
- (void)setShowStyle:(GKPhotoBrowserShowStyle)showStyle {
_showStyle = showStyle;
if (showStyle != GKPhotoBrowserShowStylePush) {
self.modalPresentationStyle = UIModalPresentationCustom;
self.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
}
}
- (void)setIsStatusBarShow:(BOOL)isStatusBarShow {
_isStatusBarShow = isStatusBarShow;
if (self.statusBarAppearance) {
if ([self respondsToSelector:@selector(setNeedsStatusBarAppearanceUpdate)]) {
[self prefersStatusBarHidden];
[self performSelector:@selector(setNeedsStatusBarAppearanceUpdate)];
}
}else {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
[[UIApplication sharedApplication] setStatusBarHidden:!isStatusBarShow];
#pragma clang diagnostic pop
}
}
- (void)setStatusBarStyle:(UIStatusBarStyle)statusBarStyle {
_statusBarStyle = statusBarStyle;
if (self.statusBarAppearance) {
if ([self respondsToSelector:@selector(setNeedsStatusBarAppearanceUpdate)]) {
[self prefersStatusBarHidden];
[self performSelector:@selector(setNeedsStatusBarAppearanceUpdate)];
}
}else {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
[[UIApplication sharedApplication] setStatusBarStyle:statusBarStyle];
#pragma clang diagnostic pop
}
}
- (void)setIsScreenRotateDisabled:(BOOL)isScreenRotateDisabled {
_isScreenRotateDisabled = isScreenRotateDisabled;
if (isScreenRotateDisabled) {
[self delDeviceOrientationObserver];
}else {
[self addDeviceOrientationObserver];
}
}
- (void)setDoubleZoomScale:(CGFloat)doubleZoomScale {
if (doubleZoomScale > self.maxZoomScale) {
_doubleZoomScale = self.maxZoomScale;
}else {
_doubleZoomScale = doubleZoomScale;
}
}
#pragma mark - BrowserShow
- (void)browserNoneShow {
GKPhotoView *photoView = [self currentPhotoView];
GKPhoto *photo = [self currentPhoto];
self.view.alpha = 0;
[UIView animateWithDuration:self.animDuration animations:^{
self.view.alpha = 1.0;
}completion:^(BOOL finished) {
self.isShow = YES;
[photoView setupPhoto:photo];
[self deviceOrientationDidChange];
}];
}
- (void)browserPushShow {
self.view.backgroundColor = self.bgColor ? : [UIColor blackColor];
self.isShow = YES;
[[self currentPhotoView] setupPhoto:[self currentPhoto]];
[self deviceOrientationDidChange];
}
- (void)browserZoomShow {
GKPhoto *photo = [self currentPhoto];
GKPhotoView *photoView = [self currentPhotoView];
CGRect endRect = CGRectZero;
if (photoView.imageView.image) {
endRect = photoView.imageView.frame;
}else {
if (CGRectEqualToRect(photo.sourceFrame, CGRectZero)) {
endRect = photoView.imageView.frame;
}else {
CGFloat w = GKScreenW;
// bug fixed:#43 CALayer position contains NaN: [nan nan]
CGFloat h = (photo.sourceFrame.size.width == 0) ? GKScreenH : (w * photo.sourceFrame.size.height / photo.sourceFrame.size.width);
CGFloat x = 0;
CGFloat y = (GKScreenH - h) / 2;
endRect = CGRectMake(x, y, w, h);
}
}
CGRect sourceRect = photo.sourceFrame;
if (CGRectEqualToRect(sourceRect, CGRectZero)) {
float systemVersion = [UIDevice currentDevice].systemVersion.floatValue;
if (systemVersion >= 8.0 && systemVersion < 9.0) {
sourceRect = [photo.sourceImageView.superview convertRect:photo.sourceImageView.frame toCoordinateSpace:photoView];
}else {
sourceRect = [photo.sourceImageView.superview convertRect:photo.sourceImageView.frame toView:photoView];
}
}
photoView.imageView.frame = sourceRect;
[UIView animateWithDuration:self.animDuration animations:^{
photoView.imageView.frame = endRect;
self.view.backgroundColor = self.bgColor ? : [UIColor blackColor];
}completion:^(BOOL finished) {
self.isShow = YES;
[photoView setupPhoto:photo];
[self deviceOrientationDidChange];
}];
}
- (void)updateViewIndex {
self.countLabel.text = [NSString stringWithFormat:@"%zd/%zd", (long)(self.currentIndex + 1), (long)self.photos.count];
self.pageControl.currentPage = self.currentIndex;
}
- (void)layoutSubviews {
CGRect frame = self.contentView.bounds;
frame.origin.x -= kPhotoViewPadding;
frame.size.width += kPhotoViewPadding * 2;
CGFloat photoScrollW = frame.size.width;
CGFloat photoScrollH = frame.size.height;
CGFloat pointX = photoScrollW * 0.5 - kPhotoViewPadding;
self.photoScrollView.frame = frame;
self.photoScrollView.center = CGPointMake(pointX, photoScrollH * 0.5);
self.photoScrollView.contentOffset = CGPointMake(self.currentIndex * photoScrollW, 0);
self.photoScrollView.contentSize = CGSizeMake(photoScrollW * self.photos.count, 0);
// 调整所有显示的photoView的frame
CGFloat w = photoScrollW - kPhotoViewPadding * 2;
CGFloat h = photoScrollH;
__block CGFloat x = 0;
CGFloat y = 0;
[_visiblePhotoViews enumerateObjectsUsingBlock:^(GKPhotoView *photoView, NSUInteger idx, BOOL * _Nonnull stop) {
x = kPhotoViewPadding + photoView.tag * (kPhotoViewPadding * 2 + w);
photoView.frame = CGRectMake(x, y, w, h);
[photoView resetFrame];
}];
if (self.coverViews) {
!self.layoutBlock ? : self.layoutBlock(self, self.contentView.bounds);
}else {
CGFloat centerX = self.contentView.bounds.size.width * 0.5f;
self.countLabel.center = CGPointMake(centerX, (KIsiPhoneX && !self.isLandscape) ? 50 : 30);
CGFloat pointY = 0;
if (self.isLandscape) {
pointY = self.contentView.bounds.size.height - 20;
}else {
pointY = self.contentView.bounds.size.height - 20 - (self.isAdaptiveSafeArea ? 0 : kSafeBottomSpace);
}
self.pageControl.center = CGPointMake(centerX, pointY);
self.saveBtn.center = CGPointMake(self.contentView.bounds.size.width - 50, pointY);
}
if ([self.delegate respondsToSelector:@selector(photoBrowser:willLayoutSubViews:)]) {
[self.delegate photoBrowser:self willLayoutSubViews:self.currentIndex];
}
}
- (void)dealloc {
[self delDeviceOrientationObserver];
}
#pragma mark - 屏幕旋转
- (BOOL)shouldAutorotate {
return self.isFollowSystemRotation ? YES : NO;
}
- (UIInterfaceOrientationMask)supportedInterfaceOrientations {
return self.isFollowSystemRotation ? UIInterfaceOrientationMaskAll : UIInterfaceOrientationMaskPortrait;
}
#pragma mark - 状态栏
- (BOOL)prefersStatusBarHidden {
return !self.isStatusBarShow;
}
- (UIStatusBarStyle)preferredStatusBarStyle {
return self.statusBarStyle;
}
#pragma mark - Public Methods
- (void)setupCoverViews:(NSArray *)coverViews layoutBlock:(layoutBlock)layoutBlock {
self.coverViews = coverViews;
self.layoutBlock = layoutBlock;
}
- (void)showFromVC:(UIViewController *)vc {
if (self.showStyle == GKPhotoBrowserShowStylePush) {
[vc.navigationController pushViewController:self animated:YES];
}else {
self.modalPresentationCapturesStatusBarAppearance = YES;
[vc presentViewController:self animated:NO completion:nil];
}
}
- (void)dismiss {
GKPhotoView *photoView = [self currentPhotoView];
photoView.isLayoutSubViews = YES;
if (!self.isFollowSystemRotation) {
// 状态栏恢复到竖屏
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
if (@available(iOS 13.0, *)) {} else {
[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait animated:NO];
}
#pragma clang diagnostic pop
}
if (self.showStyle == GKPhotoBrowserShowStylePush) {
[self delDeviceOrientationObserver];
[self.navigationController popViewControllerAnimated:YES];
}else {
// 显示状态栏
self.isStatusBarShow = YES;
// 防止返回时跳动
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[self recoverAnimation];
});
}
}
- (void)selectedPhotoWithIndex:(NSInteger)index animated:(BOOL)animated{
if (index < 0 || index >= self.photos.count) return;
CGPoint offset = CGPointMake(self.photoScrollView.frame.size.width * index, 0);
[self.photoScrollView setContentOffset:offset animated:animated];
}
- (void)removePhotoAtIndex:(NSInteger)index {
if (index < 0 || index >= self.photos.count) return;
NSMutableArray *photos = [NSMutableArray arrayWithArray:self.photos];
[photos removeObjectAtIndex:index];
[self resetPhotoBrowserWithPhotos:photos];
}
- (void)resetPhotoBrowserWithPhotos:(NSArray *)photos {
if (photos.count == 0) {
[self dismiss];
return;
}
self.photos = photos;
[self.visiblePhotoViews makeObjectsPerformSelector:@selector(removeFromSuperview)];
[self.reusablePhotoViews removeAllObjects];
[self.visiblePhotoViews removeAllObjects];
[self updateReusableViews];
[self setupPhotoViews];
[self updateViewIndex];
[self layoutSubviews];
}
- (void)loadCurrentPhotoImage {
[self.curPhotoView loadOriginImage];
}
#pragma mark - Private Methods
- (void)addGestureRecognizer {
// 单击手势
UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)];
singleTap.numberOfTapsRequired = 1;
singleTap.delaysTouchesEnded = NO;
singleTap.delegate = self;
[self.photoScrollView addGestureRecognizer:singleTap];
// 双击手势
UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleDoubleTap:)];
doubleTap.numberOfTapsRequired = 2;
doubleTap.delaysTouchesEnded = NO;
doubleTap.delegate = self;
[self.photoScrollView addGestureRecognizer:doubleTap];
[singleTap requireGestureRecognizerToFail:doubleTap];
// 长按手势
UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleLongPress:)];
[self.photoScrollView addGestureRecognizer:longPress];
// 拖拽手势
[self addPanGesture:YES];
}
- (void)addPanGesture:(BOOL)isFirst {
if (self.showStyle == GKPhotoBrowserShowStylePush) {
[self removePanGesture];
}else {
if (isFirst || self.isScreenRotateDisabled) { // 第一次进入或禁止处理屏幕旋转,直接添加手势
[self.photoScrollView addGestureRecognizer:self.panGesture];
}else {
if (self.currentOrientation == UIDeviceOrientationPortrait) {
[self.photoScrollView addGestureRecognizer:self.panGesture];
}
}
}
}
- (void)removePanGesture {
if ([self.photoScrollView.gestureRecognizers containsObject:self.panGesture]) {
[self.photoScrollView removeGestureRecognizer:self.panGesture];
}
}
- (void)dismissAnimated:(BOOL)animated {
GKPhoto *photo = [self currentPhoto];
if (animated) {
[UIView animateWithDuration:self.animDuration animations:^{
photo.sourceImageView.alpha = 1.0;
}];
}else {
photo.sourceImageView.alpha = 1.0;
}
if (!self.isFollowSystemRotation) {
if (@available(iOS 13.0, *)) {} else {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait animated:NO];
#pragma clang diagnostic pop
}
}
// 移除屏幕旋转监听
[self delDeviceOrientationObserver];
if (!self.statusBarAppearance) {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
[[UIApplication sharedApplication] setStatusBarStyle:self.originStatusBarStyle];
#pragma clang diagnostic pop
}
[self dismissViewControllerAnimated:NO completion:nil];
}
- (void)saveBtnClick:(UIButton *)btn {
if ([self.delegate respondsToSelector:@selector(photoBrowser:onSaveBtnClick:image:)]) {
[self.delegate photoBrowser:self onSaveBtnClick:self.currentIndex image:self.curPhotoView.imageView.image];
}
}
- (void)setupCoverViewsWithAlpha:(CGFloat)alpha {
for (UIView *view in self.coverViews) {
view.alpha = alpha;
}
}
#pragma mark - UIGestureRecognizerDelegate
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
if ([touch.view isKindOfClass:UIButton.class]) {
return NO;
}
return YES;
}
#pragma mark - Gesture Handle
- (void)handleSingleTap:(UITapGestureRecognizer *)tap {
if ([self.delegate respondsToSelector:@selector(photoBrowser:singleTapWithIndex:)]) {
[self.delegate photoBrowser:self singleTapWithIndex:self.currentIndex];
}
// 禁言默认单击事件
if (self.isSingleTapDisabled) return;
[self dismiss];
}
- (void)handleDoubleTap:(UITapGestureRecognizer *)tap {
GKPhotoView *photoView = [self currentPhotoView];
GKPhoto *photo = [self currentPhoto];
if (!photo.finished) return;
// 设置双击放大倍数
[photoView setScrollMaxZoomScale:self.doubleZoomScale];
if (photoView.scrollView.zoomScale > 1.0) {
[photoView.scrollView setZoomScale:1.0 animated:YES];
photo.isZooming = NO;
// 默认情况下有滑动手势
[self addPanGesture:YES];
}else {
CGPoint location = [tap locationInView:photoView.imageView];
CGFloat wh = 1.0;
CGRect zoomRect = [self frameWithWidth:wh height:wh center:location];
[photoView zoomToRect:zoomRect animated:YES];
photo.isZooming = YES;
photo.zoomRect = zoomRect;
// 放大情况下移除滑动手势
[self removePanGesture];
}
}
- (CGRect)frameWithWidth:(CGFloat)width height:(CGFloat)height center:(CGPoint)center {
CGFloat x = center.x - width * 0.5;
CGFloat y = center.y - height * 0.5;
return CGRectMake(x, y, width, height);
}
- (void)handleLongPress:(UILongPressGestureRecognizer *)longPress {
switch (longPress.state) {
case UIGestureRecognizerStateBegan:{
if ([self.delegate respondsToSelector:@selector(photoBrowser:longPressWithIndex:)]) {
[self.delegate photoBrowser:self longPressWithIndex:self.currentIndex];
}
}
break;
default:
break;
}
}
- (void)handlePanGesture:(UIPanGestureRecognizer *)panGesture {
// 放大时候禁止滑动返回
GKPhotoView *photoView = [self currentPhotoView];
if (photoView.scrollView.zoomScale > 1.0f) return;
switch (self.hideStyle) {
case GKPhotoBrowserHideStyleZoomScale:
[self handlePanZoomScale:panGesture];
break;
case GKPhotoBrowserHideStyleZoomSlide:
[self handlePanZoomSlide:panGesture];
break;
default:
break;
}
}
- (void)handlePanZoomScale:(UIPanGestureRecognizer *)panGesture {
GKPhotoView *photoView = [self photoViewForIndex:self.currentIndex];
CGPoint point = [panGesture translationInView:self.view];
CGPoint location = [panGesture locationInView:photoView.scrollView];
CGPoint velocity = [panGesture velocityInView:self.view];
switch (panGesture.state) {
case UIGestureRecognizerStateBegan:
self.startLocation = location;
self.startFrame = photoView.imageView.frame;
self.isZoomScale = YES;
photoView.loadingView.hidden = YES;
[self handlePanBegin];
break;
case UIGestureRecognizerStateChanged: {
if (self.view.frame.size.height == 0) return;
double percent = 1 - fabs(point.y) / self.view.frame.size.height;
double s = MAX(percent, 0.3);
if (self.startFrame.size.width == 0 || self.startFrame.size.height == 0) return;
CGFloat width = self.startFrame.size.width * s;
CGFloat height = self.startFrame.size.height * s;
CGFloat rateX = (self.startLocation.x - self.startFrame.origin.x) / self.startFrame.size.width;
CGFloat x = location.x - width * rateX;
CGFloat rateY = (self.startLocation.y - self.startFrame.origin.y) / self.startFrame.size.height;
CGFloat y = location.y - height * rateY;
photoView.imageView.frame = CGRectMake(x, y, width, height);
self.view.backgroundColor = self.bgColor ? [self.bgColor colorWithAlphaComponent:percent] : [[UIColor blackColor] colorWithAlphaComponent:percent];
[self setupCoverViewsWithAlpha:percent];
}
break;
case UIGestureRecognizerStateEnded:
case UIGestureRecognizerStateCancelled:{
if (fabs(point.y) > 200 || fabs(velocity.y) > 500) {
[self showDismissAnimation];
}else {
[self showCancelAnimation];
}
}
break;
default:
break;
}
}
- (void)handlePanZoomSlide:(UIPanGestureRecognizer *)panGesture {
CGPoint point = [panGesture translationInView:self.view];
CGPoint location = [panGesture locationInView:self.view];
CGPoint velocity = [panGesture velocityInView:self.view];
GKPhotoView *photoView = [self currentPhotoView];
switch (panGesture.state) {
case UIGestureRecognizerStateBegan:
_startLocation = location;
photoView.loadingView.hidden = YES;
[self handlePanBegin];
break;
case UIGestureRecognizerStateChanged:{
photoView.imageView.transform = CGAffineTransformMakeTranslation(0, point.y);
if (self.view.frame.size.height == 0) return;
double percent = 1 - fabs(point.y) / self.view.frame.size.height * 0.5;
self.view.backgroundColor = self.bgColor ? [self.bgColor colorWithAlphaComponent:percent] : [[UIColor blackColor] colorWithAlphaComponent:percent];
[self setupCoverViewsWithAlpha:percent];
}
break;
case UIGestureRecognizerStateEnded:
case UIGestureRecognizerStateCancelled: {
if (fabs(point.y) > 200 || fabs(velocity.y) > 500) {
[self showSlideDismissAnimationWithPoint:point];
}else {
[self showCancelAnimation];
}
}
break;
default:
break;
}
}
- (void)handlePanBegin {
GKPhoto *photo = [self currentPhoto];
if (self.isHideSourceView) {
photo.sourceImageView.alpha = 0;
}
_isStatusBarShowing = self.isStatusBarShow;
// 显示状态栏
self.isStatusBarShow = YES;
if ([self.delegate respondsToSelector:@selector(photoBrowser:panBeginWithIndex:)]) {
[self.delegate photoBrowser:self panBeginWithIndex:self.currentIndex];
}
}
- (void)recoverAnimation {
UIDeviceOrientation orientation = [UIDevice currentDevice].orientation;
CGRect screenBounds = [UIScreen mainScreen].bounds;
if (!self.isFollowSystemRotation && self.supportedInterfaceOrientations == UIInterfaceOrientationPortrait && UIDeviceOrientationIsLandscape(orientation)) {
[UIView animateWithDuration:self.animDuration animations:^{
// 旋转view
self.contentView.transform = CGAffineTransformIdentity;
CGFloat height = MAX(screenBounds.size.width, screenBounds.size.height);
if (self.isAdaptiveSafeArea) {
height -= (kSafeTopSpace + kSafeBottomSpace);
}
// 设置frame
self.contentView.bounds = CGRectMake(0, 0, MIN(screenBounds.size.width, screenBounds.size.height), height);
self.contentView.center = self.view.center;
[self.view setNeedsLayout];
[self.view layoutIfNeeded];
[self layoutSubviews];
}completion:^(BOOL finished) {
[self showDismissAnimation];
}];
}else {
[self showDismissAnimation];
}
}
- (void)showDismissAnimation {
GKPhotoView *photoView = [self photoViewForIndex:self.currentIndex];
GKPhoto *photo = self.photos[self.currentIndex];
CGRect sourceRect = photo.sourceFrame;
if (CGRectEqualToRect(sourceRect, CGRectZero)) {
if (photo.sourceImageView == nil) {
[UIView animateWithDuration:self.animDuration animations:^{
self.view.alpha = 0;
}completion:^(BOOL finished) {
[self dismissAnimated:NO];
}];
return;
}
if (self.isHideSourceView) {
photo.sourceImageView.alpha = 0;
}
float systemVersion = [UIDevice currentDevice].systemVersion.floatValue;
if (systemVersion >= 8.0 && systemVersion < 9.0) {
sourceRect = [photo.sourceImageView.superview convertRect:photo.sourceImageView.frame toCoordinateSpace:photoView];
}else {
sourceRect = [photo.sourceImageView.superview convertRect:photo.sourceImageView.frame toView:photoView];
}
}else {
if (self.isHideSourceView && photo.sourceImageView) {
photo.sourceImageView.alpha = 0;
}
}
if (photoView.scrollView.zoomScale > 1.0f) {
[photoView.scrollView setZoomScale:1.0f animated:NO];
}
if (photo.sourceImageView) {
photoView.imageView.image = photo.sourceImageView.image;
}
// Fix bug:解决长图点击隐藏时可能出现的闪动bug
UIViewContentMode mode = photo.sourceImageView ? photo.sourceImageView.contentMode : UIViewContentModeScaleAspectFill;
photoView.imageView.contentMode = mode;
sourceRect.origin.x -= photoView.scrollView.contentOffset.x;
sourceRect.origin.y += photoView.scrollView.contentOffset.y;
[UIView animateWithDuration:self.animDuration animations:^{
[self setupCoverViewsWithAlpha:0];
photoView.imageView.frame = sourceRect;
self.view.backgroundColor = [UIColor clearColor];
}completion:^(BOOL finished) {
[self dismissAnimated:NO];
[self panEndedWillDisappear:YES];
}];
}
- (void)showSlideDismissAnimationWithPoint:(CGPoint)point {
GKPhotoView *photoView = [self currentPhotoView];
BOOL throwToTop = point.y < 0;
CGFloat toTranslationY = 0;
if (throwToTop) {
toTranslationY = - self.view.frame.size.height;
}else {
toTranslationY = self.view.frame.size.height;
}
[UIView animateWithDuration:self.animDuration animations:^{
photoView.imageView.transform = CGAffineTransformMakeTranslation(0, toTranslationY);
self.view.backgroundColor = [UIColor clearColor];
}completion:^(BOOL finished) {
[self dismissAnimated:YES];
[self panEndedWillDisappear:YES];
}];
}
- (void)showCancelAnimation {
GKPhotoView *photoView = [self photoViewForIndex:self.currentIndex];
GKPhoto *photo = self.photos[self.currentIndex];
photo.sourceImageView.alpha = 1.0;
[UIView animateWithDuration:self.animDuration animations:^{
if (self.hideStyle == GKPhotoBrowserHideStyleZoomScale) {
photoView.imageView.frame = self.startFrame;
}else {
photoView.imageView.transform = CGAffineTransformIdentity;
}
self.view.backgroundColor = self.bgColor ? : [UIColor blackColor];
}completion:^(BOOL finished) {
if (!self.isStatusBarShowing) {
// 隐藏状态栏
self.isStatusBarShow = NO;
}
photoView.loadingView.hidden = NO;
[self panEndedWillDisappear:NO];
}];
}
- (void)panEndedWillDisappear:(BOOL)disappear {
if ([self.delegate respondsToSelector:@selector(photoBrowser:panEndedWithIndex:willDisappear:)]) {
[self.delegate photoBrowser:self panEndedWithIndex:self.currentIndex willDisappear:disappear];
}
}
// 重用页面
- (GKPhotoView *)dequeueReusablePhotoView {
GKPhotoView *photoView = [self.reusablePhotoViews anyObject];
if (photoView) {
[_reusablePhotoViews removeObject:photoView];
}else {
photoView = [[GKPhotoView alloc] initWithFrame:self.photoScrollView.bounds imageProtocol:_imageProtocol];
}
photoView.tag = -1;
return photoView;
}
#pragma mark - 屏幕旋转相关
- (void)addDeviceOrientationObserver {
if (self.isFollowSystemRotation) return;
// 默认设备方向:竖屏
self.originalOrientation = UIDeviceOrientationPortrait;
self.currentOrientation = [UIDevice currentDevice].orientation;
// 未知或者朝上都认为是竖屏
if (self.currentOrientation == UIDeviceOrientationUnknown || self.currentOrientation == UIDeviceOrientationFaceUp) {
self.currentOrientation = UIDeviceOrientationPortrait;
}
// 20200312 尚未添加observer的情况下才添加,防止多次重复添加
if(!_isOrientationNotiObserverAdded)
{
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(deviceOrientationDidChange) name:UIDeviceOrientationDidChangeNotification object:nil];
_isOrientationNotiObserverAdded = YES;
}
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
}
- (void)delDeviceOrientationObserver {
if (self.isFollowSystemRotation) return;
// 20200312 如果在唤起GKPhotoBrowser前,app已经开启屏幕旋转通知GeneratingDeviceOrientationNotifications,那么无需停止,否则会影响全局的其他监听屏幕旋转的功能。
if(self.isGeneratingDeviceOrientationNotificationsBegunBeforePhotoBrowserAppeared)
return;
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIDeviceOrientationDidChangeNotification object:nil];
if([UIDevice currentDevice].isGeneratingDeviceOrientationNotifications)
[[UIDevice currentDevice] endGeneratingDeviceOrientationNotifications];
}
- (void)deviceOrientationDidChange {
if (self.isFollowSystemRotation) return;
if (self.isScreenRotateDisabled) return;
// 旋转之后当前的设备方向
UIDeviceOrientation currentOrientation = [UIDevice currentDevice].orientation;
// 未知或者朝上都认为是竖屏
if (currentOrientation == UIDeviceOrientationUnknown || currentOrientation == UIDeviceOrientationFaceUp) {
currentOrientation = UIDeviceOrientationPortrait;
}
// 修复bug #117,从后台进入前台会执行此方法 导致缩放变化,所以此处做下处理
if (self.currentOrientation == currentOrientation) return;
self.currentOrientation = currentOrientation;
self.isRotation = YES;
// 恢复当前视图的缩放
GKPhoto *photo = [self currentPhoto];
photo.isZooming = NO;
photo.zoomRect = CGRectZero;
GKPhotoView *photoView = [self currentPhotoView];
if (UIDeviceOrientationIsPortrait(self.originalOrientation)) {
if (UIDeviceOrientationIsLandscape(currentOrientation)) {
[photoView.scrollView setZoomScale:1.0 animated:YES];
}
}
if (UIDeviceOrientationIsLandscape(self.originalOrientation)) {
if (UIDeviceOrientationIsPortrait(currentOrientation)) {
[photoView.scrollView setZoomScale:1.0 animated:YES];
}
}
CGRect screenBounds = [UIScreen mainScreen].bounds;
// 旋转之后是横屏
if (UIDeviceOrientationIsLandscape(currentOrientation)) {
self.isLandscape = YES;
[self deviceOrientationChangedDelegate];
// 横屏移除pan手势
[self removePanGesture];
NSTimeInterval duration = UIDeviceOrientationIsLandscape(self.originalOrientation) ? 2 * self.animDuration : self.animDuration;
[UIView animateWithDuration:duration delay:0 options:UIViewAnimationOptionBeginFromCurrentState animations:^{
// 旋转状态栏
if (@available(iOS 13.0, *)) {} else {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
[[UIApplication sharedApplication] setStatusBarOrientation:(UIInterfaceOrientation)currentOrientation animated:YES];
#pragma clang diagnostic pop
}
float rotation = currentOrientation == UIDeviceOrientationLandscapeRight ? 1.5 : 0.5;
// 旋转contentView
self.contentView.transform = CGAffineTransformMakeRotation(M_PI * rotation);
CGFloat width = MAX(screenBounds.size.width, screenBounds.size.height);
if (self.isAdaptiveSafeArea) {
width -= (kSafeTopSpace + kSafeBottomSpace);
}
// 设置frame
self.contentView.bounds = CGRectMake(0, 0, width, MIN(screenBounds.size.width, screenBounds.size.height));
self.contentView.center = self.view.center;
[self.view setNeedsLayout];
[self.view layoutIfNeeded];
[self layoutSubviews];
} completion:^(BOOL finished) {
// 记录设备方向
self.originalOrientation = currentOrientation;
self.isRotation = NO;
// 横屏时隐藏状态栏,这里为了解决一个bug,iPhone X中横屏状态栏隐藏后不能再次显示,暂时的解决办法是这样,如果有更好的方法可随时修改
if (self.isStatusBarShow) { // 状态栏是显示状态
self.isStatusBarShowing = self.isStatusBarShow; // 记录状态栏显隐状态
self.isStatusBarShow = NO;
}
}];
}else if (currentOrientation == UIDeviceOrientationPortrait) {
self.isLandscape = NO;
[self deviceOrientationChangedDelegate];
// 竖屏时添加pan手势
[self addPanGesture:NO];
NSTimeInterval duration = self.animDuration;
[UIView animateWithDuration:duration delay:0 options:UIViewAnimationOptionBeginFromCurrentState animations:^{
// 旋转状态栏
if (@available(iOS 13.0, *)) {} else {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
[[UIApplication sharedApplication] setStatusBarOrientation:(UIInterfaceOrientation)currentOrientation animated:YES];
#pragma clang diagnostic pop
}
// 旋转view
self.contentView.transform = currentOrientation == UIDeviceOrientationPortrait ? CGAffineTransformIdentity : CGAffineTransformMakeRotation(M_PI);
CGFloat height = MAX(screenBounds.size.width, screenBounds.size.height);
if (self.isAdaptiveSafeArea) {
height -= (kSafeTopSpace + kSafeBottomSpace);
}
// 设置frame
self.contentView.bounds = CGRectMake(0, 0, MIN(screenBounds.size.width, screenBounds.size.height), height);
self.contentView.center = self.view.center;
[self.view setNeedsLayout];
[self.view layoutIfNeeded];
[self layoutSubviews];
} completion:^(BOOL finished) {
// 记录设备方向
self.originalOrientation = currentOrientation;
self.isRotation = NO;
// 切换到竖屏后,如果原来状态栏是显示状态,就再次显示状态栏
if (self.isStatusBarShowing) {
self.isStatusBarShow = YES;
self.isStatusBarShowing = NO;
}
}];
}else {
self.isRotation = NO;
self.isLandscape = NO;
[self.view setNeedsLayout];
[self.view layoutIfNeeded];
[self layoutSubviews];
[self deviceOrientationChangedDelegate];
}
}
- (void)deviceOrientationChangedDelegate {
if ([self.delegate respondsToSelector:@selector(photoBrowser:onDeciceChangedWithIndex:isLandscape:)]) {
[self.delegate photoBrowser:self onDeciceChangedWithIndex:self.currentIndex isLandscape:self.isLandscape];
}
}
// 更新可复用的图片视图
- (void)updateReusableViews {
NSMutableArray *viewsForRemove = [NSMutableArray new];
[self.visiblePhotoViews enumerateObjectsUsingBlock:^(GKPhotoView *photoView, NSUInteger idx, BOOL * _Nonnull stop) {
if ((photoView.frame.origin.x + photoView.frame.size.width < self.photoScrollView.contentOffset.x - self.photoScrollView.frame.size.width) || (photoView.frame.origin.x > self.photoScrollView.contentOffset.x + 2 * self.photoScrollView.frame.size.width)) {
[photoView removeFromSuperview];
GKPhoto *photo = nil;
[photoView setupPhoto:photo];
[viewsForRemove addObject:photoView];
[self.reusablePhotoViews addObject:photoView];
}
}];
[self.visiblePhotoViews removeObjectsInArray:viewsForRemove];
}
// 设置图片视图
- (void)setupPhotoViews {
NSInteger index = self.photoScrollView.contentOffset.x / self.photoScrollView.frame.size.width + 0.5;
for (NSInteger i = index - 1; i <= index + 1; i++) {
if (i < 0 || i >= self.photos.count) continue;
GKPhotoView *photoView = [self photoViewForIndex:i];
if (photoView == nil) {
photoView = [self dequeueReusablePhotoView];
photoView.loadStyle = self.loadStyle;
photoView.originLoadStyle = self.originLoadStyle;
photoView.failStyle = self.failStyle;
photoView.isFullWidthForLandScape = self.isFullWidthForLandScape;
photoView.failureText = self.failureText;
photoView.failureImage = self.failureImage;
photoView.maxZoomScale = self.maxZoomScale;
photoView.doubleZoomScale = self.doubleZoomScale;
__typeof(self) __weak weakSelf = self;
__typeof(photoView) __weak weakPhotoView = photoView;
photoView.zoomEnded = ^(GKPhotoView * _Nonnull curPhotoView, CGFloat scale) {
if (curPhotoView.tag == weakPhotoView.tag) {
if (scale == 1.0f) {
[weakSelf addPanGesture:NO];
}else {
[weakSelf removePanGesture];
}
}
};
photoView.loadFailed = ^(GKPhotoView * _Nonnull curPhotoView) {
if (curPhotoView.tag == weakPhotoView.tag) {
if ([weakSelf.delegate respondsToSelector:@selector(photoBrowser:loadFailedAtIndex:)]) {
[weakSelf.delegate photoBrowser:weakSelf loadFailedAtIndex:weakSelf.currentIndex];
}
}
};
photoView.loadProgressBlock = ^(GKPhotoView * _Nonnull curPhotoView, float progress, BOOL isOriginImage) {
if (curPhotoView.tag == weakPhotoView.tag) {
if ([weakSelf.delegate respondsToSelector:@selector(photoBrowser:loadImageAtIndex:progress:isOriginImage:)]) {
[weakSelf.delegate photoBrowser:weakSelf loadImageAtIndex:weakSelf.currentIndex progress:progress isOriginImage:isOriginImage];
}
}
};
CGRect frame = self.photoScrollView.bounds;
CGFloat photoScrollW = frame.size.width;
CGFloat photoScrollH = frame.size.height;
// 调整当前显示的photoView的frame
CGFloat w = photoScrollW - kPhotoViewPadding * 2;
CGFloat h = photoScrollH;
CGFloat x = kPhotoViewPadding + i * (kPhotoViewPadding * 2 + w);
CGFloat y = 0;
photoView.frame = CGRectMake(x, y, w, h);
photoView.tag = i;
[self.photoScrollView addSubview:photoView];
[_visiblePhotoViews addObject:photoView];
[photoView resetFrame];
}
if (photoView.photo == nil && self.isShow) {
[photoView setupPhoto:self.photos[i]];
}
}
// 更换photoView
if (index != self.currentIndex && self.isShow && (index >= 0 && index < self.photos.count)) {
self.currentIndex = index;
GKPhotoView *photoView = [self currentPhotoView];
self.curPhotoView = photoView;
GKPhoto *photo = [self currentPhoto];
if (photo.failed) {
[photoView setupPhoto:photo];
}
if (photoView.scrollView.zoomScale != 1.0) {
[self removePanGesture];
}else {
[self addPanGesture:NO];
}
[self updateViewIndex];
if ([self.delegate respondsToSelector:@selector(photoBrowser:didChangedIndex:)]) {
[self.delegate photoBrowser:self didChangedIndex:self.currentIndex];
}
}
}
- (GKPhotoView *)photoViewForIndex:(NSInteger)index {
for (GKPhotoView *photoView in _visiblePhotoViews) {
if (photoView.tag == index) {
return photoView;
}
}
return nil;
}
#pragma mark - 代理
#pragma mark - UIScrollViewDelegate
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
if (self.isRotation) return;
[self updateReusableViews];
[self setupPhotoViews];
if ([self.delegate respondsToSelector:@selector(photoBrowser:scrollViewDidScroll:)]) {
[self.delegate photoBrowser:self scrollViewDidScroll:scrollView];
}
}
// scrollView结束滚动时调用
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
CGFloat offsetX = scrollView.contentOffset.x;
CGFloat scrollW = self.photoScrollView.frame.size.width;
if (scrollW == 0) return;
NSInteger index = (offsetX + scrollW * 0.5) / scrollW;
self.curPhotoView = [self currentPhotoView];
if ([self.delegate respondsToSelector:@selector(photoBrowser:didSelectAtIndex:)]) {
[self.delegate photoBrowser:self didSelectAtIndex:index];
}
if (self.isResumePhotoZoom) {
[self.visiblePhotoViews enumerateObjectsUsingBlock:^(GKPhotoView *photoView, NSUInteger idx, BOOL * _Nonnull stop) {
GKPhoto *photo = self.photos[idx];
photo.isZooming = NO;
[photoView.scrollView setZoomScale:1.0 animated:NO];
}];
}
if ([self currentPhotoView].scrollView.zoomScale > 1.0) {
[self removePanGesture];
}else {
[self addPanGesture:NO];
}
if ([self.delegate respondsToSelector:@selector(photoBrowser:scrollViewDidEndDecelerating:)]) {
[self.delegate photoBrowser:self scrollViewDidEndDecelerating:scrollView];
}
}
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {
if ([self.delegate respondsToSelector:@selector(photoBrowser:scrollViewDidEndDragging:willDecelerate:)]) {
[self.delegate photoBrowser:self scrollViewDidEndDragging:scrollView willDecelerate:decelerate];
}
}
- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator {
if (!self.isFollowSystemRotation) return;
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.01f * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[UIView animateWithDuration:0.3 animations:^{
CGFloat width = self.view.bounds.size.width;
CGFloat height = self.view.bounds.size.height;
if (self.isAdaptiveSafeArea) {
if (width > height) {
width -= (kSafeTopSpace + kSafeBottomSpace);
}else {
height -= (kSafeTopSpace + kSafeBottomSpace);
}
}
self.contentView.bounds = CGRectMake(0, 0, width, height);
self.contentView.center = self.view.center;
[self.view setNeedsLayout];
[self.view layoutIfNeeded];
[self layoutSubviews];
}];
});
}
#pragma mark - 懒加载
- (UIScrollView *)photoScrollView {
if (!_photoScrollView) {
CGRect frame = self.view.bounds;
frame.origin.x -= kPhotoViewPadding;
frame.size.width += (2 * kPhotoViewPadding);
_photoScrollView = [[UIScrollView alloc] initWithFrame:frame];
_photoScrollView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
_photoScrollView.pagingEnabled = YES;
_photoScrollView.delegate = self;
_photoScrollView.showsVerticalScrollIndicator = NO;
_photoScrollView.showsHorizontalScrollIndicator = NO;
_photoScrollView.alwaysBounceHorizontal = YES;
_photoScrollView.backgroundColor = [UIColor clearColor];
if (self.showStyle == GKPhotoBrowserShowStylePush) {
if (self.isPopGestureEnabled) {
_photoScrollView.gk_gestureHandleEnabled = YES;
}
}
if (@available(iOS 11.0, *)) {
_photoScrollView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
}
}
return _photoScrollView;
}
- (GKPanGestureRecognizer *)panGesture {
if (!_panGesture) {
_panGesture = [[GKPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePanGesture:)];
_panGesture.direction = GKPanGestureRecognizerDirectionVertical;
}
return _panGesture;
}
- (GKPhoto *)currentPhoto {
if (self.currentIndex >= self.photos.count) {
return nil;
}
return self.photos[self.currentIndex];
}
- (GKPhotoView *)currentPhotoView {
return [self photoViewForIndex:self.currentIndex];
}
- (UILabel *)countLabel {
if (!_countLabel) {
UILabel *countLabel = [UILabel new];
countLabel.textColor = UIColor.whiteColor;
countLabel.font = [UIFont systemFontOfSize:16.0f];
countLabel.textAlignment = NSTextAlignmentCenter;
countLabel.bounds = CGRectMake(0, 0, 80, 30);
_countLabel = countLabel;
}
return _countLabel;
}
- (UIPageControl *)pageControl {
if (!_pageControl) {
UIPageControl *pageControl = [UIPageControl new];
pageControl.numberOfPages = self.photos.count;
pageControl.currentPage = self.currentIndex;
pageControl.hidesForSinglePage = YES;
pageControl.hidden = YES;
if (@available(iOS 14.0, *)) {
pageControl.backgroundStyle = UIPageControlBackgroundStyleMinimal;
}
_pageControl = pageControl;
}
return _pageControl;
}
- (UIButton *)saveBtn {
if (!_saveBtn) {
UIButton *saveBtn = [UIButton new];
saveBtn.bounds = CGRectMake(0, 0, 50, 30);
[saveBtn setTitle:@"保存" forState:UIControlStateNormal];
[saveBtn setTitleColor:UIColor.whiteColor forState:UIControlStateNormal];
saveBtn.titleLabel.font = [UIFont systemFontOfSize:15.0f];
saveBtn.layer.cornerRadius = 5;
saveBtn.layer.masksToBounds = YES;
saveBtn.layer.borderColor = UIColor.whiteColor.CGColor;
saveBtn.layer.borderWidth = 1;
saveBtn.hidden = YES;
[saveBtn addTarget:self action:@selector(saveBtnClick:) forControlEvents:UIControlEventTouchUpInside];
_saveBtn = saveBtn;
}
return _saveBtn;
}
@end
//
// GKPhotoBrowserConfigure.h
// GKPhotoBrowser
//
// Created by QuintGao on 2020/10/19.
// Copyright © 2020年 QuintGao. All rights reserved.
//
#import <UIKit/UIKit.h>
#import "UIScrollView+GKPhotoBrowser.h"
#define GKScreenW [UIScreen mainScreen].bounds.size.width
#define GKScreenH [UIScreen mainScreen].bounds.size.height
// 判断iPhone X
#define KIsiPhoneX [GKPhotoBrowserConfigure gk_isNotchedScreen]
// 底部安全区域高度
#define kSafeTopSpace (KIsiPhoneX ? 24.0f : 0.0f)
#define kSafeBottomSpace (KIsiPhoneX ? 34.0f : 0.0f)
// 默认最大缩放程度
#define kMaxZoomScale 2.0f
// 默认图片间距
#define kPhotoViewPadding 10
// 默认动画时间
#define kAnimationDuration 0.3f
// 加载本地图片
#define GKPhotoBrowserImage(name) [GKPhotoBrowserConfigure gk_imageWithName:name]
// 图片浏览器的显示方式
typedef NS_ENUM(NSUInteger, GKPhotoBrowserShowStyle) {
GKPhotoBrowserShowStyleNone, // 直接显示,默认方式
GKPhotoBrowserShowStyleZoom, // 缩放显示,动画效果
GKPhotoBrowserShowStylePush // push方式展示
};
// 图片浏览器的隐藏方式
typedef NS_ENUM(NSUInteger, GKPhotoBrowserHideStyle) {
GKPhotoBrowserHideStyleZoom, // 点击缩放消失
GKPhotoBrowserHideStyleZoomScale, // 点击缩放消失、滑动缩小后消失
GKPhotoBrowserHideStyleZoomSlide // 点击缩放消失、滑动平移后消失
};
// 图片浏览器的加载方式
typedef NS_ENUM(NSUInteger, GKPhotoBrowserLoadStyle) {
GKPhotoBrowserLoadStyleIndeterminate, // 不明确的加载方式
GKPhotoBrowserLoadStyleIndeterminateMask, // 不明确的加载方式带阴影
GKPhotoBrowserLoadStyleDeterminate, // 明确的加载方式带进度条
GKPhotoBrowserLoadStyleCustom // 自定义加载方式
};
// 图片加载失败的显示方式
typedef NS_ENUM(NSUInteger, GKPhotoBrowserFailStyle) {
GKPhotoBrowserFailStyleOnlyText, // 显示文字
GKPhotoBrowserFailStyleOnlyImage, // 显示图片
GKPhotoBrowserFailStyleImageAndText, // 显示图片+文字
GKPhotoBrowserFailStyleCustom // 自定义(如:显示HUD)
};
@interface GKPhotoBrowserConfigure : NSObject
/// 安全区域
+ (UIEdgeInsets)gk_safeAreaInsets;
/// 状态栏frame
+ (CGRect)gk_statusBarFrame;
/// 判断是否是刘海屏
+ (BOOL)gk_isNotchedScreen;
/// 根据图片名字获取图片
/// @param name 图片名字
+ (UIImage *)gk_imageWithName:(NSString *)name;
@end
//
// GKPhotoBrowserConfigure.m
// GKPhotoBrowser
//
// Created by gaokun on 2020/10/19.
// Copyright © 2020 QuintGao. All rights reserved.
//
#import "GKPhotoBrowserConfigure.h"
/// 设备宽度,跟横竖屏无关
#define GKPHOTO_DEVICE_WIDTH MIN([[UIScreen mainScreen] bounds].size.width, [[UIScreen mainScreen] bounds].size.height)
/// 设备高度,跟横竖屏无关
#define GKPHOTO_DEVICE_HEIGHT MAX([[UIScreen mainScreen] bounds].size.width, [[UIScreen mainScreen] bounds].size.height)
NSString *const GKPhotoBrowserBundleName = @"GKPhotoBrowser";
@interface GKPhotoPortraitViewController : UIViewController
@end
@implementation GKPhotoPortraitViewController
- (BOOL)shouldAutorotate {
return NO;
}
- (UIInterfaceOrientationMask)supportedInterfaceOrientations {
return UIInterfaceOrientationMaskPortrait;
}
@end
@implementation GKPhotoBrowserConfigure
+ (UIEdgeInsets)gk_safeAreaInsets {
UIEdgeInsets safeAreaInsets = UIEdgeInsetsZero;
if (@available(iOS 11.0, *)) {
UIWindow *window = [self getKeyWindow];
if (!window) {
// keyWindow还没创建时,通过创建临时window获取安全区域
window = [[UIWindow alloc] initWithFrame:UIScreen.mainScreen.bounds];
if (window.safeAreaInsets.bottom <= 0) {
UIViewController *viewController = [UIViewController new];
window.rootViewController = viewController;
}
}
safeAreaInsets = window.safeAreaInsets;
}
return safeAreaInsets;
}
+ (CGRect)gk_statusBarFrame {
CGRect statusBarFrame = CGRectZero;
if (@available(iOS 13.0, *)) {
statusBarFrame = [GKPhotoBrowserConfigure getKeyWindow].windowScene.statusBarManager.statusBarFrame;
}
if (CGRectEqualToRect(statusBarFrame, CGRectZero)) {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
statusBarFrame = [UIApplication sharedApplication].statusBarFrame;
#pragma clang diagnostic pop
}
if (CGRectEqualToRect(statusBarFrame, CGRectZero)) {
CGFloat statusBarH = [GKPhotoBrowserConfigure gk_isNotchedScreen] ? 44 : 20;
statusBarFrame = CGRectMake(0, 0, GKScreenW, statusBarH);
}
return statusBarFrame;
}
static NSInteger isNotchedScreen = -1;
+ (BOOL)gk_isNotchedScreen {
if (isNotchedScreen < 0) {
if (@available(iOS 12.0, *)) {
/*
检测方式解释/测试要点:
1. iOS 11 与 iOS 12 可能行为不同,所以要分别测试。
2. 与触发 [QMUIHelper isNotchedScreen] 方法时的进程有关,例如 https://github.com/Tencent/QMUI_iOS/issues/482#issuecomment-456051738 里提到的 [NSObject performSelectorOnMainThread:withObject:waitUntilDone:NO] 就会导致较多的异常。
3. iOS 12 下,在非第2点里提到的情况下,iPhone、iPad 均可通过 UIScreen -_peripheryInsets 方法的返回值区分,但如果满足了第2点,则 iPad 无法使用这个方法,这种情况下要依赖第4点。
4. iOS 12 下,不管是否满足第2点,不管是什么设备类型,均可以通过一个满屏的 UIWindow 的 rootViewController.view.frame.origin.y 的值来区分,如果是非全面屏,这个值必定为20,如果是全面屏,则可能是24或44等不同的值。但由于创建 UIWindow、UIViewController 等均属于较大消耗,所以只在前面的步骤无法区分的情况下才会使用第4点。
5. 对于第4点,经测试与当前设备的方向、是否有勾选 project 里的 General - Hide status bar、当前是否处于来电模式的状态栏这些都没关系。
*/
SEL peripheryInsetsSelector = NSSelectorFromString([NSString stringWithFormat:@"_%@%@", @"periphery", @"Insets"]);
UIEdgeInsets peripheryInsets = UIEdgeInsetsZero;
[self object:[UIScreen mainScreen] performSelector:peripheryInsetsSelector returnValue:&peripheryInsets];
if (peripheryInsets.bottom <= 0) {
UIWindow *window = [[UIWindow alloc] initWithFrame:UIScreen.mainScreen.bounds];
peripheryInsets = window.safeAreaInsets;
if (peripheryInsets.bottom <= 0) {
// 使用一个强制竖屏的rootViewController,避免一个仅支持竖屏的App在横屏启动时会受到这里创建的window的影响,导致状态栏、safeAreaInsets等错乱
GKPhotoPortraitViewController *viewController = [GKPhotoPortraitViewController new];
window.rootViewController = viewController;
if (CGRectGetMinY(viewController.view.frame) > 20) {
peripheryInsets.bottom = 1;
}
}
}
isNotchedScreen = peripheryInsets.bottom > 0 ? 1 : 0;
} else {
isNotchedScreen = [self is58InchScreen] ? 1 : 0;
}
}
return isNotchedScreen > 0;
}
+ (void)object:(NSObject *)object performSelector:(SEL)selector returnValue:(void *)returnValue {
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[object methodSignatureForSelector:selector]];
[invocation setTarget:object];
[invocation setSelector:selector];
[invocation invoke];
if (returnValue) {
[invocation getReturnValue:returnValue];
}
}
+ (UIWindow *)getKeyWindow {
UIWindow *window = nil;
if (@available(iOS 13.0, *)) {
for (UIWindowScene *windowScene in [UIApplication sharedApplication].connectedScenes) {
if (windowScene.activationState == UISceneActivationStateForegroundActive) {
for (UIWindow *w in windowScene.windows) {
if (window.isKeyWindow) {
window = w;
break;
}
}
}
}
}
if (!window) {
window = [UIApplication sharedApplication].windows.firstObject;
if (!window.isKeyWindow) {
#pragma clang diagnostic push
#pragma clang disagnostic ignored "-Wdeprecated-declarations"
UIWindow *keyWindow = [UIApplication sharedApplication].keyWindow;
#pragma clang disagnostic pop
if (CGRectEqualToRect(keyWindow.bounds, UIScreen.mainScreen.bounds)) {
window = keyWindow;
}
}
}
return window;
}
+ (UIImage *)gk_imageWithName:(NSString *)name {
static NSBundle *resourceBundle = nil;
if (!resourceBundle) {
NSBundle *mainBundle = [NSBundle bundleForClass:self];
NSString *resourcePath = [mainBundle pathForResource:GKPhotoBrowserBundleName ofType:@"bundle"];
resourceBundle = [NSBundle bundleWithPath:resourcePath] ?: mainBundle;
}
UIImage *image = [UIImage imageNamed:name inBundle:resourceBundle compatibleWithTraitCollection:nil];
return image;
}
static NSInteger is58InchScreen = -1;
+ (BOOL)is58InchScreen {
if (is58InchScreen < 0) {
// Both iPhone XS and iPhone X share the same actual screen sizes, so no need to compare identifiers
// iPhone XS 和 iPhone X 的物理尺寸是一致的,因此无需比较机器 Identifier
is58InchScreen = (GKPHOTO_DEVICE_WIDTH == self.screenSizeFor58Inch.width && GKPHOTO_DEVICE_HEIGHT == self.screenSizeFor58Inch.height) ? 1 : 0;
}
return is58InchScreen > 0;
}
+ (CGSize)screenSizeFor58Inch {
return CGSizeMake(375, 812);
}
@end
//
// GKPhotoManager.h
// GKPhotoBrowserDemo
//
// Created by gaokun on 2020/6/16.
// Copyright © 2020 QuintGao. All rights reserved.
//
#import <Foundation/Foundation.h>
#import <Photos/Photos.h>
#import "GKPhotoBrowserConfigure.h"
NS_ASSUME_NONNULL_BEGIN
@interface GKPhoto : NSObject
/** 图片地址 */
@property (nonatomic, strong) NSURL *url;
/** 原图地址 */
@property (nonatomic, strong) NSURL *originUrl;
/** 来源imageView */
@property (nonatomic, strong) UIImageView *sourceImageView;
/** 来源frame */
@property (nonatomic, assign) CGRect sourceFrame;
/** 图片(静态) */
@property (nonatomic, strong, nullable) UIImage *image;
/** 相册图片资源 */
@property (nonatomic, strong, nullable) PHAsset *imageAsset;
/** 占位图 */
@property (nonatomic, strong, nullable) UIImage *placeholderImage;
/************************内部使用,无需关心 ********************/
/** 图片是否加载完成 */
@property (nonatomic, assign) BOOL finished;
@property (nonatomic, assign) BOOL originFinished;
/** 图片是否加载失败 */
@property (nonatomic, assign) BOOL failed;
/** 记录photoView是否缩放 */
@property (nonatomic, assign) BOOL isZooming;
/** 记录photoView缩放时的rect */
@property (nonatomic, assign) CGRect zoomRect;
/** 记录每个GKPhotoView的滑动位置 */
@property (nonatomic, assign) CGPoint offset;
@end
@interface GKPhotoManager : NSObject
/// 加载相册资源图片
/// @param imageAsset PHAsset对象
/// @param completion 完成回调
+ (PHImageRequestID)loadImageDataWithImageAsset:(PHAsset *)imageAsset completion:(nonnull void(^)(NSData *_Nullable data))completion;
/// 根据宽度加载相册资源图片
/// @param asset PHAsset对象
/// @param photoWidth 宽度
/// @param completion 完成回调
+ (PHImageRequestID)loadImageWithAsset:(PHAsset *)asset photoWidth:(CGFloat)photoWidth completion:(nonnull void(^)(UIImage *_Nullable image))completion;
@end
NS_ASSUME_NONNULL_END
//
// GKPhotoManager.m
// GKPhotoBrowserDemo
//
// Created by gaokun on 2020/6/16.
// Copyright © 2020 QuintGao. All rights reserved.
//
#import "GKPhotoManager.h"
@implementation GKPhoto
@end
@implementation GKPhotoManager
+ (PHImageRequestID)loadImageDataWithImageAsset:(PHAsset *)imageAsset completion:(void (^)(NSData * _Nullable))completion {
PHImageRequestOptions *options = [PHImageRequestOptions new];
options.networkAccessAllowed = YES;
options.resizeMode = PHImageRequestOptionsResizeModeFast;
PHImageRequestID requestID = [[PHImageManager defaultManager] requestImageDataForAsset:imageAsset options:options resultHandler:^(NSData * _Nullable imageData, NSString * _Nullable dataUTI, UIImageOrientation orientation, NSDictionary * _Nullable info) {
BOOL complete = ![[info objectForKey:PHImageCancelledKey] boolValue] && ![info objectForKey:PHImageErrorKey] && ![[info objectForKey:PHImageResultIsDegradedKey] boolValue];
if (complete && imageData) {
completion(imageData);
} else {
completion(nil);
}
}];
return requestID;
}
+ (PHImageRequestID)loadImageWithAsset:(PHAsset *)asset photoWidth:(CGFloat)photoWidth completion:(void (^)(UIImage * _Nullable))completion {
CGSize imageSize;
CGFloat scale = 2.0;
if (UIScreen.mainScreen.bounds.size.width > 700) {
scale = 1.5;
}
CGFloat aspectRatio = asset.pixelWidth / (CGFloat)asset.pixelHeight;
CGFloat pixelWidth = photoWidth * scale;
// 超宽图片
if (aspectRatio > 1.8) {
pixelWidth = pixelWidth * aspectRatio;
}
// 超高图片
if (aspectRatio < 0.2) {
pixelWidth = pixelWidth * 0.5;
}
CGFloat pixelHeight = pixelWidth / aspectRatio;
imageSize = CGSizeMake(pixelWidth, pixelHeight);
PHImageRequestOptions *option = [[PHImageRequestOptions alloc] init];
option.resizeMode = PHImageRequestOptionsResizeModeFast;
PHImageRequestID requestID = [[PHImageManager defaultManager] requestImageForAsset:asset targetSize:imageSize contentMode:PHImageContentModeAspectFill options:option resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) {
BOOL cancelled = [[info objectForKey:PHImageCancelledKey] boolValue];
if (!cancelled && result) {
!completion ? : completion(result);
}
// Download image from iCloud / 从iCloud下载图片
if ([info objectForKey:PHImageResultIsInCloudKey] && !result) {
PHImageRequestOptions *options = [[PHImageRequestOptions alloc] init];
options.networkAccessAllowed = YES;
options.resizeMode = PHImageRequestOptionsResizeModeFast;
[[PHImageManager defaultManager] requestImageDataForAsset:asset options:options resultHandler:^(NSData *imageData, NSString *dataUTI, UIImageOrientation orientation, NSDictionary *info) {
UIImage *resultImage = [UIImage imageWithData:imageData];
!completion ? : completion(resultImage);
}];
}
}];
return requestID;
}
@end
//
// GKPhotoView.h
// GKPhotoBrowser
//
// Created by QuintGao on 2017/10/23.
// Copyright © 2017年 QuintGao. All rights reserved.
//
#import <UIKit/UIKit.h>
#import "GKPhotoManager.h"
#import "GKWebImageProtocol.h"
#import "GKLoadingView.h"
NS_ASSUME_NONNULL_BEGIN
@interface GKScrollView : UIScrollView
@end
@class GKPhotoView;
@interface GKPhotoView : UIView<UIScrollViewDelegate>
@property (nonatomic, strong, readonly) GKScrollView *scrollView;
@property (nonatomic, strong, readonly) UIImageView *imageView;
@property (nonatomic, strong, readonly) GKLoadingView *loadingView;
@property (nonatomic, strong, readonly) GKPhoto *photo;
@property (nonatomic, copy) void(^zoomEnded)(GKPhotoView *photoView, CGFloat scale);
@property (nonatomic, copy) void(^loadFailed)(GKPhotoView *photoView);
@property (nonatomic, copy) void(^loadProgressBlock)(GKPhotoView *photoView, float progress, BOOL isOriginImage);
/** 横屏时是否充满屏幕宽度,默认YES,为NO时图片自动填充屏幕 */
@property (nonatomic, assign) BOOL isFullWidthForLandScape;
/** 图片最大放大倍数 */
@property (nonatomic, assign) CGFloat maxZoomScale;
/** 双击放大倍数 */
@property (nonatomic, assign) CGFloat doubleZoomScale;
/** 是否重新布局 */
@property (nonatomic, assign) BOOL isLayoutSubViews;
@property (nonatomic, assign) GKPhotoBrowserLoadStyle loadStyle;
@property (nonatomic, assign) GKPhotoBrowserLoadStyle originLoadStyle;
@property (nonatomic, assign) GKPhotoBrowserFailStyle failStyle;
@property (nonatomic, copy) NSString *failureText;
@property (nonatomic, strong) UIImage *failureImage;
- (instancetype)initWithFrame:(CGRect)frame imageProtocol:(id<GKWebImageProtocol>)imageProtocol;
// 设置数据
- (void)setupPhoto:(GKPhoto *)photo;
// 设置放大倍数
- (void)setScrollMaxZoomScale:(CGFloat)scale;
// 加载原图(必须传originUrl)
- (void)loadOriginImage;
// 缩放
- (void)zoomToRect:(CGRect)rect animated:(BOOL)animated;
// 调整布局
- (void)adjustFrame;
// 重新布局
- (void)resetFrame;
@end
NS_ASSUME_NONNULL_END
//
// GKPhotoView.m
// GKPhotoBrowser
//
// Created by QuintGao on 2017/10/23.
// Copyright © 2017年 QuintGao. All rights reserved.
//
#import "GKPhotoView.h"
@implementation GKScrollView
#pragma mark - UIGestureRecognizerDelegate
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
if (gestureRecognizer == self.panGestureRecognizer) {
if (gestureRecognizer.state == UIGestureRecognizerStatePossible) {
if ([self isScrollViewOnTopOrBottom]) {
return NO;
}
}
}
return YES;
}
// 判断是否滑动到顶部或底部
- (BOOL)isScrollViewOnTopOrBottom {
CGPoint translation = [self.panGestureRecognizer translationInView:self];
if (translation.y > 0 && self.contentOffset.y <= 0) {
return YES;
}
CGFloat maxOffsetY = floor(self.contentSize.height - self.bounds.size.height);
if (translation.y < 0 && self.contentOffset.y >= maxOffsetY) {
return YES;
}
return NO;
}
@end
@interface GKPhotoView()
@property (nonatomic, strong, readwrite) GKScrollView *scrollView;
@property (nonatomic, strong, readwrite) UIImageView *imageView;
@property (nonatomic, strong, readwrite) GKLoadingView *loadingView;
@property (nonatomic, strong, readwrite) GKPhoto *photo;
@property (nonatomic, strong) id<GKWebImageProtocol> imageProtocol;
@property (nonatomic, assign) CGFloat realZoomScale;
@property (nonatomic, assign) PHImageRequestID requestID;
@end
@implementation GKPhotoView
- (instancetype)initWithFrame:(CGRect)frame imageProtocol:(nonnull id<GKWebImageProtocol>)imageProtocol {
if (self = [super initWithFrame:frame]) {
NSAssert(imageProtocol != nil, @"请设置图片加载类并实现GKWebImageProtocol类");
_imageProtocol = imageProtocol;
self.backgroundColor = [UIColor clearColor];
[self addSubview:self.scrollView];
[self.scrollView addSubview:self.imageView];
}
return self;
}
- (void)setupPhoto:(GKPhoto *)photo {
_photo = photo;
// 加载图片
[self loadImageWithPhoto:photo isOrigin:NO];
}
- (void)setScrollMaxZoomScale:(CGFloat)scale {
if (self.scrollView.maximumZoomScale != scale) {
self.scrollView.maximumZoomScale = scale;
}
}
- (void)loadOriginImage {
// 恢复数据
self.photo.image = nil;
self.photo.finished = NO;
self.photo.failed = NO;
[self loadImageWithPhoto:self.photo isOrigin:YES];
}
#pragma mark - 加载图片
- (void)loadImageWithPhoto:(GKPhoto *)photo isOrigin:(BOOL)isOrigin {
// 取消以前的加载
[_imageProtocol cancelImageRequestWithImageView:self.imageView];
if (photo) {
[self.imageView removeFromSuperview];
self.imageView = nil;
[self.scrollView addSubview:self.imageView];
// 每次设置数据时,恢复缩放
[self.scrollView setZoomScale:1.0 animated:NO];
// 优先加载缓存图片
UIImage *placeholderImage = nil;
UIImage *image = [_imageProtocol imageFromMemoryForURL:photo.url];
if (image) {
photo.finished = YES;
placeholderImage = image;
}
UIImage *originImage = [_imageProtocol imageFromMemoryForURL:photo.originUrl];
if (originImage) {
photo.originFinished = YES;
placeholderImage = originImage;
}
// 如果没有就加载sourceImageView的image
if (!placeholderImage) {
placeholderImage = photo.sourceImageView.image;
}
// 如果还没有就加载传入的站位图
if (!placeholderImage) {
placeholderImage = photo.placeholderImage;
}
self.imageView.image = placeholderImage;
self.imageView.contentMode = photo.sourceImageView.contentMode;
self.scrollView.scrollEnabled = NO;
if (photo.image) {
[self setupImageView:photo.image];
return;
}else if (photo.imageAsset) {
[self addSubview:self.loadingView];
if (!photo.failed) {
[self.loadingView hideFailure];
}
[self adjustFrame];
if (!photo.failed && !placeholderImage) {
if (isOrigin && self.originLoadStyle != GKPhotoBrowserLoadStyleCustom) {
[self.loadingView startLoading];
}else if (!isOrigin && self.loadStyle != GKPhotoBrowserLoadStyleCustom) {
[self.loadingView startLoading];
}
}
__weak __typeof(self) weakSelf = self;
if (self.requestID) {
[[PHImageManager defaultManager] cancelImageRequest:self.requestID];
}
PHAsset *phAsset = (PHAsset *)photo.imageAsset;
if (phAsset.mediaType == PHAssetMediaTypeImage) {
// Gif
if ([[phAsset valueForKey:@"filename"] hasSuffix:@"GIF"]) {
self.requestID = [GKPhotoManager loadImageDataWithImageAsset:phAsset completion:^(NSData * _Nullable data) {
__strong __typeof(weakSelf) self = weakSelf;
dispatch_async(dispatch_get_main_queue(), ^{
if (data) {
UIImage *image = nil;
if ([self.imageProtocol respondsToSelector:@selector(imageWithData:)]) {
image = [self.imageProtocol imageWithData:data];
}
if (!image) image = [UIImage imageWithData:data];
[self setupImageView:image];
self.requestID = 0;
}
});
}];
}else {
self.requestID = [GKPhotoManager loadImageWithAsset:photo.imageAsset photoWidth:GKScreenW * 2 completion:^(UIImage * _Nullable image) {
__strong __typeof(weakSelf) self = weakSelf;
dispatch_async(dispatch_get_main_queue(), ^{
if (image) {
[self setupImageView:image];
self.requestID = 0;
}
});
}];
}
}
return;
}
// 进度条
[self addSubview:self.loadingView];
if (!photo.failed) {
[self.loadingView hideFailure];
}
if (self.imageView.image) {
[self adjustFrame];
}else if (!CGRectEqualToRect(photo.sourceFrame, CGRectZero)) {
[self adjustFrame];
}
NSURL *url = nil;
if (photo.originFinished) {
url = photo.originUrl;
}else {
url = isOrigin ? photo.originUrl : photo.url;
}
if (url.absoluteString.length > 0) {
if (!photo.failed && !placeholderImage) {
if (isOrigin && self.originLoadStyle != GKPhotoBrowserLoadStyleCustom) {
[self.loadingView startLoading];
}else if (!isOrigin && self.loadStyle != GKPhotoBrowserLoadStyleCustom) {
[self.loadingView startLoading];
}
}
__weak __typeof(self) weakSelf = self;
GKWebImageProgressBlock progressBlock = ^(NSInteger receivedSize, NSInteger expectedSize) {
__strong __typeof(weakSelf) self = weakSelf;
if (expectedSize == 0) return;
float progress = (float)receivedSize / expectedSize;
if (progress <= 0) progress = 0;
// 图片加载中,回调进度
dispatch_async(dispatch_get_main_queue(), ^{
if (isOrigin && self.originLoadStyle == GKLoadingStyleCustom) {
!self.loadProgressBlock ? : self.loadProgressBlock(self, progress, YES);
}else if (!isOrigin && self.loadStyle == GKLoadingStyleCustom) {
!self.loadProgressBlock ? : self.loadProgressBlock(self, progress, NO);
}else if (self.loadStyle == GKLoadingStyleDeterminate || self.originLoadStyle == GKLoadingStyleDeterminate) {
self.loadingView.progress = progress;
}
});
};
GKWebImageCompletionBlock completionBlock = ^(UIImage *image, NSURL *url, BOOL finished, NSError *error) {
__strong __typeof(weakSelf) self = weakSelf;
dispatch_async(dispatch_get_main_queue(), ^{
if (error) {
photo.failed = YES;
[self.loadingView stopLoading];
if ([photo.url.absoluteString isEqualToString:url.absoluteString]) {
if (self.failStyle == GKPhotoBrowserFailStyleCustom) {
!self.loadFailed ? : self.loadFailed(self);
}else {
[self addSubview:self.loadingView];
[self.loadingView showFailure];
}
}
}else {
photo.finished = YES;
if (isOrigin) {
photo.originFinished = YES;
}
// 图片加载完成,回调进度
if (isOrigin && self.originLoadStyle == GKLoadingStyleCustom) {
!self.loadProgressBlock ? : self.loadProgressBlock(self, 1.0f, YES);
}else if (!isOrigin && self.loadStyle == GKLoadingStyleCustom) {
!self.loadProgressBlock ? : self.loadProgressBlock(self, 1.0f, NO);
}
self.scrollView.scrollEnabled = YES;
[self.loadingView stopLoading];
}
[self adjustFrame];
});
};
[_imageProtocol setImageForImageView:self.imageView url:url placeholderImage:placeholderImage progress:progressBlock completion:completionBlock];
}else {
if (self.imageView.image) {
photo.finished = YES;
self.scrollView.scrollEnabled = YES;
[self.loadingView stopLoading];
}
[self adjustFrame];
}
}else {
self.imageView.image = nil;
[self adjustFrame];
}
}
- (void)resetFrame {
self.scrollView.frame = self.bounds;
self.loadingView.frame = self.bounds;
if (self.photo) {
[self adjustFrame];
}
}
- (void)setupImageView:(UIImage *)image {
self.photo.finished = YES;
self.imageView.image = image;
self.scrollView.scrollEnabled = YES;
[self.loadingView stopLoading];
[self.loadingView hideFailure];
[self.loadingView removeFromSuperview];
[self adjustFrame];
}
#pragma mark - 调整frame
- (void)adjustFrame {
CGRect frame = self.scrollView.frame;
if (frame.size.width == 0 || frame.size.height == 0) return;
if (self.imageView.image) {
CGSize imageSize = self.imageView.image.size;
CGRect imageF = (CGRect){{0, 0}, imageSize};
// 图片的宽度 = 屏幕的宽度
CGFloat ratio = frame.size.width / imageF.size.width;
imageF.size.width = frame.size.width;
imageF.size.height = ratio * imageF.size.height;
// 默认情况下,显示出的图片的宽度 = 屏幕的宽度
// 如果kIsFullWidthForLandScape = NO,需要把图片全部显示在屏幕上
// 此时由于图片的宽度已经等于屏幕的宽度,所以只需判断图片显示的高度>屏幕高度时,将图片的高度缩小到屏幕的高度即可
if (!self.isFullWidthForLandScape) {
// 图片的高度 > 屏幕的高度
if (imageF.size.height > frame.size.height) {
CGFloat scale = imageF.size.width / imageF.size.height;
imageF.size.height = frame.size.height;
imageF.size.width = imageF.size.height * scale;
}
}
// 设置图片的frame
self.imageView.frame = imageF;
self.scrollView.contentSize = self.imageView.frame.size;
if (imageF.size.height <= self.scrollView.bounds.size.height) {
self.imageView.center = CGPointMake(self.scrollView.bounds.size.width * 0.5, self.scrollView.bounds.size.height * 0.5);
}else {
self.imageView.center = CGPointMake(self.scrollView.bounds.size.width * 0.5, imageF.size.height * 0.5);
}
// 根据图片大小找到最大缩放等级,保证最大缩放时候,不会有黑边
// 找到最大的缩放比例
CGFloat scaleH = frame.size.height / imageF.size.height;
CGFloat scaleW = frame.size.width / imageF.size.width;
self.realZoomScale = MAX(MAX(scaleH, scaleW), self.maxZoomScale);
if (self.doubleZoomScale == self.maxZoomScale) {
self.doubleZoomScale = self.realZoomScale;
}else if (self.doubleZoomScale > self.realZoomScale) {
self.doubleZoomScale = self.realZoomScale;
}
// 初始化
self.scrollView.minimumZoomScale = 1.0;
self.scrollView.maximumZoomScale = self.realZoomScale;
}else if (!CGRectEqualToRect(self.photo.sourceFrame, CGRectZero)) {
if (self.photo.sourceFrame.size.width == 0 || self.photo.sourceFrame.size.height == 0) return;
CGFloat width = frame.size.width;
CGFloat height = width * self.photo.sourceFrame.size.height / self.photo.sourceFrame.size.width;
self.imageView.bounds = CGRectMake(0, 0, width, height);
self.imageView.center = CGPointMake(frame.size.width * 0.5, frame.size.height * 0.5);
self.scrollView.contentSize = self.imageView.frame.size;
self.loadingView.bounds = self.scrollView.frame;
self.loadingView.center = CGPointMake(frame.size.width * 0.5, frame.size.height * 0.5);
}else {
self.loadingView.bounds = self.scrollView.frame;
self.loadingView.center = CGPointMake(frame.size.width * 0.5, frame.size.height * 0.5);
}
// frame调整完毕,重新设置缩放
if (self.photo.isZooming) {
self.scrollView.maximumZoomScale = 1.0f;
self.scrollView.zoomScale = 1.0f;
[self zoomToRect:self.photo.zoomRect animated:NO];
}
// 重置offset
self.scrollView.contentOffset = self.photo.offset;
}
- (CGPoint)centerOfScrollViewContent:(UIScrollView *)scrollView {
CGFloat offsetX = (scrollView.bounds.size.width > scrollView.contentSize.width) ? (scrollView.bounds.size.width - scrollView.contentSize.width) * 0.5 : 0;
CGFloat offsetY = (scrollView.bounds.size.height > scrollView.contentSize.height) ? (scrollView.bounds.size.height - scrollView.contentSize.height) * 0.5 : 0;
CGPoint actualCenter = CGPointMake(scrollView.contentSize.width * 0.5 + offsetX, scrollView.contentSize.height * 0.5 + offsetY);
return actualCenter;
}
- (void)zoomToRect:(CGRect)rect animated:(BOOL)animated {
[self.scrollView zoomToRect:rect animated:animated];
}
#pragma mark - UIScrollViewDelegate
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
// 恢复位置
if (self.photo.isZooming && scrollView.zoomScale == 1.0f) {
scrollView.contentOffset = self.photo.offset;
}
// 只在上下滑动时记录位置
if (scrollView.zoomScale == 1.0f) {
self.photo.offset = scrollView.contentOffset;
}
}
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView {
return self.imageView;
}
- (void)scrollViewDidZoom:(UIScrollView *)scrollView {
self.imageView.center = [self centerOfScrollViewContent:scrollView];
}
- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(CGFloat)scale {
!self.zoomEnded ? : self.zoomEnded(self, scrollView.zoomScale);
[self setScrollMaxZoomScale:self.realZoomScale];
}
- (void)cancelCurrentImageLoad {
[_imageProtocol cancelImageRequestWithImageView:self.imageView];
}
- (void)dealloc {
[self cancelCurrentImageLoad];
}
#pragma mark - 懒加载
- (GKScrollView *)scrollView {
if (!_scrollView) {
_scrollView = [GKScrollView new];
_scrollView.frame = CGRectMake(0, 0, GKScreenW, GKScreenH);
_scrollView.backgroundColor = [UIColor clearColor];
_scrollView.delegate = self;
_scrollView.clipsToBounds = YES;
_scrollView.multipleTouchEnabled = YES; // 多点触摸开启
_scrollView.showsVerticalScrollIndicator = NO;
_scrollView.showsHorizontalScrollIndicator = NO;
if (@available(iOS 11.0, *)) {
_scrollView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
}
}
return _scrollView;
}
- (UIImageView *)imageView {
if (!_imageView) {
_imageView = [_imageProtocol.imageViewClass new];
_imageView.clipsToBounds = YES;
}
return _imageView;
}
- (GKLoadingView *)loadingView {
if (!_loadingView) {
_loadingView = [GKLoadingView loadingViewWithFrame:self.bounds style:(GKLoadingStyle)self.loadStyle];
_loadingView.failStyle = self.failStyle;
_loadingView.lineWidth = 3;
_loadingView.radius = 12;
_loadingView.bgColor = [UIColor blackColor];
_loadingView.strokeColor = [UIColor whiteColor];
_loadingView.failText = self.failureText;
_loadingView.failImage = self.failureImage;
}
return _loadingView;
}
@end
//
// GKWebImageProtocol.h
// GKPhotoBrowser
//
// Created by QuintGao on 2017/11/14.
// Copyright © 2017年 QuintGao. All rights reserved.
//
#import "GKPhotoBrowserConfigure.h"
typedef void (^GKWebImageProgressBlock)(NSInteger receivedSize, NSInteger expectedSize);
typedef void (^GKWebImageCompletionBlock)(UIImage * _Nullable image, NSURL * _Nullable url, BOOL finished, NSError * _Nullable error);
@protocol GKWebImageProtocol<NSObject>
/// 设置imageView类
- (Class _Nonnull)imageViewClass;
/// 为imageView设置图片
/// @param imageView imageView
/// @param url 图片url
/// @param placeholderImage 缺省图片
/// @param progressBlock 加载进度
/// @param completionBlock 完成进度
- (void)setImageForImageView:(nullable UIImageView *)imageView
url:(nullable NSURL *)url
placeholderImage:(nullable UIImage *)placeholderImage
progress:(nullable GKWebImageProgressBlock)progressBlock
completion:(nullable GKWebImageCompletionBlock)completionBlock;
/// 取消imageView的图片请求
/// @param imageView imageView
- (void)cancelImageRequestWithImageView:(nullable UIImageView *)imageView;
/// 根据url从内存中获取图片
/// @param url url
- (UIImage *_Nullable)imageFromMemoryForURL:(nullable NSURL *)url;
@optional
/// 可选实现,主要用于加载相册图片资源PHAsset
/// 根据data获取image对象
/// @param data 图片数据
- (UIImage *_Nullable)imageWithData:(nullable NSData *)data;
/// 清理内存
- (void)clearMemory;
@end
//
// UIScrollView+GKPhotoBrowser.h
// GKPhotoBrowser
//
// Created by QuintGao on 2017/11/10.
// Copyright © 2017年 QuintGao. All rights reserved.
//
#import <UIKit/UIKit.h>
@interface UIScrollView (GKPhotoBrowser)
/**
* 是否启用手势处理功能,默认为NO
* 为了防止与APP中其他UIScrollview滑动的冲突,默认设置为NO,需要时设置为YES即可
*/
@property (nonatomic, assign) BOOL gk_gestureHandleEnabled;
@end
//
// UIScrollView+GKPhotoBrowser.m
// GKPhotoBrowser
//
// Created by QuintGao on 2017/11/10.
// Copyright © 2017年 QuintGao. All rights reserved.
//
#import "UIScrollView+GKPhotoBrowser.h"
#import <objc/runtime.h>
static const void* GKGestureHandleEnabled = @"GKGestureHandleEnabled";
@implementation UIScrollView (GKPhotoBrowser)
- (void)setGk_gestureHandleEnabled:(BOOL)gk_gestureHandleEnabled {
objc_setAssociatedObject(self, GKGestureHandleEnabled, @(gk_gestureHandleEnabled), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (BOOL)gk_gestureHandleEnabled {
return [objc_getAssociatedObject(self, GKGestureHandleEnabled) boolValue];
}
#pragma mark - 解决全屏滑动
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
if (!self.gk_gestureHandleEnabled) return YES;
if ([self panBack:gestureRecognizer]) return NO;
return YES;
}
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
if (!self.gk_gestureHandleEnabled) return NO;
if ([self panBack:gestureRecognizer]) return YES;
return NO;
}
- (BOOL)panBack:(UIGestureRecognizer *)gestureRecognizer {
if (gestureRecognizer == self.panGestureRecognizer) {
CGPoint point = [self.panGestureRecognizer translationInView:self];
UIGestureRecognizerState state = gestureRecognizer.state;
// 设置手势滑动的位置距屏幕左边的区域
CGFloat locationDistance = [UIScreen mainScreen].bounds.size.width;
if (state == UIGestureRecognizerStateBegan || state == UIGestureRecognizerStatePossible) {
CGPoint location = [gestureRecognizer locationInView:self];
if (point.x > 0 && location.x < locationDistance && self.contentOffset.x <= 0) {
return YES;
}
}
}
return NO;
}
@end
//
// GKYYWebImageManager.h
// GKPhotoBrowserDemo
//
// Created by gaokun on 2020/4/27.
// Copyright © 2020 QuintGao. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "GKWebImageProtocol.h"
NS_ASSUME_NONNULL_BEGIN
@interface GKYYWebImageManager : NSObject<GKWebImageProtocol>
@end
NS_ASSUME_NONNULL_END
//
// GKYYWebImageManager.m
// GKPhotoBrowserDemo
//
// Created by gaokun on 2020/4/27.
// Copyright © 2020 QuintGao. All rights reserved.
//
#import "GKYYWebImageManager.h"
#if __has_include(<YYWebImage/YYWebImage>)
#import <YYWebImage/YYWebImage.h>
#else
#import "YYWebImage.h"
#endif
@implementation GKYYWebImageManager
- (Class)imageViewClass {
return YYAnimatedImageView.class;
}
- (void)setImageForImageView:(UIImageView *)imageView url:(NSURL *)url placeholderImage:(UIImage *)placeholderImage progress:(GKWebImageProgressBlock)progressBlock completion:(GKWebImageCompletionBlock)completionBlock {
[imageView yy_setImageWithURL:url placeholder:placeholderImage options:kNilOptions progress:^(NSInteger receivedSize, NSInteger expectedSize) {
!progressBlock ? : progressBlock(receivedSize, expectedSize);
} transform:nil completion:^(UIImage * _Nullable image, NSURL * _Nonnull url, YYWebImageFromType from, YYWebImageStage stage, NSError * _Nullable error) {
BOOL success = (stage == YYWebImageStageFinished) && !error;
!completionBlock ? : completionBlock(image, url, success, error);
}];
}
- (UIImage *)imageWithData:(NSData *)data {
return [UIImage yy_imageWithSmallGIFData:data scale:UIScreen.mainScreen.scale];
}
- (void)cancelImageRequestWithImageView:(UIImageView *)imageView {
[imageView yy_cancelCurrentImageRequest];
}
- (UIImage *)imageFromMemoryForURL:(NSURL *)url {
YYWebImageManager *manager = [YYWebImageManager sharedManager];
NSString *key = [manager cacheKeyForURL:url];
return [manager.cache getImageForKey:key withType:YYImageCacheTypeAll];
}
- (void)clearMemory {
[[YYImageCache sharedCache].memoryCache removeAllObjects];
}
@end
//
// YYAnimatedImageView+Fix.h
// DreamSleep
//
// Created by peter on 2022/4/29.
//
NS_ASSUME_NONNULL_BEGIN
/// 解决iOS14 YYImage 无法正常显示图片
@interface YYAnimatedImageView (Fix)
@end
NS_ASSUME_NONNULL_END
//
// YYAnimatedImageView+Fix.m
// DreamSleep
//
// Created by peter on 2022/4/29.
//
#import "YYAnimationImageView+Fix.h"
@implementation YYAnimatedImageView (Fix)
+ (void)load {
Method a = class_getInstanceMethod(self, @selector(displayLayer:));
Method b = class_getInstanceMethod(self, @selector(swizzing_displayLayer:));
method_exchangeImplementations(a, b);
}
- (void)swizzing_displayLayer:(CALayer *)layer {
// 通过变量名称获取类中的实例成员变量
Ivar ivar = class_getInstanceVariable(self.class, "_curFrame");
UIImage *_curFrame = object_getIvar(self, ivar);
if (_curFrame) {
layer.contents = (__bridge id)_curFrame.CGImage;
} else {
if (@available(iOS 14.0, *)) {
[super displayLayer:layer];
}
}
}
@end
...@@ -35,9 +35,9 @@ static const CGFloat kLayoutImageScrollViewAnimationDuration = 0.25; ...@@ -35,9 +35,9 @@ static const CGFloat kLayoutImageScrollViewAnimationDuration = 0.25;
// K is a constant such that the accumulated error of our floating-point computations is definitely bounded by K units in the last place. // K is a constant such that the accumulated error of our floating-point computations is definitely bounded by K units in the last place.
#ifdef CGFLOAT_IS_DOUBLE #ifdef CGFLOAT_IS_DOUBLE
static const CGFloat kK = 9; static const CGFloat kK = 9;
#else #else
static const CGFloat kK = 0; static const CGFloat kK = 0;
#endif #endif
@interface RSKImageCropViewController () <UIGestureRecognizerDelegate> @interface RSKImageCropViewController () <UIGestureRecognizerDelegate>
...@@ -137,7 +137,9 @@ static const CGFloat kLayoutImageScrollViewAnimationDuration = 0.25; ...@@ -137,7 +137,9 @@ static const CGFloat kLayoutImageScrollViewAnimationDuration = 0.25;
if ([self respondsToSelector:@selector(edgesForExtendedLayout)]) { if ([self respondsToSelector:@selector(edgesForExtendedLayout)]) {
self.edgesForExtendedLayout = UIRectEdgeNone; self.edgesForExtendedLayout = UIRectEdgeNone;
self.automaticallyAdjustsScrollViewInsets = NO; if (@available(iOS 11.0, *)) {
self.imageScrollView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
}
} }
self.view.backgroundColor = [UIColor blackColor]; self.view.backgroundColor = [UIColor blackColor];
...@@ -157,12 +159,6 @@ static const CGFloat kLayoutImageScrollViewAnimationDuration = 0.25; ...@@ -157,12 +159,6 @@ static const CGFloat kLayoutImageScrollViewAnimationDuration = 0.25;
{ {
[super viewWillAppear:animated]; [super viewWillAppear:animated];
UIApplication *application = [UIApplication rsk_sharedApplication];
if (application) {
self.originalStatusBarHidden = application.statusBarHidden;
[application setStatusBarHidden:YES];
}
self.originalNavigationControllerNavigationBarHidden = self.navigationController.navigationBarHidden; self.originalNavigationControllerNavigationBarHidden = self.navigationController.navigationBarHidden;
[self.navigationController setNavigationBarHidden:YES animated:NO]; [self.navigationController setNavigationBarHidden:YES animated:NO];
...@@ -181,12 +177,7 @@ static const CGFloat kLayoutImageScrollViewAnimationDuration = 0.25; ...@@ -181,12 +177,7 @@ static const CGFloat kLayoutImageScrollViewAnimationDuration = 0.25;
- (void)viewWillDisappear:(BOOL)animated - (void)viewWillDisappear:(BOOL)animated
{ {
[super viewWillDisappear:animated]; [super viewWillDisappear:animated];
UIApplication *application = [UIApplication rsk_sharedApplication];
if (application) {
[application setStatusBarHidden:self.originalStatusBarHidden];
}
[self.navigationController setNavigationBarHidden:self.originalNavigationControllerNavigationBarHidden animated:animated]; [self.navigationController setNavigationBarHidden:self.originalNavigationControllerNavigationBarHidden animated:animated];
self.navigationController.navigationBar.shadowImage = self.originalNavigationControllerNavigationBarShadowImage; self.navigationController.navigationBar.shadowImage = self.originalNavigationControllerNavigationBarShadowImage;
self.navigationController.view.backgroundColor = self.originalNavigationControllerViewBackgroundColor; self.navigationController.view.backgroundColor = self.originalNavigationControllerViewBackgroundColor;
...@@ -561,8 +552,8 @@ static const CGFloat kLayoutImageScrollViewAnimationDuration = 0.25; ...@@ -561,8 +552,8 @@ static const CGFloat kLayoutImageScrollViewAnimationDuration = 0.25;
delay:0.0 delay:0.0
options:UIViewAnimationOptionBeginFromCurrentState options:UIViewAnimationOptionBeginFromCurrentState
animations:^{ animations:^{
[self layoutImageScrollView]; [self layoutImageScrollView];
} }
completion:nil]; completion:nil];
} }
} }
......
...@@ -188,11 +188,11 @@ static CGFloat itemMargin = 5; ...@@ -188,11 +188,11 @@ static CGFloat itemMargin = 5;
- (void)configBottomToolBar { - (void)configBottomToolBar {
TZImagePickerController *tzImagePickerVc = (TZImagePickerController *)self.navigationController; TZImagePickerController *tzImagePickerVc = (TZImagePickerController *)self.navigationController;
if (!tzImagePickerVc.showSelectBtn) return; if (!tzImagePickerVc.showSelectBtn) return;
_bottomToolBar = [[UIView alloc] initWithFrame:CGRectZero]; _bottomToolBar = [[UIView alloc] initWithFrame:CGRectZero];
CGFloat rgb = 253 / 255.0; CGFloat rgb = 253 / 255.0;
_bottomToolBar.backgroundColor = [UIColor colorWithRed:rgb green:rgb blue:rgb alpha:1.0]; _bottomToolBar.backgroundColor = [UIColor colorWithRed:rgb green:rgb blue:rgb alpha:1.0];
_previewButton = [UIButton buttonWithType:UIButtonTypeCustom]; _previewButton = [UIButton buttonWithType:UIButtonTypeCustom];
[_previewButton addTarget:self action:@selector(previewButtonClick) forControlEvents:UIControlEventTouchUpInside]; [_previewButton addTarget:self action:@selector(previewButtonClick) forControlEvents:UIControlEventTouchUpInside];
_previewButton.titleLabel.font = [UIFont systemFontOfSize:16]; _previewButton.titleLabel.font = [UIFont systemFontOfSize:16];
...@@ -266,7 +266,7 @@ static CGFloat itemMargin = 5; ...@@ -266,7 +266,7 @@ static CGFloat itemMargin = 5;
- (void)viewDidLayoutSubviews { - (void)viewDidLayoutSubviews {
[super viewDidLayoutSubviews]; [super viewDidLayoutSubviews];
TZImagePickerController *tzImagePickerVc = (TZImagePickerController *)self.navigationController; TZImagePickerController *tzImagePickerVc = (TZImagePickerController *)self.navigationController;
CGFloat top = 0; CGFloat top = 0;
...@@ -614,13 +614,13 @@ static CGFloat itemMargin = 5; ...@@ -614,13 +614,13 @@ static CGFloat itemMargin = 5;
if (!appName) appName = [infoDict valueForKey:@"CFBundleName"]; if (!appName) appName = [infoDict valueForKey:@"CFBundleName"];
NSString *message = [NSString stringWithFormat:[NSBundle tz_localizedStringForKey:@"Please allow %@ to access your camera in \"Settings -> Privacy -> Camera\""],appName]; NSString *message = [NSString stringWithFormat:[NSBundle tz_localizedStringForKey:@"Please allow %@ to access your camera in \"Settings -> Privacy -> Camera\""],appName];
if (iOS8Later) { UIAlertController *alertController = [UIAlertController alertControllerWithTitle:[NSBundle tz_localizedStringForKey:@"Can not use camera"] message:message preferredStyle:UIAlertControllerStyleAlert];
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:[NSBundle tz_localizedStringForKey:@"Can not use camera"] message:message delegate:self cancelButtonTitle:[NSBundle tz_localizedStringForKey:@"Cancel"] otherButtonTitles:[NSBundle tz_localizedStringForKey:@"Setting"], nil]; [alertController addAction:[UIAlertAction actionWithTitle:[NSBundle tz_localizedStringForKey:@"Cancel"] style:UIAlertActionStyleCancel handler:nil]];
[alert show]; [alertController addAction:[UIAlertAction actionWithTitle:[NSBundle tz_localizedStringForKey:@"Setting"] style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
} else { // 去设置界面
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:[NSBundle tz_localizedStringForKey:@"Can not use camera"] message:message delegate:self cancelButtonTitle:[NSBundle tz_localizedStringForKey:@"OK"] otherButtonTitles:nil]; [[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
[alert show]; }]];
} [self presentViewController:alertController animated:YES completion:nil];
} else if (authStatus == AVAuthorizationStatusNotDetermined) { } else if (authStatus == AVAuthorizationStatusNotDetermined) {
// fix issue 466, 防止用户首次拍照拒绝授权时相机页黑屏 // fix issue 466, 防止用户首次拍照拒绝授权时相机页黑屏
if (iOS7Later) { if (iOS7Later) {
...@@ -755,16 +755,6 @@ static CGFloat itemMargin = 5; ...@@ -755,16 +755,6 @@ static CGFloat itemMargin = 5;
} }
} }
#pragma mark - UIAlertViewDelegate
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
if (buttonIndex == 1) { // 去设置界面,开启相机访问权限
if (iOS8Later) {
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
}
}
}
#pragma mark - UIImagePickerControllerDelegate #pragma mark - UIImagePickerControllerDelegate
- (void)imagePickerController:(UIImagePickerController*)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { - (void)imagePickerController:(UIImagePickerController*)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
......
...@@ -389,7 +389,7 @@ ...@@ -389,7 +389,7 @@
CMTime currentTime = _player.currentItem.currentTime; CMTime currentTime = _player.currentItem.currentTime;
CMTime durationTime = _player.currentItem.duration; CMTime durationTime = _player.currentItem.duration;
if (_player.rate == 0.0f) { if (_player.rate == 0.0f) {
if (currentTime.value == durationTime.value) [_player.currentItem seekToTime:CMTimeMake(0, 1)]; if (currentTime.value == durationTime.value) [_player.currentItem seekToTime:CMTimeMake(0, 1) completionHandler:nil];
[_player play]; [_player play];
[_playButton setImage:nil forState:UIControlStateNormal]; [_playButton setImage:nil forState:UIControlStateNormal];
if (iOS7Later) [UIApplication sharedApplication].statusBarHidden = YES; if (iOS7Later) [UIApplication sharedApplication].statusBarHidden = YES;
......
...@@ -25,3 +25,4 @@ end ...@@ -25,3 +25,4 @@ end
# YYWebImage (1.0.5) # YYWebImage (1.0.5)
# YYImage/WebP(模拟器上目前无法运行) # YYImage/WebP(模拟器上目前无法运行)
# YYModel (1.0.4) # YYModel (1.0.4)
# SDWebImage (5.12.5)(去掉)
...@@ -78,6 +78,6 @@ SPEC CHECKSUMS: ...@@ -78,6 +78,6 @@ SPEC CHECKSUMS:
YYModel: 2a7fdd96aaa4b86a824e26d0c517de8928c04b30 YYModel: 2a7fdd96aaa4b86a824e26d0c517de8928c04b30
YYWebImage: 5f7f36aee2ae293f016d418c7d6ba05c4863e928 YYWebImage: 5f7f36aee2ae293f016d418c7d6ba05c4863e928
PODFILE CHECKSUM: b3d9e0300e1732ba6a625a3cac34c1a05fcefc19 PODFILE CHECKSUM: 5f273d0f03f58db41d7f0a6d3d96a8bd054ab744
COCOAPODS: 1.11.3 COCOAPODS: 1.11.3
...@@ -78,6 +78,6 @@ SPEC CHECKSUMS: ...@@ -78,6 +78,6 @@ SPEC CHECKSUMS:
YYModel: 2a7fdd96aaa4b86a824e26d0c517de8928c04b30 YYModel: 2a7fdd96aaa4b86a824e26d0c517de8928c04b30
YYWebImage: 5f7f36aee2ae293f016d418c7d6ba05c4863e928 YYWebImage: 5f7f36aee2ae293f016d418c7d6ba05c4863e928
PODFILE CHECKSUM: b3d9e0300e1732ba6a625a3cac34c1a05fcefc19 PODFILE CHECKSUM: 5f273d0f03f58db41d7f0a6d3d96a8bd054ab744
COCOAPODS: 1.11.3 COCOAPODS: 1.11.3
...@@ -39,11 +39,9 @@ ...@@ -39,11 +39,9 @@
161F1F9CD2FA15625ADE4A50A248B8B6 /* LOTPathAnimator.m in Sources */ = {isa = PBXBuildFile; fileRef = E7CB21D1DA3CF67799D9BBE113F1FA53 /* LOTPathAnimator.m */; }; 161F1F9CD2FA15625ADE4A50A248B8B6 /* LOTPathAnimator.m in Sources */ = {isa = PBXBuildFile; fileRef = E7CB21D1DA3CF67799D9BBE113F1FA53 /* LOTPathAnimator.m */; };
176ED908B871ED3C4D2039623BC65D26 /* LOTAnimatedSwitch.m in Sources */ = {isa = PBXBuildFile; fileRef = 39E2788E0DB9510F23F8F97E68415D8D /* LOTAnimatedSwitch.m */; }; 176ED908B871ED3C4D2039623BC65D26 /* LOTAnimatedSwitch.m in Sources */ = {isa = PBXBuildFile; fileRef = 39E2788E0DB9510F23F8F97E68415D8D /* LOTAnimatedSwitch.m */; };
17E421C98723F6517F7C7A6F053E5446 /* View+MASAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 47A72E8095E2E6A93DF67C9E297717A5 /* View+MASAdditions.m */; }; 17E421C98723F6517F7C7A6F053E5446 /* View+MASAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 47A72E8095E2E6A93DF67C9E297717A5 /* View+MASAdditions.m */; };
1825980F5F6D38366BF46D34DE0CFB30 /* MobileCoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B682D53BB90A3D53208F63D52FD40BF /* MobileCoreServices.framework */; };
183C62707FDA16E5CA6C6298499C9572 /* UIButton+Night.m in Sources */ = {isa = PBXBuildFile; fileRef = 93DE86D6A32230383C4CAB4647710FC6 /* UIButton+Night.m */; }; 183C62707FDA16E5CA6C6298499C9572 /* UIButton+Night.m in Sources */ = {isa = PBXBuildFile; fileRef = 93DE86D6A32230383C4CAB4647710FC6 /* UIButton+Night.m */; };
1910E085B7C6F606F71FFDB94F00E795 /* YTKNetworkPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = A838FFA220C26D38B4A845538FA8B1D3 /* YTKNetworkPrivate.h */; settings = {ATTRIBUTES = (Private, ); }; }; 1910E085B7C6F606F71FFDB94F00E795 /* YTKNetworkPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = A838FFA220C26D38B4A845538FA8B1D3 /* YTKNetworkPrivate.h */; settings = {ATTRIBUTES = (Private, ); }; };
1A13EBFF81CCAFA921CB77FCDB0B5D71 /* UIImageView+Night.m in Sources */ = {isa = PBXBuildFile; fileRef = 2B7FF977094708C58314F98A2EF9679D /* UIImageView+Night.m */; }; 1A13EBFF81CCAFA921CB77FCDB0B5D71 /* UIImageView+Night.m in Sources */ = {isa = PBXBuildFile; fileRef = 2B7FF977094708C58314F98A2EF9679D /* UIImageView+Night.m */; };
1A2BFA9EE4165142BD547F05261014A3 /* AssetsLibrary.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C6C61A5B90C8BE70E7475DEF5B7A8465 /* AssetsLibrary.framework */; };
1C6FFFDA05385B09348226E01791CCD2 /* MJRefreshHeader.h in Headers */ = {isa = PBXBuildFile; fileRef = 0B287BA5B52A8A5AE7C77E7B220F672F /* MJRefreshHeader.h */; settings = {ATTRIBUTES = (Public, ); }; }; 1C6FFFDA05385B09348226E01791CCD2 /* MJRefreshHeader.h in Headers */ = {isa = PBXBuildFile; fileRef = 0B287BA5B52A8A5AE7C77E7B220F672F /* MJRefreshHeader.h */; settings = {ATTRIBUTES = (Public, ); }; };
1C8712FFF45A50B4019C3F8633CB0F4B /* NSLayoutConstraint+MASDebugAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = E8EB93D19AF0FE0067E5BC2082B52D17 /* NSLayoutConstraint+MASDebugAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; 1C8712FFF45A50B4019C3F8633CB0F4B /* NSLayoutConstraint+MASDebugAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = E8EB93D19AF0FE0067E5BC2082B52D17 /* NSLayoutConstraint+MASDebugAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; };
1DBBC7EF53187AE21A076555A67C517F /* UITableView+Night.m in Sources */ = {isa = PBXBuildFile; fileRef = 722E25A01E1545043B459C8C5F1FFEAB /* UITableView+Night.m */; }; 1DBBC7EF53187AE21A076555A67C517F /* UITableView+Night.m in Sources */ = {isa = PBXBuildFile; fileRef = 722E25A01E1545043B459C8C5F1FFEAB /* UITableView+Night.m */; };
...@@ -77,7 +75,6 @@ ...@@ -77,7 +75,6 @@
2D14774BA94FB6D4D7A95BBDC6306EC1 /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C7E242A7176A8FAD45ADF1CA0A0D6904 /* AVFoundation.framework */; }; 2D14774BA94FB6D4D7A95BBDC6306EC1 /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C7E242A7176A8FAD45ADF1CA0A0D6904 /* AVFoundation.framework */; };
2F8B76B9E868DB260C4F045E232A71F0 /* LOTKeyframe.h in Headers */ = {isa = PBXBuildFile; fileRef = 41CBE134F972D795334954EE27781F68 /* LOTKeyframe.h */; settings = {ATTRIBUTES = (Project, ); }; }; 2F8B76B9E868DB260C4F045E232A71F0 /* LOTKeyframe.h in Headers */ = {isa = PBXBuildFile; fileRef = 41CBE134F972D795334954EE27781F68 /* LOTKeyframe.h */; settings = {ATTRIBUTES = (Project, ); }; };
2FADF1885E1D1AEAA0CEFF7B75D856F5 /* YTKRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = B612E3B0F038A2FBB0C97DCB1A90CEA4 /* YTKRequest.m */; }; 2FADF1885E1D1AEAA0CEFF7B75D856F5 /* YTKRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = B612E3B0F038A2FBB0C97DCB1A90CEA4 /* YTKRequest.m */; };
3155265C44D18869034ABD954C5FD6C7 /* MobileCoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B682D53BB90A3D53208F63D52FD40BF /* MobileCoreServices.framework */; };
31A97D95846A95A3CDCD89D2E10D537A /* UILabel+Night.h in Headers */ = {isa = PBXBuildFile; fileRef = 6F0A8F2E36ED68B75A8FFEDEC1719A8C /* UILabel+Night.h */; settings = {ATTRIBUTES = (Public, ); }; }; 31A97D95846A95A3CDCD89D2E10D537A /* UILabel+Night.h in Headers */ = {isa = PBXBuildFile; fileRef = 6F0A8F2E36ED68B75A8FFEDEC1719A8C /* UILabel+Night.h */; settings = {ATTRIBUTES = (Public, ); }; };
31C1A39801DB6AA0A99FFB9D378D3BF5 /* MJRefreshBackStateFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = 5C09C9F10382FED2BED13478C944D216 /* MJRefreshBackStateFooter.m */; }; 31C1A39801DB6AA0A99FFB9D378D3BF5 /* MJRefreshBackStateFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = 5C09C9F10382FED2BED13478C944D216 /* MJRefreshBackStateFooter.m */; };
32A3B90E1DA5E298CF75DC333F0797DB /* DOUMPMediaLibraryAssetLoader.h in Headers */ = {isa = PBXBuildFile; fileRef = CFBB09F4D9287D41FD9F19DD1D22FD54 /* DOUMPMediaLibraryAssetLoader.h */; settings = {ATTRIBUTES = (Public, ); }; }; 32A3B90E1DA5E298CF75DC333F0797DB /* DOUMPMediaLibraryAssetLoader.h in Headers */ = {isa = PBXBuildFile; fileRef = CFBB09F4D9287D41FD9F19DD1D22FD54 /* DOUMPMediaLibraryAssetLoader.h */; settings = {ATTRIBUTES = (Public, ); }; };
...@@ -143,7 +140,6 @@ ...@@ -143,7 +140,6 @@
51EBADC07FB48DAD032EC13144C70023 /* LOTGradientFillRender.m in Sources */ = {isa = PBXBuildFile; fileRef = F59C2F939224338707541DF4276D3E9B /* LOTGradientFillRender.m */; }; 51EBADC07FB48DAD032EC13144C70023 /* LOTGradientFillRender.m in Sources */ = {isa = PBXBuildFile; fileRef = F59C2F939224338707541DF4276D3E9B /* LOTGradientFillRender.m */; };
521A88FF099D4CA69D9DE83EF4A84C26 /* CoreAudio.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2353BF70772EB45F1844A13916544231 /* CoreAudio.framework */; }; 521A88FF099D4CA69D9DE83EF4A84C26 /* CoreAudio.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2353BF70772EB45F1844A13916544231 /* CoreAudio.framework */; };
52F9A41D250B132071D6BC693375FBF3 /* NSValue+Compat.m in Sources */ = {isa = PBXBuildFile; fileRef = 8DE17301EBA9EAC90588DAC0FCC7371F /* NSValue+Compat.m */; }; 52F9A41D250B132071D6BC693375FBF3 /* NSValue+Compat.m in Sources */ = {isa = PBXBuildFile; fileRef = 8DE17301EBA9EAC90588DAC0FCC7371F /* NSValue+Compat.m */; };
547991A1B97DE57E5ACE7E21F6BB90B5 /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3693B851CA31F58678BCF02EAAAC6FE4 /* OpenGLES.framework */; };
54C7685F8C3B3C658F0EB16F4FF86CD5 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EF718F39789BA407F1E784AA4F9E1FD6 /* Foundation.framework */; }; 54C7685F8C3B3C658F0EB16F4FF86CD5 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EF718F39789BA407F1E784AA4F9E1FD6 /* Foundation.framework */; };
55547A3F48653153E5080A227EBAAB7A /* metamacros.h in Headers */ = {isa = PBXBuildFile; fileRef = 9818AA9789A4ADE2A19FE8BAC3195EF8 /* metamacros.h */; settings = {ATTRIBUTES = (Public, ); }; }; 55547A3F48653153E5080A227EBAAB7A /* metamacros.h in Headers */ = {isa = PBXBuildFile; fileRef = 9818AA9789A4ADE2A19FE8BAC3195EF8 /* metamacros.h */; settings = {ATTRIBUTES = (Public, ); }; };
5585584E49DBB4F5756DCA62A60023B5 /* View+MASShorthandAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = AB5C1646625C0DA5883AE47B73C82CE6 /* View+MASShorthandAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; 5585584E49DBB4F5756DCA62A60023B5 /* View+MASShorthandAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = AB5C1646625C0DA5883AE47B73C82CE6 /* View+MASShorthandAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; };
...@@ -313,7 +309,6 @@ ...@@ -313,7 +309,6 @@
AC0468E701A13E3E102C83A03893F2D2 /* LOTArrayInterpolator.m in Sources */ = {isa = PBXBuildFile; fileRef = B7CD62B42117C4F35E41DB36673250BA /* LOTArrayInterpolator.m */; }; AC0468E701A13E3E102C83A03893F2D2 /* LOTArrayInterpolator.m in Sources */ = {isa = PBXBuildFile; fileRef = B7CD62B42117C4F35E41DB36673250BA /* LOTArrayInterpolator.m */; };
AC69B41D7AF525143A5DCB471A20A770 /* LOTRenderNode.m in Sources */ = {isa = PBXBuildFile; fileRef = B070F3472971B8EC1E3F11F97F57FC82 /* LOTRenderNode.m */; }; AC69B41D7AF525143A5DCB471A20A770 /* LOTRenderNode.m in Sources */ = {isa = PBXBuildFile; fileRef = B070F3472971B8EC1E3F11F97F57FC82 /* LOTRenderNode.m */; };
ACD453B314191EE2AB70B368CA8E202F /* YYModel-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = C8649B1079FABA68759D4083556505C1 /* YYModel-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; ACD453B314191EE2AB70B368CA8E202F /* YYModel-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = C8649B1079FABA68759D4083556505C1 /* YYModel-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
ACE377E54CC9C24CD4A177A2EA010E9A /* MobileCoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B682D53BB90A3D53208F63D52FD40BF /* MobileCoreServices.framework */; };
AD06579BA7C9D6EDC88A5961FCDBBE91 /* DOUAudioFrequencyAnalyzer.h in Headers */ = {isa = PBXBuildFile; fileRef = 35D5C3103A7D960CF22BB5105BA0220A /* DOUAudioFrequencyAnalyzer.h */; settings = {ATTRIBUTES = (Public, ); }; }; AD06579BA7C9D6EDC88A5961FCDBBE91 /* DOUAudioFrequencyAnalyzer.h in Headers */ = {isa = PBXBuildFile; fileRef = 35D5C3103A7D960CF22BB5105BA0220A /* DOUAudioFrequencyAnalyzer.h */; settings = {ATTRIBUTES = (Public, ); }; };
ADC62FBE73D69E96C136A490F2469E06 /* LOTShapeStroke.m in Sources */ = {isa = PBXBuildFile; fileRef = 5627DC1612ACE486A62CEC9C901F173B /* LOTShapeStroke.m */; }; ADC62FBE73D69E96C136A490F2469E06 /* LOTShapeStroke.m in Sources */ = {isa = PBXBuildFile; fileRef = 5627DC1612ACE486A62CEC9C901F173B /* LOTShapeStroke.m */; };
AE5BE2F039B4802A3950F5C7E4F0AF17 /* DOUAudioSpatialAnalyzer.h in Headers */ = {isa = PBXBuildFile; fileRef = 8A81528B4B742638DDFEC205BCF23DEC /* DOUAudioSpatialAnalyzer.h */; settings = {ATTRIBUTES = (Public, ); }; }; AE5BE2F039B4802A3950F5C7E4F0AF17 /* DOUAudioSpatialAnalyzer.h in Headers */ = {isa = PBXBuildFile; fileRef = 8A81528B4B742638DDFEC205BCF23DEC /* DOUAudioSpatialAnalyzer.h */; settings = {ATTRIBUTES = (Public, ); }; };
...@@ -444,7 +439,6 @@ ...@@ -444,7 +439,6 @@
F17D14AA419610A24C438010925D5285 /* LOTStrokeRenderer.h in Headers */ = {isa = PBXBuildFile; fileRef = 369DC4BDAA6F35D87C754D26A138D8CD /* LOTStrokeRenderer.h */; settings = {ATTRIBUTES = (Project, ); }; }; F17D14AA419610A24C438010925D5285 /* LOTStrokeRenderer.h in Headers */ = {isa = PBXBuildFile; fileRef = 369DC4BDAA6F35D87C754D26A138D8CD /* LOTStrokeRenderer.h */; settings = {ATTRIBUTES = (Project, ); }; };
F1F6BE8022B15AF502F605F354CEA770 /* LOTAnimatorNode.h in Headers */ = {isa = PBXBuildFile; fileRef = 65D1DE05A5B79FD95FEB50F371AEAADC /* LOTAnimatorNode.h */; settings = {ATTRIBUTES = (Project, ); }; }; F1F6BE8022B15AF502F605F354CEA770 /* LOTAnimatorNode.h in Headers */ = {isa = PBXBuildFile; fileRef = 65D1DE05A5B79FD95FEB50F371AEAADC /* LOTAnimatorNode.h */; settings = {ATTRIBUTES = (Project, ); }; };
F21EB1AFFEDB5DABC2CEE81C56057E00 /* LOTPolystarAnimator.h in Headers */ = {isa = PBXBuildFile; fileRef = 3A41D52E3AD3B551E46F3C6AC04CFDB7 /* LOTPolystarAnimator.h */; settings = {ATTRIBUTES = (Project, ); }; }; F21EB1AFFEDB5DABC2CEE81C56057E00 /* LOTPolystarAnimator.h in Headers */ = {isa = PBXBuildFile; fileRef = 3A41D52E3AD3B551E46F3C6AC04CFDB7 /* LOTPolystarAnimator.h */; settings = {ATTRIBUTES = (Project, ); }; };
F4066E081A9D254A3C09231741A4CCB1 /* AssetsLibrary.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C6C61A5B90C8BE70E7475DEF5B7A8465 /* AssetsLibrary.framework */; };
F409514460B49909252092F89D7815B3 /* DKColor.m in Sources */ = {isa = PBXBuildFile; fileRef = 381536CEF8ACAF852EDDA8FDC702C15B /* DKColor.m */; }; F409514460B49909252092F89D7815B3 /* DKColor.m in Sources */ = {isa = PBXBuildFile; fileRef = 381536CEF8ACAF852EDDA8FDC702C15B /* DKColor.m */; };
F4BBEA8767BE16B7CCDE554617CEC182 /* DOUAudioFrequencyAnalyzer.m in Sources */ = {isa = PBXBuildFile; fileRef = 17862B032E2DCF3014CCB1B530E62255 /* DOUAudioFrequencyAnalyzer.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; F4BBEA8767BE16B7CCDE554617CEC182 /* DOUAudioFrequencyAnalyzer.m in Sources */ = {isa = PBXBuildFile; fileRef = 17862B032E2DCF3014CCB1B530E62255 /* DOUAudioFrequencyAnalyzer.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; };
F4CF1B0F7F9E0ABE0A4400EA604811DF /* YYImage.h in Headers */ = {isa = PBXBuildFile; fileRef = E129134A44F11F30F1E823337F84CF73 /* YYImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; F4CF1B0F7F9E0ABE0A4400EA604811DF /* YYImage.h in Headers */ = {isa = PBXBuildFile; fileRef = E129134A44F11F30F1E823337F84CF73 /* YYImage.h */; settings = {ATTRIBUTES = (Public, ); }; };
...@@ -589,7 +583,7 @@ ...@@ -589,7 +583,7 @@
03814507AEDE12ECB04B1E0208F2DEA3 /* lottie-ios.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "lottie-ios.release.xcconfig"; sourceTree = "<group>"; }; 03814507AEDE12ECB04B1E0208F2DEA3 /* lottie-ios.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "lottie-ios.release.xcconfig"; sourceTree = "<group>"; };
043FD1635C4E4C52EC729EECBCA335F0 /* LOTLayer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LOTLayer.h; path = "lottie-ios/Classes/Models/LOTLayer.h"; sourceTree = "<group>"; }; 043FD1635C4E4C52EC729EECBCA335F0 /* LOTLayer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LOTLayer.h; path = "lottie-ios/Classes/Models/LOTLayer.h"; sourceTree = "<group>"; };
0494C9ED0578640DF6EAF7EBB76074D5 /* AFCompatibilityMacros.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFCompatibilityMacros.h; path = AFNetworking/AFCompatibilityMacros.h; sourceTree = "<group>"; }; 0494C9ED0578640DF6EAF7EBB76074D5 /* AFCompatibilityMacros.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFCompatibilityMacros.h; path = AFNetworking/AFCompatibilityMacros.h; sourceTree = "<group>"; };
04B380B6648264692DA26C32040918AF /* DOUAudioStreamer */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = DOUAudioStreamer; path = DOUAudioStreamer.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 04B380B6648264692DA26C32040918AF /* DOUAudioStreamer.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = DOUAudioStreamer.framework; sourceTree = BUILT_PRODUCTS_DIR; };
0535B5F6F2DDC1650D939D17588ADFA5 /* LOTAnimatedControl.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LOTAnimatedControl.h; path = "lottie-ios/Classes/PublicHeaders/LOTAnimatedControl.h"; sourceTree = "<group>"; }; 0535B5F6F2DDC1650D939D17588ADFA5 /* LOTAnimatedControl.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LOTAnimatedControl.h; path = "lottie-ios/Classes/PublicHeaders/LOTAnimatedControl.h"; sourceTree = "<group>"; };
05A5D3855A2F61AE205E03B5EE6C8DFD /* AFSecurityPolicy.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFSecurityPolicy.h; path = AFNetworking/AFSecurityPolicy.h; sourceTree = "<group>"; }; 05A5D3855A2F61AE205E03B5EE6C8DFD /* AFSecurityPolicy.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFSecurityPolicy.h; path = AFNetworking/AFSecurityPolicy.h; sourceTree = "<group>"; };
0846AB2F7181B64967FD10653B505B09 /* DOUAudioStreamer_Private.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DOUAudioStreamer_Private.h; path = src/DOUAudioStreamer_Private.h; sourceTree = "<group>"; }; 0846AB2F7181B64967FD10653B505B09 /* DOUAudioStreamer_Private.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DOUAudioStreamer_Private.h; path = src/DOUAudioStreamer_Private.h; sourceTree = "<group>"; };
...@@ -601,7 +595,7 @@ ...@@ -601,7 +595,7 @@
0AFFA0E04F05A403A07D6A753927090C /* DOUAudioStreamer.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = DOUAudioStreamer.modulemap; sourceTree = "<group>"; }; 0AFFA0E04F05A403A07D6A753927090C /* DOUAudioStreamer.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = DOUAudioStreamer.modulemap; sourceTree = "<group>"; };
0B287BA5B52A8A5AE7C77E7B220F672F /* MJRefreshHeader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshHeader.h; path = MJRefresh/Base/MJRefreshHeader.h; sourceTree = "<group>"; }; 0B287BA5B52A8A5AE7C77E7B220F672F /* MJRefreshHeader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshHeader.h; path = MJRefresh/Base/MJRefreshHeader.h; sourceTree = "<group>"; };
0BB5374DED4D78306804E076447DCE77 /* YYKVStorage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYKVStorage.m; path = YYCache/YYKVStorage.m; sourceTree = "<group>"; }; 0BB5374DED4D78306804E076447DCE77 /* YYKVStorage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYKVStorage.m; path = YYCache/YYKVStorage.m; sourceTree = "<group>"; };
0C6F4829D47D1826F47CDC4264F9F6A8 /* YYImage */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = YYImage; path = YYImage.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 0C6F4829D47D1826F47CDC4264F9F6A8 /* YYImage.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = YYImage.framework; sourceTree = BUILT_PRODUCTS_DIR; };
0CE9462BAF866965BBB4E749FB420BBF /* UIProgressView+Night.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIProgressView+Night.h"; path = "DKNightVersion/UIKit/UIProgressView+Night.h"; sourceTree = "<group>"; }; 0CE9462BAF866965BBB4E749FB420BBF /* UIProgressView+Night.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIProgressView+Night.h"; path = "DKNightVersion/UIKit/UIProgressView+Night.h"; sourceTree = "<group>"; };
0E4B2AE7CF70126B2BA691E79F55E6D3 /* AFNetworking-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "AFNetworking-umbrella.h"; sourceTree = "<group>"; }; 0E4B2AE7CF70126B2BA691E79F55E6D3 /* AFNetworking-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "AFNetworking-umbrella.h"; sourceTree = "<group>"; };
0F2848C788013E316DA8E5CC70184839 /* MJRefreshNormalHeader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshNormalHeader.h; path = MJRefresh/Custom/Header/MJRefreshNormalHeader.h; sourceTree = "<group>"; }; 0F2848C788013E316DA8E5CC70184839 /* MJRefreshNormalHeader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshNormalHeader.h; path = MJRefresh/Custom/Header/MJRefreshNormalHeader.h; sourceTree = "<group>"; };
...@@ -648,7 +642,7 @@ ...@@ -648,7 +642,7 @@
1F7CF4C2CA0361127401EF2112A78977 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; }; 1F7CF4C2CA0361127401EF2112A78977 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; };
1FAF14FB4BD15E7DB9E6ED6225DB25F7 /* LOTInterpolatorCallback.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LOTInterpolatorCallback.h; path = "lottie-ios/Classes/PublicHeaders/LOTInterpolatorCallback.h"; sourceTree = "<group>"; }; 1FAF14FB4BD15E7DB9E6ED6225DB25F7 /* LOTInterpolatorCallback.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LOTInterpolatorCallback.h; path = "lottie-ios/Classes/PublicHeaders/LOTInterpolatorCallback.h"; sourceTree = "<group>"; };
1FD923919E176629C8017856C984BC8D /* lottie-ios.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "lottie-ios.modulemap"; sourceTree = "<group>"; }; 1FD923919E176629C8017856C984BC8D /* lottie-ios.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "lottie-ios.modulemap"; sourceTree = "<group>"; };
1FFED36A657123030ABB700256D73F15 /* Masonry */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Masonry; path = Masonry.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 1FFED36A657123030ABB700256D73F15 /* Masonry.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Masonry.framework; sourceTree = BUILT_PRODUCTS_DIR; };
201387A26B943E8932B11DDF26237052 /* LOTAnimationView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = LOTAnimationView.m; path = "lottie-ios/Classes/Private/LOTAnimationView.m"; sourceTree = "<group>"; }; 201387A26B943E8932B11DDF26237052 /* LOTAnimationView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = LOTAnimationView.m; path = "lottie-ios/Classes/Private/LOTAnimationView.m"; sourceTree = "<group>"; };
20A0B7D5783FA961AD8961B2B4B49438 /* DKImage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DKImage.m; path = DKNightVersion/Core/DKImage.m; sourceTree = "<group>"; }; 20A0B7D5783FA961AD8961B2B4B49438 /* DKImage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DKImage.m; path = DKNightVersion/Core/DKImage.m; sourceTree = "<group>"; };
211A1077096C7C3E78D0314CBA403B0B /* UIColor+Expanded.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIColor+Expanded.h"; path = "lottie-ios/Classes/Extensions/UIColor+Expanded.h"; sourceTree = "<group>"; }; 211A1077096C7C3E78D0314CBA403B0B /* UIColor+Expanded.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIColor+Expanded.h"; path = "lottie-ios/Classes/Extensions/UIColor+Expanded.h"; sourceTree = "<group>"; };
...@@ -743,7 +737,7 @@ ...@@ -743,7 +737,7 @@
47DEAF9A1A69FE2DF7884770007E946F /* YYAnimatedImageView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYAnimatedImageView.h; path = YYImage/YYAnimatedImageView.h; sourceTree = "<group>"; }; 47DEAF9A1A69FE2DF7884770007E946F /* YYAnimatedImageView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYAnimatedImageView.h; path = YYImage/YYAnimatedImageView.h; sourceTree = "<group>"; };
484FBA345DE762078058968E73A931A2 /* _YYWebImageSetter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = _YYWebImageSetter.m; path = YYWebImage/Categories/_YYWebImageSetter.m; sourceTree = "<group>"; }; 484FBA345DE762078058968E73A931A2 /* _YYWebImageSetter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = _YYWebImageSetter.m; path = YYWebImage/Categories/_YYWebImageSetter.m; sourceTree = "<group>"; };
485F4F8AB2ADE2B1057D5020CC8FA5A1 /* UIColor.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = UIColor.h; path = "lottie-ios/Classes/MacCompatibility/UIColor.h"; sourceTree = "<group>"; }; 485F4F8AB2ADE2B1057D5020CC8FA5A1 /* UIColor.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = UIColor.h; path = "lottie-ios/Classes/MacCompatibility/UIColor.h"; sourceTree = "<group>"; };
48ACF38225AF5129416A1F090F6D3286 /* YYCache */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = YYCache; path = YYCache.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 48ACF38225AF5129416A1F090F6D3286 /* YYCache.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = YYCache.framework; sourceTree = BUILT_PRODUCTS_DIR; };
498EFB11D833E0318E43AB0569E6C393 /* NSArray+MASAdditions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSArray+MASAdditions.h"; path = "Masonry/NSArray+MASAdditions.h"; sourceTree = "<group>"; }; 498EFB11D833E0318E43AB0569E6C393 /* NSArray+MASAdditions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSArray+MASAdditions.h"; path = "Masonry/NSArray+MASAdditions.h"; sourceTree = "<group>"; };
4A71F3B49777FE5388D75D075E83008F /* Masonry-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Masonry-dummy.m"; sourceTree = "<group>"; }; 4A71F3B49777FE5388D75D075E83008F /* Masonry-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Masonry-dummy.m"; sourceTree = "<group>"; };
4A80BFCA5C9E23F95C4E7606689B2551 /* UIView+Night.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+Night.m"; path = "DKNightVersion/UIKit/UIView+Night.m"; sourceTree = "<group>"; }; 4A80BFCA5C9E23F95C4E7606689B2551 /* UIView+Night.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+Night.m"; path = "DKNightVersion/UIKit/UIView+Night.m"; sourceTree = "<group>"; };
...@@ -759,10 +753,10 @@ ...@@ -759,10 +753,10 @@
4DAE796534B5EE52DE9EEBBE58E954FC /* LOTShapeCircle.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = LOTShapeCircle.m; path = "lottie-ios/Classes/Models/LOTShapeCircle.m"; sourceTree = "<group>"; }; 4DAE796534B5EE52DE9EEBBE58E954FC /* LOTShapeCircle.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = LOTShapeCircle.m; path = "lottie-ios/Classes/Models/LOTShapeCircle.m"; sourceTree = "<group>"; };
4F6BC7472D2DDDF9F685F9A3216EB614 /* YYCache.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = YYCache.modulemap; sourceTree = "<group>"; }; 4F6BC7472D2DDDF9F685F9A3216EB614 /* YYCache.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = YYCache.modulemap; sourceTree = "<group>"; };
4F8D78E59F949F7C09C49C08478D3F6C /* YYCache-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "YYCache-dummy.m"; sourceTree = "<group>"; }; 4F8D78E59F949F7C09C49C08478D3F6C /* YYCache-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "YYCache-dummy.m"; sourceTree = "<group>"; };
4FC1978206616CE319648B302B05AA8A /* YYWebImage */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = YYWebImage; path = YYWebImage.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 4FC1978206616CE319648B302B05AA8A /* YYWebImage.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = YYWebImage.framework; sourceTree = BUILT_PRODUCTS_DIR; };
5190B719116A91833030FF07C429B078 /* UITextView+Keyboard.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UITextView+Keyboard.h"; path = "DKNightVersion/Manual/UITextView+Keyboard.h"; sourceTree = "<group>"; }; 5190B719116A91833030FF07C429B078 /* UITextView+Keyboard.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UITextView+Keyboard.h"; path = "DKNightVersion/Manual/UITextView+Keyboard.h"; sourceTree = "<group>"; };
519FB1E9753C54294B50FA6AFC1BCEEC /* MJRefreshBackNormalFooter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshBackNormalFooter.h; path = MJRefresh/Custom/Footer/Back/MJRefreshBackNormalFooter.h; sourceTree = "<group>"; }; 519FB1E9753C54294B50FA6AFC1BCEEC /* MJRefreshBackNormalFooter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshBackNormalFooter.h; path = MJRefresh/Custom/Footer/Back/MJRefreshBackNormalFooter.h; sourceTree = "<group>"; };
51BA97E8B5085EFFB47BC9C0B785CEA7 /* lottie-ios */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = "lottie-ios"; path = Lottie.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 51BA97E8B5085EFFB47BC9C0B785CEA7 /* Lottie.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Lottie.framework; sourceTree = BUILT_PRODUCTS_DIR; };
51BB91FA31AE5DD95B99187B98FD6C30 /* Masonry.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Masonry.release.xcconfig; sourceTree = "<group>"; }; 51BB91FA31AE5DD95B99187B98FD6C30 /* Masonry.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Masonry.release.xcconfig; sourceTree = "<group>"; };
537CFD0A3044BDD53D744369CDB59232 /* LOTKeypath.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LOTKeypath.h; path = "lottie-ios/Classes/PublicHeaders/LOTKeypath.h"; sourceTree = "<group>"; }; 537CFD0A3044BDD53D744369CDB59232 /* LOTKeypath.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LOTKeypath.h; path = "lottie-ios/Classes/PublicHeaders/LOTKeypath.h"; sourceTree = "<group>"; };
538E127FD0B61F3B1771B86D20852334 /* YTKNetwork.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YTKNetwork.h; path = YTKNetwork/YTKNetwork.h; sourceTree = "<group>"; }; 538E127FD0B61F3B1771B86D20852334 /* YTKNetwork.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YTKNetwork.h; path = YTKNetwork/YTKNetwork.h; sourceTree = "<group>"; };
...@@ -872,7 +866,7 @@ ...@@ -872,7 +866,7 @@
8A73B08867ECD7659A9FF627A852697E /* YTKNetworkAgent.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YTKNetworkAgent.h; path = YTKNetwork/YTKNetworkAgent.h; sourceTree = "<group>"; }; 8A73B08867ECD7659A9FF627A852697E /* YTKNetworkAgent.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YTKNetworkAgent.h; path = YTKNetwork/YTKNetworkAgent.h; sourceTree = "<group>"; };
8A81528B4B742638DDFEC205BCF23DEC /* DOUAudioSpatialAnalyzer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DOUAudioSpatialAnalyzer.h; path = src/DOUAudioSpatialAnalyzer.h; sourceTree = "<group>"; }; 8A81528B4B742638DDFEC205BCF23DEC /* DOUAudioSpatialAnalyzer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DOUAudioSpatialAnalyzer.h; path = src/DOUAudioSpatialAnalyzer.h; sourceTree = "<group>"; };
8B4A242E2E9F7BF79F225EA0068F24CA /* YYWebImage-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "YYWebImage-umbrella.h"; sourceTree = "<group>"; }; 8B4A242E2E9F7BF79F225EA0068F24CA /* YYWebImage-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "YYWebImage-umbrella.h"; sourceTree = "<group>"; };
8B8FAB0D627B17EDE1366984278705D9 /* MBProgressHUD */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = MBProgressHUD; path = MBProgressHUD.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 8B8FAB0D627B17EDE1366984278705D9 /* MBProgressHUD.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = MBProgressHUD.framework; sourceTree = BUILT_PRODUCTS_DIR; };
8C20F4C53FD31197D2CAEA163940C0B9 /* MJRefreshGifHeader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshGifHeader.m; path = MJRefresh/Custom/Header/MJRefreshGifHeader.m; sourceTree = "<group>"; }; 8C20F4C53FD31197D2CAEA163940C0B9 /* MJRefreshGifHeader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshGifHeader.m; path = MJRefresh/Custom/Header/MJRefreshGifHeader.m; sourceTree = "<group>"; };
8DC3FDA3172EBD4FADC5D40393EDE7AE /* YYMemoryCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYMemoryCache.m; path = YYCache/YYMemoryCache.m; sourceTree = "<group>"; }; 8DC3FDA3172EBD4FADC5D40393EDE7AE /* YYMemoryCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYMemoryCache.m; path = YYCache/YYMemoryCache.m; sourceTree = "<group>"; };
8DE17301EBA9EAC90588DAC0FCC7371F /* NSValue+Compat.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSValue+Compat.m"; path = "lottie-ios/Classes/MacCompatibility/NSValue+Compat.m"; sourceTree = "<group>"; }; 8DE17301EBA9EAC90588DAC0FCC7371F /* NSValue+Compat.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSValue+Compat.m"; path = "lottie-ios/Classes/MacCompatibility/NSValue+Compat.m"; sourceTree = "<group>"; };
...@@ -915,7 +909,7 @@ ...@@ -915,7 +909,7 @@
9BD6F0B21CDAE9FA26016DC870A83047 /* Pods-DreamSleep */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = "Pods-DreamSleep"; path = Pods_DreamSleep.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 9BD6F0B21CDAE9FA26016DC870A83047 /* Pods-DreamSleep */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = "Pods-DreamSleep"; path = Pods_DreamSleep.framework; sourceTree = BUILT_PRODUCTS_DIR; };
9C702A81B574E5A589B1307E80EB9F84 /* AFHTTPSessionManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFHTTPSessionManager.m; path = AFNetworking/AFHTTPSessionManager.m; sourceTree = "<group>"; }; 9C702A81B574E5A589B1307E80EB9F84 /* AFHTTPSessionManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFHTTPSessionManager.m; path = AFNetworking/AFHTTPSessionManager.m; sourceTree = "<group>"; };
9D764FE88345F9342FA47AB4277BEF59 /* UIBarButtonItem+Night.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIBarButtonItem+Night.h"; path = "DKNightVersion/UIKit/UIBarButtonItem+Night.h"; sourceTree = "<group>"; }; 9D764FE88345F9342FA47AB4277BEF59 /* UIBarButtonItem+Night.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIBarButtonItem+Night.h"; path = "DKNightVersion/UIKit/UIBarButtonItem+Night.h"; sourceTree = "<group>"; };
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; };
9DCC3F073E3B3F361C806DFF1EBBE86B /* LOTValueInterpolator.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = LOTValueInterpolator.m; path = "lottie-ios/Classes/RenderSystem/InterpolatorNodes/LOTValueInterpolator.m"; sourceTree = "<group>"; }; 9DCC3F073E3B3F361C806DFF1EBBE86B /* LOTValueInterpolator.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = LOTValueInterpolator.m; path = "lottie-ios/Classes/RenderSystem/InterpolatorNodes/LOTValueInterpolator.m"; sourceTree = "<group>"; };
A0DA3FDC2852A74ADAA18329E0D209E2 /* LOTPolygonAnimator.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = LOTPolygonAnimator.m; path = "lottie-ios/Classes/RenderSystem/AnimatorNodes/LOTPolygonAnimator.m"; sourceTree = "<group>"; }; A0DA3FDC2852A74ADAA18329E0D209E2 /* LOTPolygonAnimator.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = LOTPolygonAnimator.m; path = "lottie-ios/Classes/RenderSystem/AnimatorNodes/LOTPolygonAnimator.m"; sourceTree = "<group>"; };
A136910DD2A4366F47D9FADF04F1C493 /* MJRefresh-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "MJRefresh-umbrella.h"; sourceTree = "<group>"; }; A136910DD2A4366F47D9FADF04F1C493 /* MJRefresh-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "MJRefresh-umbrella.h"; sourceTree = "<group>"; };
...@@ -923,7 +917,7 @@ ...@@ -923,7 +917,7 @@
A259AC049CD8B3B7855E25B5C8BB7952 /* LOTCircleAnimator.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = LOTCircleAnimator.m; path = "lottie-ios/Classes/RenderSystem/AnimatorNodes/LOTCircleAnimator.m"; sourceTree = "<group>"; }; A259AC049CD8B3B7855E25B5C8BB7952 /* LOTCircleAnimator.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = LOTCircleAnimator.m; path = "lottie-ios/Classes/RenderSystem/AnimatorNodes/LOTCircleAnimator.m"; sourceTree = "<group>"; };
A2B7E8E44302E6D107B271FDB375FC80 /* MJRefreshConst.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshConst.h; path = MJRefresh/MJRefreshConst.h; sourceTree = "<group>"; }; A2B7E8E44302E6D107B271FDB375FC80 /* MJRefreshConst.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshConst.h; path = MJRefresh/MJRefreshConst.h; sourceTree = "<group>"; };
A2BC4AE4EA33EDF2196DA54B2F9D64A3 /* UITextField+Night.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UITextField+Night.m"; path = "DKNightVersion/UIKit/UITextField+Night.m"; sourceTree = "<group>"; }; A2BC4AE4EA33EDF2196DA54B2F9D64A3 /* UITextField+Night.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UITextField+Night.m"; path = "DKNightVersion/UIKit/UITextField+Night.m"; sourceTree = "<group>"; };
A3D4FA69013D692AC19BA0FA85C90FD7 /* DKColorTable.txt */ = {isa = PBXFileReference; includeInIndex = 1; name = DKColorTable.txt; path = DKNightVersion/ColorTable/DKColorTable.txt; sourceTree = "<group>"; }; A3D4FA69013D692AC19BA0FA85C90FD7 /* DKColorTable.txt */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = DKColorTable.txt; path = DKNightVersion/ColorTable/DKColorTable.txt; sourceTree = "<group>"; };
A42E39D9211C48F93E7590E6E2C53A90 /* CALayer+Night.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "CALayer+Night.h"; path = "DKNightVersion/CoreAnimation/CALayer+Night.h"; sourceTree = "<group>"; }; A42E39D9211C48F93E7590E6E2C53A90 /* CALayer+Night.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "CALayer+Night.h"; path = "DKNightVersion/CoreAnimation/CALayer+Night.h"; sourceTree = "<group>"; };
A4515575E48DF2ED788158BC4E1610D0 /* AFURLResponseSerialization.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFURLResponseSerialization.h; path = AFNetworking/AFURLResponseSerialization.h; sourceTree = "<group>"; }; A4515575E48DF2ED788158BC4E1610D0 /* AFURLResponseSerialization.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFURLResponseSerialization.h; path = AFNetworking/AFURLResponseSerialization.h; sourceTree = "<group>"; };
A4FA15D44DF6BAC7550EDEED10862AA3 /* AFNetworking */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = AFNetworking; path = AFNetworking.framework; sourceTree = BUILT_PRODUCTS_DIR; }; A4FA15D44DF6BAC7550EDEED10862AA3 /* AFNetworking */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = AFNetworking; path = AFNetworking.framework; sourceTree = BUILT_PRODUCTS_DIR; };
...@@ -1009,7 +1003,7 @@ ...@@ -1009,7 +1003,7 @@
D3501A32F6FD6CA263442DBA4C624E58 /* MBProgressHUD-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "MBProgressHUD-dummy.m"; sourceTree = "<group>"; }; D3501A32F6FD6CA263442DBA4C624E58 /* MBProgressHUD-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "MBProgressHUD-dummy.m"; sourceTree = "<group>"; };
D43AEE190FF841B9A9BE41E902A19164 /* YYImage.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = YYImage.debug.xcconfig; sourceTree = "<group>"; }; D43AEE190FF841B9A9BE41E902A19164 /* YYImage.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = YYImage.debug.xcconfig; sourceTree = "<group>"; };
D4919B8A28576434557E5D6BF36DCCC2 /* CAShapeLayer+Night.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "CAShapeLayer+Night.m"; path = "DKNightVersion/CoreAnimation/CAShapeLayer+Night.m"; sourceTree = "<group>"; }; D4919B8A28576434557E5D6BF36DCCC2 /* CAShapeLayer+Night.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "CAShapeLayer+Night.m"; path = "DKNightVersion/CoreAnimation/CAShapeLayer+Night.m"; sourceTree = "<group>"; };
D49390DC16189A74052FAC3455F18249 /* DKNightVersion */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = DKNightVersion; path = DKNightVersion.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D49390DC16189A74052FAC3455F18249 /* DKNightVersion.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = DKNightVersion.framework; sourceTree = BUILT_PRODUCTS_DIR; };
D5862E7602A25BA72619B360387F3448 /* LOTSizeInterpolator.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LOTSizeInterpolator.h; path = "lottie-ios/Classes/RenderSystem/InterpolatorNodes/LOTSizeInterpolator.h"; sourceTree = "<group>"; }; D5862E7602A25BA72619B360387F3448 /* LOTSizeInterpolator.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LOTSizeInterpolator.h; path = "lottie-ios/Classes/RenderSystem/InterpolatorNodes/LOTSizeInterpolator.h"; sourceTree = "<group>"; };
D66BFB05F6A5E832BBA7D86055C84FD2 /* UIView+MJExtension.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+MJExtension.h"; path = "MJRefresh/UIView+MJExtension.h"; sourceTree = "<group>"; }; D66BFB05F6A5E832BBA7D86055C84FD2 /* UIView+MJExtension.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+MJExtension.h"; path = "MJRefresh/UIView+MJExtension.h"; sourceTree = "<group>"; };
D6CF76B9EB35305F9FCD91391E95F42F /* DKNightVersionManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DKNightVersionManager.m; path = DKNightVersion/Core/DKNightVersionManager.m; sourceTree = "<group>"; }; D6CF76B9EB35305F9FCD91391E95F42F /* DKNightVersionManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DKNightVersionManager.m; path = DKNightVersion/Core/DKNightVersionManager.m; sourceTree = "<group>"; };
...@@ -1042,7 +1036,7 @@ ...@@ -1042,7 +1036,7 @@
E224D2A6BA59AAB5DA6E99FF8C21B6C0 /* LOTPointInterpolator.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LOTPointInterpolator.h; path = "lottie-ios/Classes/RenderSystem/InterpolatorNodes/LOTPointInterpolator.h"; sourceTree = "<group>"; }; E224D2A6BA59AAB5DA6E99FF8C21B6C0 /* LOTPointInterpolator.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LOTPointInterpolator.h; path = "lottie-ios/Classes/RenderSystem/InterpolatorNodes/LOTPointInterpolator.h"; sourceTree = "<group>"; };
E3753984671C298498121C110F83E202 /* LOTModels.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LOTModels.h; path = "lottie-ios/Classes/Models/LOTModels.h"; sourceTree = "<group>"; }; E3753984671C298498121C110F83E202 /* LOTModels.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LOTModels.h; path = "lottie-ios/Classes/Models/LOTModels.h"; sourceTree = "<group>"; };
E42866A695CAB218857DF4D68617A7AF /* MJRefreshBackFooter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshBackFooter.m; path = MJRefresh/Base/MJRefreshBackFooter.m; sourceTree = "<group>"; }; E42866A695CAB218857DF4D68617A7AF /* MJRefreshBackFooter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshBackFooter.m; path = MJRefresh/Base/MJRefreshBackFooter.m; sourceTree = "<group>"; };
E460D5B0416D36F66EE8EC89E5D2FA0A /* YYModel */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = YYModel; path = YYModel.framework; sourceTree = BUILT_PRODUCTS_DIR; }; E460D5B0416D36F66EE8EC89E5D2FA0A /* YYModel.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = YYModel.framework; sourceTree = BUILT_PRODUCTS_DIR; };
E49D6D248DD1CEE584E6776B9164A1B2 /* MJRefresh */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = MJRefresh; path = MJRefresh.framework; sourceTree = BUILT_PRODUCTS_DIR; }; E49D6D248DD1CEE584E6776B9164A1B2 /* MJRefresh */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = MJRefresh; path = MJRefresh.framework; sourceTree = BUILT_PRODUCTS_DIR; };
E5523ECF66B84F2AB486B7D33749BECD /* UIImage+YYWebImage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+YYWebImage.m"; path = "YYWebImage/Categories/UIImage+YYWebImage.m"; sourceTree = "<group>"; }; E5523ECF66B84F2AB486B7D33749BECD /* UIImage+YYWebImage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+YYWebImage.m"; path = "YYWebImage/Categories/UIImage+YYWebImage.m"; sourceTree = "<group>"; };
E63E41D7270D17FCCAA86496EE719A02 /* _YYWebImageSetter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = _YYWebImageSetter.h; path = YYWebImage/Categories/_YYWebImageSetter.h; sourceTree = "<group>"; }; E63E41D7270D17FCCAA86496EE719A02 /* _YYWebImageSetter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = _YYWebImageSetter.h; path = YYWebImage/Categories/_YYWebImageSetter.h; sourceTree = "<group>"; };
...@@ -1099,11 +1093,9 @@ ...@@ -1099,11 +1093,9 @@
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
745FDDCAB183FDA1FC7DEC6B253557D2 /* Accelerate.framework in Frameworks */, 745FDDCAB183FDA1FC7DEC6B253557D2 /* Accelerate.framework in Frameworks */,
F4066E081A9D254A3C09231741A4CCB1 /* AssetsLibrary.framework in Frameworks */,
147A6F497CA3A08A2CB95DD403ECF3C9 /* CoreFoundation.framework in Frameworks */, 147A6F497CA3A08A2CB95DD403ECF3C9 /* CoreFoundation.framework in Frameworks */,
D79A2944A3722F5A0006C9236C049318 /* Foundation.framework in Frameworks */, D79A2944A3722F5A0006C9236C049318 /* Foundation.framework in Frameworks */,
B945B654DA40EB1A0286EF3425A4570E /* ImageIO.framework in Frameworks */, B945B654DA40EB1A0286EF3425A4570E /* ImageIO.framework in Frameworks */,
1825980F5F6D38366BF46D34DE0CFB30 /* MobileCoreServices.framework in Frameworks */,
397C8BE594BFBD9F5CABA7082C42D0E9 /* QuartzCore.framework in Frameworks */, 397C8BE594BFBD9F5CABA7082C42D0E9 /* QuartzCore.framework in Frameworks */,
EECEEF1DE45C096AEB2B2AC35618DFEA /* UIKit.framework in Frameworks */, EECEEF1DE45C096AEB2B2AC35618DFEA /* UIKit.framework in Frameworks */,
); );
...@@ -1120,8 +1112,6 @@ ...@@ -1120,8 +1112,6 @@
521A88FF099D4CA69D9DE83EF4A84C26 /* CoreAudio.framework in Frameworks */, 521A88FF099D4CA69D9DE83EF4A84C26 /* CoreAudio.framework in Frameworks */,
65C99C6E6854AB021B943AC55A8CE75D /* Foundation.framework in Frameworks */, 65C99C6E6854AB021B943AC55A8CE75D /* Foundation.framework in Frameworks */,
5A6C6AB5E6AB9ACD1E8451F69E7B72E8 /* MediaPlayer.framework in Frameworks */, 5A6C6AB5E6AB9ACD1E8451F69E7B72E8 /* MediaPlayer.framework in Frameworks */,
ACE377E54CC9C24CD4A177A2EA010E9A /* MobileCoreServices.framework in Frameworks */,
547991A1B97DE57E5ACE7E21F6BB90B5 /* OpenGLES.framework in Frameworks */,
E9D9E958B857E0A177ED449F2FA6E87C /* QuartzCore.framework in Frameworks */, E9D9E958B857E0A177ED449F2FA6E87C /* QuartzCore.framework in Frameworks */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
...@@ -1148,11 +1138,9 @@ ...@@ -1148,11 +1138,9 @@
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
5B9C7840048492835B15639B09D6104F /* Accelerate.framework in Frameworks */, 5B9C7840048492835B15639B09D6104F /* Accelerate.framework in Frameworks */,
1A2BFA9EE4165142BD547F05261014A3 /* AssetsLibrary.framework in Frameworks */,
CD94D30B507E3220A9D3655FF71125BE /* CoreFoundation.framework in Frameworks */, CD94D30B507E3220A9D3655FF71125BE /* CoreFoundation.framework in Frameworks */,
494F8AAD31C97DED3F4B963A382B3FC4 /* Foundation.framework in Frameworks */, 494F8AAD31C97DED3F4B963A382B3FC4 /* Foundation.framework in Frameworks */,
7362E1C2C02B9A33A3871F4128793ACA /* ImageIO.framework in Frameworks */, 7362E1C2C02B9A33A3871F4128793ACA /* ImageIO.framework in Frameworks */,
3155265C44D18869034ABD954C5FD6C7 /* MobileCoreServices.framework in Frameworks */,
68A93E0AAA02A501963AA4AF3493C590 /* QuartzCore.framework in Frameworks */, 68A93E0AAA02A501963AA4AF3493C590 /* QuartzCore.framework in Frameworks */,
E73DE37DBC86ABA40A510C97EEA48765 /* UIKit.framework in Frameworks */, E73DE37DBC86ABA40A510C97EEA48765 /* UIKit.framework in Frameworks */,
); );
...@@ -1253,7 +1241,6 @@ ...@@ -1253,7 +1241,6 @@
9E032F135F4EE577059033CDEED14BA4 /* Serialization */, 9E032F135F4EE577059033CDEED14BA4 /* Serialization */,
C9BA8B274494C3E75E9183FC73C987AF /* Support Files */, C9BA8B274494C3E75E9183FC73C987AF /* Support Files */,
); );
name = AFNetworking;
path = AFNetworking; path = AFNetworking;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
...@@ -1359,7 +1346,6 @@ ...@@ -1359,7 +1346,6 @@
7039DF2332997E5F4935F6C8247C60B4 /* NSData+DOUAudioMappedFile.m */, 7039DF2332997E5F4935F6C8247C60B4 /* NSData+DOUAudioMappedFile.m */,
8A6F8A5CD93D78CF5C3E4797A0537DC8 /* Support Files */, 8A6F8A5CD93D78CF5C3E4797A0537DC8 /* Support Files */,
); );
name = DOUAudioStreamer;
path = DOUAudioStreamer; path = DOUAudioStreamer;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
...@@ -1512,7 +1498,6 @@ ...@@ -1512,7 +1498,6 @@
6F4EB2D3E2E56200DAE2E7D516103523 /* UIColor+Expanded.m */, 6F4EB2D3E2E56200DAE2E7D516103523 /* UIColor+Expanded.m */,
51F0757C0764918B024FF74828D69606 /* Support Files */, 51F0757C0764918B024FF74828D69606 /* Support Files */,
); );
name = "lottie-ios";
path = "lottie-ios"; path = "lottie-ios";
sourceTree = "<group>"; sourceTree = "<group>";
}; };
...@@ -1618,7 +1603,6 @@ ...@@ -1618,7 +1603,6 @@
4B00CD358300A02DED361FD20E404D2B /* Support Files */, 4B00CD358300A02DED361FD20E404D2B /* Support Files */,
14B9E5D278F40390674E29FBE63BF8B9 /* UIKit */, 14B9E5D278F40390674E29FBE63BF8B9 /* UIKit */,
); );
name = DKNightVersion;
path = DKNightVersion; path = DKNightVersion;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
...@@ -1629,7 +1613,6 @@ ...@@ -1629,7 +1613,6 @@
33599F8858C3CE6C17E1574FD8AF73E6 /* MBProgressHUD.m */, 33599F8858C3CE6C17E1574FD8AF73E6 /* MBProgressHUD.m */,
C6BB0B9316458333FD8CA83744D530A6 /* Support Files */, C6BB0B9316458333FD8CA83744D530A6 /* Support Files */,
); );
name = MBProgressHUD;
path = MBProgressHUD; path = MBProgressHUD;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
...@@ -1659,7 +1642,6 @@ ...@@ -1659,7 +1642,6 @@
5515FC048B54B90E0C67DC948BF45F69 /* Support Files */, 5515FC048B54B90E0C67DC948BF45F69 /* Support Files */,
C500DA13F15FAD4EF86F08744FC0DD19 /* WebP */, C500DA13F15FAD4EF86F08744FC0DD19 /* WebP */,
); );
name = YYImage;
path = YYImage; path = YYImage;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
...@@ -1673,7 +1655,6 @@ ...@@ -1673,7 +1655,6 @@
CF24236E038E81761AB05567FC5E38E2 /* YYModel.h */, CF24236E038E81761AB05567FC5E38E2 /* YYModel.h */,
3EEDF330336109985506730CA2D464AD /* Support Files */, 3EEDF330336109985506730CA2D464AD /* Support Files */,
); );
name = YYModel;
path = YYModel; path = YYModel;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
...@@ -1747,7 +1728,6 @@ ...@@ -1747,7 +1728,6 @@
01400A68C54DAD764C4E6C68528797DD /* ViewController+MASAdditions.m */, 01400A68C54DAD764C4E6C68528797DD /* ViewController+MASAdditions.m */,
BF57E6BEC427EC75B0E7993F3F4B210F /* Support Files */, BF57E6BEC427EC75B0E7993F3F4B210F /* Support Files */,
); );
name = Masonry;
path = Masonry; path = Masonry;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
...@@ -1775,7 +1755,6 @@ ...@@ -1775,7 +1755,6 @@
17EA9F761AFFE2848A80FB18ABA96BDF /* YYWebImageOperation.m */, 17EA9F761AFFE2848A80FB18ABA96BDF /* YYWebImageOperation.m */,
1D5391B8118891AF14E6DCE6E44885BF /* Support Files */, 1D5391B8118891AF14E6DCE6E44885BF /* Support Files */,
); );
name = YYWebImage;
path = YYWebImage; path = YYWebImage;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
...@@ -1809,7 +1788,6 @@ ...@@ -1809,7 +1788,6 @@
8DC3FDA3172EBD4FADC5D40393EDE7AE /* YYMemoryCache.m */, 8DC3FDA3172EBD4FADC5D40393EDE7AE /* YYMemoryCache.m */,
90F6A2886192E42EC881FF9A9C4B90D9 /* Support Files */, 90F6A2886192E42EC881FF9A9C4B90D9 /* Support Files */,
); );
name = YYCache;
path = YYCache; path = YYCache;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
...@@ -1868,7 +1846,6 @@ ...@@ -1868,7 +1846,6 @@
7A343EB9C1BC314B16D4BCCABFE538A0 /* Resources */, 7A343EB9C1BC314B16D4BCCABFE538A0 /* Resources */,
4BEB21FC41A730699F64522673139BA4 /* Support Files */, 4BEB21FC41A730699F64522673139BA4 /* Support Files */,
); );
name = MJRefresh;
path = MJRefresh; path = MJRefresh;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
...@@ -1900,18 +1877,18 @@ ...@@ -1900,18 +1877,18 @@
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
A4FA15D44DF6BAC7550EDEED10862AA3 /* AFNetworking */, A4FA15D44DF6BAC7550EDEED10862AA3 /* AFNetworking */,
D49390DC16189A74052FAC3455F18249 /* DKNightVersion */, D49390DC16189A74052FAC3455F18249 /* DKNightVersion.framework */,
04B380B6648264692DA26C32040918AF /* DOUAudioStreamer */, 04B380B6648264692DA26C32040918AF /* DOUAudioStreamer.framework */,
51BA97E8B5085EFFB47BC9C0B785CEA7 /* lottie-ios */, 51BA97E8B5085EFFB47BC9C0B785CEA7 /* Lottie.framework */,
1FFED36A657123030ABB700256D73F15 /* Masonry */, 1FFED36A657123030ABB700256D73F15 /* Masonry.framework */,
8B8FAB0D627B17EDE1366984278705D9 /* MBProgressHUD */, 8B8FAB0D627B17EDE1366984278705D9 /* MBProgressHUD.framework */,
E49D6D248DD1CEE584E6776B9164A1B2 /* MJRefresh */, E49D6D248DD1CEE584E6776B9164A1B2 /* MJRefresh */,
9BD6F0B21CDAE9FA26016DC870A83047 /* Pods-DreamSleep */, 9BD6F0B21CDAE9FA26016DC870A83047 /* Pods-DreamSleep */,
601EEA66C9A6080A11C1ADE5E2A91AE1 /* YTKNetwork */, 601EEA66C9A6080A11C1ADE5E2A91AE1 /* YTKNetwork */,
48ACF38225AF5129416A1F090F6D3286 /* YYCache */, 48ACF38225AF5129416A1F090F6D3286 /* YYCache.framework */,
0C6F4829D47D1826F47CDC4264F9F6A8 /* YYImage */, 0C6F4829D47D1826F47CDC4264F9F6A8 /* YYImage.framework */,
E460D5B0416D36F66EE8EC89E5D2FA0A /* YYModel */, E460D5B0416D36F66EE8EC89E5D2FA0A /* YYModel.framework */,
4FC1978206616CE319648B302B05AA8A /* YYWebImage */, 4FC1978206616CE319648B302B05AA8A /* YYWebImage.framework */,
); );
name = Products; name = Products;
sourceTree = "<group>"; sourceTree = "<group>";
...@@ -1969,7 +1946,6 @@ ...@@ -1969,7 +1946,6 @@
4CA243760AD75922B7C1C120B76BB492 /* YTKRequestEventAccessory.m */, 4CA243760AD75922B7C1C120B76BB492 /* YTKRequestEventAccessory.m */,
E98938C41AB4B1CE8EDCA831E3C036D9 /* Support Files */, E98938C41AB4B1CE8EDCA831E3C036D9 /* Support Files */,
); );
name = YTKNetwork;
path = YTKNetwork; path = YTKNetwork;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
...@@ -2478,7 +2454,7 @@ ...@@ -2478,7 +2454,7 @@
); );
name = "lottie-ios"; name = "lottie-ios";
productName = Lottie; productName = Lottie;
productReference = 51BA97E8B5085EFFB47BC9C0B785CEA7 /* lottie-ios */; productReference = 51BA97E8B5085EFFB47BC9C0B785CEA7 /* Lottie.framework */;
productType = "com.apple.product-type.framework"; productType = "com.apple.product-type.framework";
}; };
488E8C830C5A5694EE916251B9ADAADA /* YYWebImage */ = { 488E8C830C5A5694EE916251B9ADAADA /* YYWebImage */ = {
...@@ -2498,7 +2474,7 @@ ...@@ -2498,7 +2474,7 @@
); );
name = YYWebImage; name = YYWebImage;
productName = YYWebImage; productName = YYWebImage;
productReference = 4FC1978206616CE319648B302B05AA8A /* YYWebImage */; productReference = 4FC1978206616CE319648B302B05AA8A /* YYWebImage.framework */;
productType = "com.apple.product-type.framework"; productType = "com.apple.product-type.framework";
}; };
55AF53E6C77A10ED4985E04D74A8878E /* Masonry */ = { 55AF53E6C77A10ED4985E04D74A8878E /* Masonry */ = {
...@@ -2516,7 +2492,7 @@ ...@@ -2516,7 +2492,7 @@
); );
name = Masonry; name = Masonry;
productName = Masonry; productName = Masonry;
productReference = 1FFED36A657123030ABB700256D73F15 /* Masonry */; productReference = 1FFED36A657123030ABB700256D73F15 /* Masonry.framework */;
productType = "com.apple.product-type.framework"; productType = "com.apple.product-type.framework";
}; };
5B27019314D6E0AFC98D212A7729D0CD /* Pods-DreamSleep */ = { 5B27019314D6E0AFC98D212A7729D0CD /* Pods-DreamSleep */ = {
...@@ -2564,7 +2540,7 @@ ...@@ -2564,7 +2540,7 @@
); );
name = DOUAudioStreamer; name = DOUAudioStreamer;
productName = DOUAudioStreamer; productName = DOUAudioStreamer;
productReference = 04B380B6648264692DA26C32040918AF /* DOUAudioStreamer */; productReference = 04B380B6648264692DA26C32040918AF /* DOUAudioStreamer.framework */;
productType = "com.apple.product-type.framework"; productType = "com.apple.product-type.framework";
}; };
6868056D761E163D10FDAF8CF1C4D9B8 /* MJRefresh */ = { 6868056D761E163D10FDAF8CF1C4D9B8 /* MJRefresh */ = {
...@@ -2600,7 +2576,7 @@ ...@@ -2600,7 +2576,7 @@
); );
name = YYImage; name = YYImage;
productName = YYImage; productName = YYImage;
productReference = 0C6F4829D47D1826F47CDC4264F9F6A8 /* YYImage */; productReference = 0C6F4829D47D1826F47CDC4264F9F6A8 /* YYImage.framework */;
productType = "com.apple.product-type.framework"; productType = "com.apple.product-type.framework";
}; };
82B0A41D3031FF27D78E17B0A9A46FB0 /* MBProgressHUD */ = { 82B0A41D3031FF27D78E17B0A9A46FB0 /* MBProgressHUD */ = {
...@@ -2618,7 +2594,7 @@ ...@@ -2618,7 +2594,7 @@
); );
name = MBProgressHUD; name = MBProgressHUD;
productName = MBProgressHUD; productName = MBProgressHUD;
productReference = 8B8FAB0D627B17EDE1366984278705D9 /* MBProgressHUD */; productReference = 8B8FAB0D627B17EDE1366984278705D9 /* MBProgressHUD.framework */;
productType = "com.apple.product-type.framework"; productType = "com.apple.product-type.framework";
}; };
84B44807A12996D487A4A591A481D6A0 /* YYModel */ = { 84B44807A12996D487A4A591A481D6A0 /* YYModel */ = {
...@@ -2636,7 +2612,7 @@ ...@@ -2636,7 +2612,7 @@
); );
name = YYModel; name = YYModel;
productName = YYModel; productName = YYModel;
productReference = E460D5B0416D36F66EE8EC89E5D2FA0A /* YYModel */; productReference = E460D5B0416D36F66EE8EC89E5D2FA0A /* YYModel.framework */;
productType = "com.apple.product-type.framework"; productType = "com.apple.product-type.framework";
}; };
A10D306FBCE61B6A00F5D9E74036D1E9 /* DKNightVersion */ = { A10D306FBCE61B6A00F5D9E74036D1E9 /* DKNightVersion */ = {
...@@ -2654,7 +2630,7 @@ ...@@ -2654,7 +2630,7 @@
); );
name = DKNightVersion; name = DKNightVersion;
productName = DKNightVersion; productName = DKNightVersion;
productReference = D49390DC16189A74052FAC3455F18249 /* DKNightVersion */; productReference = D49390DC16189A74052FAC3455F18249 /* DKNightVersion.framework */;
productType = "com.apple.product-type.framework"; productType = "com.apple.product-type.framework";
}; };
AC51EA5BE1682F8277BE5F13677E147C /* YTKNetwork */ = { AC51EA5BE1682F8277BE5F13677E147C /* YTKNetwork */ = {
...@@ -2691,7 +2667,7 @@ ...@@ -2691,7 +2667,7 @@
); );
name = YYCache; name = YYCache;
productName = YYCache; productName = YYCache;
productReference = 48ACF38225AF5129416A1F090F6D3286 /* YYCache */; productReference = 48ACF38225AF5129416A1F090F6D3286 /* YYCache.framework */;
productType = "com.apple.product-type.framework"; productType = "com.apple.product-type.framework";
}; };
/* End PBXNativeTarget section */ /* End PBXNativeTarget section */
...@@ -2701,7 +2677,7 @@ ...@@ -2701,7 +2677,7 @@
isa = PBXProject; isa = PBXProject;
attributes = { attributes = {
LastSwiftUpdateCheck = 1240; LastSwiftUpdateCheck = 1240;
LastUpgradeCheck = 1240; LastUpgradeCheck = 1330;
}; };
buildConfigurationList = 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */; buildConfigurationList = 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */;
compatibilityVersion = "Xcode 13.0"; compatibilityVersion = "Xcode 13.0";
...@@ -3260,7 +3236,7 @@ ...@@ -3260,7 +3236,7 @@
GCC_PREFIX_HEADER = "Target Support Files/Masonry/Masonry-prefix.pch"; GCC_PREFIX_HEADER = "Target Support Files/Masonry/Masonry-prefix.pch";
INFOPLIST_FILE = "Target Support Files/Masonry/Masonry-Info.plist"; INFOPLIST_FILE = "Target Support Files/Masonry/Masonry-Info.plist";
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
IPHONEOS_DEPLOYMENT_TARGET = 8.0; IPHONEOS_DEPLOYMENT_TARGET = 9.0;
LD_RUNPATH_SEARCH_PATHS = ( LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
...@@ -3294,7 +3270,7 @@ ...@@ -3294,7 +3270,7 @@
GCC_PREFIX_HEADER = "Target Support Files/YYModel/YYModel-prefix.pch"; GCC_PREFIX_HEADER = "Target Support Files/YYModel/YYModel-prefix.pch";
INFOPLIST_FILE = "Target Support Files/YYModel/YYModel-Info.plist"; INFOPLIST_FILE = "Target Support Files/YYModel/YYModel-Info.plist";
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
IPHONEOS_DEPLOYMENT_TARGET = 8.0; IPHONEOS_DEPLOYMENT_TARGET = 9.0;
LD_RUNPATH_SEARCH_PATHS = ( LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
...@@ -3361,7 +3337,7 @@ ...@@ -3361,7 +3337,7 @@
GCC_PREFIX_HEADER = "Target Support Files/DKNightVersion/DKNightVersion-prefix.pch"; GCC_PREFIX_HEADER = "Target Support Files/DKNightVersion/DKNightVersion-prefix.pch";
INFOPLIST_FILE = "Target Support Files/DKNightVersion/DKNightVersion-Info.plist"; INFOPLIST_FILE = "Target Support Files/DKNightVersion/DKNightVersion-Info.plist";
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
IPHONEOS_DEPLOYMENT_TARGET = 8.0; IPHONEOS_DEPLOYMENT_TARGET = 9.0;
LD_RUNPATH_SEARCH_PATHS = ( LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
...@@ -3395,7 +3371,7 @@ ...@@ -3395,7 +3371,7 @@
GCC_PREFIX_HEADER = "Target Support Files/YYModel/YYModel-prefix.pch"; GCC_PREFIX_HEADER = "Target Support Files/YYModel/YYModel-prefix.pch";
INFOPLIST_FILE = "Target Support Files/YYModel/YYModel-Info.plist"; INFOPLIST_FILE = "Target Support Files/YYModel/YYModel-Info.plist";
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
IPHONEOS_DEPLOYMENT_TARGET = 8.0; IPHONEOS_DEPLOYMENT_TARGET = 9.0;
LD_RUNPATH_SEARCH_PATHS = ( LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
...@@ -3466,7 +3442,7 @@ ...@@ -3466,7 +3442,7 @@
GCC_PREFIX_HEADER = "Target Support Files/YYImage/YYImage-prefix.pch"; GCC_PREFIX_HEADER = "Target Support Files/YYImage/YYImage-prefix.pch";
INFOPLIST_FILE = "Target Support Files/YYImage/YYImage-Info.plist"; INFOPLIST_FILE = "Target Support Files/YYImage/YYImage-Info.plist";
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
IPHONEOS_DEPLOYMENT_TARGET = 8.0; IPHONEOS_DEPLOYMENT_TARGET = 9.0;
LD_RUNPATH_SEARCH_PATHS = ( LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
...@@ -3499,7 +3475,7 @@ ...@@ -3499,7 +3475,7 @@
GCC_PREFIX_HEADER = "Target Support Files/DKNightVersion/DKNightVersion-prefix.pch"; GCC_PREFIX_HEADER = "Target Support Files/DKNightVersion/DKNightVersion-prefix.pch";
INFOPLIST_FILE = "Target Support Files/DKNightVersion/DKNightVersion-Info.plist"; INFOPLIST_FILE = "Target Support Files/DKNightVersion/DKNightVersion-Info.plist";
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
IPHONEOS_DEPLOYMENT_TARGET = 8.0; IPHONEOS_DEPLOYMENT_TARGET = 9.0;
LD_RUNPATH_SEARCH_PATHS = ( LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
...@@ -3533,7 +3509,7 @@ ...@@ -3533,7 +3509,7 @@
GCC_PREFIX_HEADER = "Target Support Files/lottie-ios/lottie-ios-prefix.pch"; GCC_PREFIX_HEADER = "Target Support Files/lottie-ios/lottie-ios-prefix.pch";
INFOPLIST_FILE = "Target Support Files/lottie-ios/lottie-ios-Info.plist"; INFOPLIST_FILE = "Target Support Files/lottie-ios/lottie-ios-Info.plist";
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
IPHONEOS_DEPLOYMENT_TARGET = 8.0; IPHONEOS_DEPLOYMENT_TARGET = 9.0;
LD_RUNPATH_SEARCH_PATHS = ( LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
...@@ -3567,7 +3543,7 @@ ...@@ -3567,7 +3543,7 @@
GCC_PREFIX_HEADER = "Target Support Files/lottie-ios/lottie-ios-prefix.pch"; GCC_PREFIX_HEADER = "Target Support Files/lottie-ios/lottie-ios-prefix.pch";
INFOPLIST_FILE = "Target Support Files/lottie-ios/lottie-ios-Info.plist"; INFOPLIST_FILE = "Target Support Files/lottie-ios/lottie-ios-Info.plist";
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
IPHONEOS_DEPLOYMENT_TARGET = 8.0; IPHONEOS_DEPLOYMENT_TARGET = 9.0;
LD_RUNPATH_SEARCH_PATHS = ( LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
...@@ -3600,7 +3576,7 @@ ...@@ -3600,7 +3576,7 @@
GCC_PREFIX_HEADER = "Target Support Files/MBProgressHUD/MBProgressHUD-prefix.pch"; GCC_PREFIX_HEADER = "Target Support Files/MBProgressHUD/MBProgressHUD-prefix.pch";
INFOPLIST_FILE = "Target Support Files/MBProgressHUD/MBProgressHUD-Info.plist"; INFOPLIST_FILE = "Target Support Files/MBProgressHUD/MBProgressHUD-Info.plist";
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
IPHONEOS_DEPLOYMENT_TARGET = 8.0; IPHONEOS_DEPLOYMENT_TARGET = 9.0;
LD_RUNPATH_SEARCH_PATHS = ( LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
...@@ -3634,7 +3610,7 @@ ...@@ -3634,7 +3610,7 @@
GCC_PREFIX_HEADER = "Target Support Files/YYCache/YYCache-prefix.pch"; GCC_PREFIX_HEADER = "Target Support Files/YYCache/YYCache-prefix.pch";
INFOPLIST_FILE = "Target Support Files/YYCache/YYCache-Info.plist"; INFOPLIST_FILE = "Target Support Files/YYCache/YYCache-Info.plist";
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
IPHONEOS_DEPLOYMENT_TARGET = 8.0; IPHONEOS_DEPLOYMENT_TARGET = 9.0;
LD_RUNPATH_SEARCH_PATHS = ( LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
...@@ -3668,7 +3644,7 @@ ...@@ -3668,7 +3644,7 @@
GCC_PREFIX_HEADER = "Target Support Files/DOUAudioStreamer/DOUAudioStreamer-prefix.pch"; GCC_PREFIX_HEADER = "Target Support Files/DOUAudioStreamer/DOUAudioStreamer-prefix.pch";
INFOPLIST_FILE = "Target Support Files/DOUAudioStreamer/DOUAudioStreamer-Info.plist"; INFOPLIST_FILE = "Target Support Files/DOUAudioStreamer/DOUAudioStreamer-Info.plist";
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
IPHONEOS_DEPLOYMENT_TARGET = 8.0; IPHONEOS_DEPLOYMENT_TARGET = 9.0;
LD_RUNPATH_SEARCH_PATHS = ( LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
...@@ -3735,7 +3711,7 @@ ...@@ -3735,7 +3711,7 @@
GCC_PREFIX_HEADER = "Target Support Files/DKNightVersion/DKNightVersion-prefix.pch"; GCC_PREFIX_HEADER = "Target Support Files/DKNightVersion/DKNightVersion-prefix.pch";
INFOPLIST_FILE = "Target Support Files/DKNightVersion/DKNightVersion-Info.plist"; INFOPLIST_FILE = "Target Support Files/DKNightVersion/DKNightVersion-Info.plist";
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
IPHONEOS_DEPLOYMENT_TARGET = 8.0; IPHONEOS_DEPLOYMENT_TARGET = 9.0;
LD_RUNPATH_SEARCH_PATHS = ( LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
...@@ -3768,7 +3744,7 @@ ...@@ -3768,7 +3744,7 @@
GCC_PREFIX_HEADER = "Target Support Files/YYCache/YYCache-prefix.pch"; GCC_PREFIX_HEADER = "Target Support Files/YYCache/YYCache-prefix.pch";
INFOPLIST_FILE = "Target Support Files/YYCache/YYCache-Info.plist"; INFOPLIST_FILE = "Target Support Files/YYCache/YYCache-Info.plist";
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
IPHONEOS_DEPLOYMENT_TARGET = 8.0; IPHONEOS_DEPLOYMENT_TARGET = 9.0;
LD_RUNPATH_SEARCH_PATHS = ( LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
...@@ -3836,7 +3812,7 @@ ...@@ -3836,7 +3812,7 @@
GCC_PREFIX_HEADER = "Target Support Files/YYWebImage/YYWebImage-prefix.pch"; GCC_PREFIX_HEADER = "Target Support Files/YYWebImage/YYWebImage-prefix.pch";
INFOPLIST_FILE = "Target Support Files/YYWebImage/YYWebImage-Info.plist"; INFOPLIST_FILE = "Target Support Files/YYWebImage/YYWebImage-Info.plist";
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
IPHONEOS_DEPLOYMENT_TARGET = 8.0; IPHONEOS_DEPLOYMENT_TARGET = 9.0;
LD_RUNPATH_SEARCH_PATHS = ( LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
...@@ -3907,7 +3883,7 @@ ...@@ -3907,7 +3883,7 @@
GCC_PREFIX_HEADER = "Target Support Files/DOUAudioStreamer/DOUAudioStreamer-prefix.pch"; GCC_PREFIX_HEADER = "Target Support Files/DOUAudioStreamer/DOUAudioStreamer-prefix.pch";
INFOPLIST_FILE = "Target Support Files/DOUAudioStreamer/DOUAudioStreamer-Info.plist"; INFOPLIST_FILE = "Target Support Files/DOUAudioStreamer/DOUAudioStreamer-Info.plist";
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
IPHONEOS_DEPLOYMENT_TARGET = 8.0; IPHONEOS_DEPLOYMENT_TARGET = 9.0;
LD_RUNPATH_SEARCH_PATHS = ( LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
...@@ -3941,7 +3917,7 @@ ...@@ -3941,7 +3917,7 @@
GCC_PREFIX_HEADER = "Target Support Files/YYWebImage/YYWebImage-prefix.pch"; GCC_PREFIX_HEADER = "Target Support Files/YYWebImage/YYWebImage-prefix.pch";
INFOPLIST_FILE = "Target Support Files/YYWebImage/YYWebImage-Info.plist"; INFOPLIST_FILE = "Target Support Files/YYWebImage/YYWebImage-Info.plist";
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
IPHONEOS_DEPLOYMENT_TARGET = 8.0; IPHONEOS_DEPLOYMENT_TARGET = 9.0;
LD_RUNPATH_SEARCH_PATHS = ( LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
...@@ -3975,7 +3951,7 @@ ...@@ -3975,7 +3951,7 @@
GCC_PREFIX_HEADER = "Target Support Files/lottie-ios/lottie-ios-prefix.pch"; GCC_PREFIX_HEADER = "Target Support Files/lottie-ios/lottie-ios-prefix.pch";
INFOPLIST_FILE = "Target Support Files/lottie-ios/lottie-ios-Info.plist"; INFOPLIST_FILE = "Target Support Files/lottie-ios/lottie-ios-Info.plist";
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
IPHONEOS_DEPLOYMENT_TARGET = 8.0; IPHONEOS_DEPLOYMENT_TARGET = 9.0;
LD_RUNPATH_SEARCH_PATHS = ( LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
...@@ -4009,7 +3985,7 @@ ...@@ -4009,7 +3985,7 @@
GCC_PREFIX_HEADER = "Target Support Files/YYModel/YYModel-prefix.pch"; GCC_PREFIX_HEADER = "Target Support Files/YYModel/YYModel-prefix.pch";
INFOPLIST_FILE = "Target Support Files/YYModel/YYModel-Info.plist"; INFOPLIST_FILE = "Target Support Files/YYModel/YYModel-Info.plist";
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
IPHONEOS_DEPLOYMENT_TARGET = 8.0; IPHONEOS_DEPLOYMENT_TARGET = 9.0;
LD_RUNPATH_SEARCH_PATHS = ( LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
...@@ -4042,7 +4018,7 @@ ...@@ -4042,7 +4018,7 @@
GCC_PREFIX_HEADER = "Target Support Files/YYWebImage/YYWebImage-prefix.pch"; GCC_PREFIX_HEADER = "Target Support Files/YYWebImage/YYWebImage-prefix.pch";
INFOPLIST_FILE = "Target Support Files/YYWebImage/YYWebImage-Info.plist"; INFOPLIST_FILE = "Target Support Files/YYWebImage/YYWebImage-Info.plist";
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
IPHONEOS_DEPLOYMENT_TARGET = 8.0; IPHONEOS_DEPLOYMENT_TARGET = 9.0;
LD_RUNPATH_SEARCH_PATHS = ( LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
...@@ -4110,7 +4086,7 @@ ...@@ -4110,7 +4086,7 @@
GCC_PREFIX_HEADER = "Target Support Files/YYImage/YYImage-prefix.pch"; GCC_PREFIX_HEADER = "Target Support Files/YYImage/YYImage-prefix.pch";
INFOPLIST_FILE = "Target Support Files/YYImage/YYImage-Info.plist"; INFOPLIST_FILE = "Target Support Files/YYImage/YYImage-Info.plist";
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
IPHONEOS_DEPLOYMENT_TARGET = 8.0; IPHONEOS_DEPLOYMENT_TARGET = 9.0;
LD_RUNPATH_SEARCH_PATHS = ( LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
...@@ -4340,7 +4316,7 @@ ...@@ -4340,7 +4316,7 @@
GCC_PREFIX_HEADER = "Target Support Files/MBProgressHUD/MBProgressHUD-prefix.pch"; GCC_PREFIX_HEADER = "Target Support Files/MBProgressHUD/MBProgressHUD-prefix.pch";
INFOPLIST_FILE = "Target Support Files/MBProgressHUD/MBProgressHUD-Info.plist"; INFOPLIST_FILE = "Target Support Files/MBProgressHUD/MBProgressHUD-Info.plist";
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
IPHONEOS_DEPLOYMENT_TARGET = 8.0; IPHONEOS_DEPLOYMENT_TARGET = 9.0;
LD_RUNPATH_SEARCH_PATHS = ( LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
...@@ -4374,7 +4350,7 @@ ...@@ -4374,7 +4350,7 @@
GCC_PREFIX_HEADER = "Target Support Files/YYCache/YYCache-prefix.pch"; GCC_PREFIX_HEADER = "Target Support Files/YYCache/YYCache-prefix.pch";
INFOPLIST_FILE = "Target Support Files/YYCache/YYCache-Info.plist"; INFOPLIST_FILE = "Target Support Files/YYCache/YYCache-Info.plist";
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
IPHONEOS_DEPLOYMENT_TARGET = 8.0; IPHONEOS_DEPLOYMENT_TARGET = 9.0;
LD_RUNPATH_SEARCH_PATHS = ( LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
...@@ -4407,7 +4383,7 @@ ...@@ -4407,7 +4383,7 @@
GCC_PREFIX_HEADER = "Target Support Files/MBProgressHUD/MBProgressHUD-prefix.pch"; GCC_PREFIX_HEADER = "Target Support Files/MBProgressHUD/MBProgressHUD-prefix.pch";
INFOPLIST_FILE = "Target Support Files/MBProgressHUD/MBProgressHUD-Info.plist"; INFOPLIST_FILE = "Target Support Files/MBProgressHUD/MBProgressHUD-Info.plist";
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
IPHONEOS_DEPLOYMENT_TARGET = 8.0; IPHONEOS_DEPLOYMENT_TARGET = 9.0;
LD_RUNPATH_SEARCH_PATHS = ( LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
...@@ -4507,7 +4483,7 @@ ...@@ -4507,7 +4483,7 @@
GCC_PREFIX_HEADER = "Target Support Files/Masonry/Masonry-prefix.pch"; GCC_PREFIX_HEADER = "Target Support Files/Masonry/Masonry-prefix.pch";
INFOPLIST_FILE = "Target Support Files/Masonry/Masonry-Info.plist"; INFOPLIST_FILE = "Target Support Files/Masonry/Masonry-Info.plist";
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
IPHONEOS_DEPLOYMENT_TARGET = 8.0; IPHONEOS_DEPLOYMENT_TARGET = 9.0;
LD_RUNPATH_SEARCH_PATHS = ( LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
...@@ -4541,7 +4517,7 @@ ...@@ -4541,7 +4517,7 @@
GCC_PREFIX_HEADER = "Target Support Files/DOUAudioStreamer/DOUAudioStreamer-prefix.pch"; GCC_PREFIX_HEADER = "Target Support Files/DOUAudioStreamer/DOUAudioStreamer-prefix.pch";
INFOPLIST_FILE = "Target Support Files/DOUAudioStreamer/DOUAudioStreamer-Info.plist"; INFOPLIST_FILE = "Target Support Files/DOUAudioStreamer/DOUAudioStreamer-Info.plist";
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
IPHONEOS_DEPLOYMENT_TARGET = 8.0; IPHONEOS_DEPLOYMENT_TARGET = 9.0;
LD_RUNPATH_SEARCH_PATHS = ( LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
...@@ -4674,7 +4650,7 @@ ...@@ -4674,7 +4650,7 @@
GCC_PREFIX_HEADER = "Target Support Files/YYImage/YYImage-prefix.pch"; GCC_PREFIX_HEADER = "Target Support Files/YYImage/YYImage-prefix.pch";
INFOPLIST_FILE = "Target Support Files/YYImage/YYImage-Info.plist"; INFOPLIST_FILE = "Target Support Files/YYImage/YYImage-Info.plist";
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
IPHONEOS_DEPLOYMENT_TARGET = 8.0; IPHONEOS_DEPLOYMENT_TARGET = 9.0;
LD_RUNPATH_SEARCH_PATHS = ( LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
...@@ -4708,7 +4684,7 @@ ...@@ -4708,7 +4684,7 @@
GCC_PREFIX_HEADER = "Target Support Files/Masonry/Masonry-prefix.pch"; GCC_PREFIX_HEADER = "Target Support Files/Masonry/Masonry-prefix.pch";
INFOPLIST_FILE = "Target Support Files/Masonry/Masonry-Info.plist"; INFOPLIST_FILE = "Target Support Files/Masonry/Masonry-Info.plist";
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
IPHONEOS_DEPLOYMENT_TARGET = 8.0; IPHONEOS_DEPLOYMENT_TARGET = 9.0;
LD_RUNPATH_SEARCH_PATHS = ( LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!