├── .gitignore ├── EHenTaiViewer.xcodeproj ├── project.pbxproj └── project.xcworkspace │ └── contents.xcworkspacedata ├── EHenTaiViewer.xcworkspace ├── contents.xcworkspacedata └── xcshareddata │ └── IDEWorkspaceChecks.plist ├── EHenTaiViewer ├── AppDelegate.h ├── AppDelegate.m ├── Assets.xcassets │ ├── AppIcon.appiconset │ │ ├── App Store-1024.png │ │ ├── CarPlay-60@2x.png │ │ ├── CarPlay-60@3x.png │ │ ├── Contents.json │ │ ├── iPad App-76.png │ │ ├── iPad App-76@2x.png │ │ ├── iPad Notifications-20.png │ │ ├── iPad Notifications-20@2x.png │ │ ├── iPad Pro App-83.5@2x.png │ │ ├── iPad Settings-29.png │ │ ├── iPad Settings-29@2x.png │ │ ├── iPad Spotlight-40.png │ │ ├── iPad Spotlight-40@2x.png │ │ ├── iPhone Notification-20@2x.png │ │ ├── iPhone Notification-20@3x.png │ │ ├── iPhone Settings-29@2x.png │ │ ├── iPhone Settings-29@3x.png │ │ ├── iPhone Spotlight-40@2x.png │ │ └── iPhone Spotlight-40@3x.png │ ├── Bookmark │ │ ├── Contents.json │ │ ├── bookmark_all.imageset │ │ │ ├── Contents.json │ │ │ └── bookmark_all.png │ │ └── bookmark_collect.imageset │ │ │ ├── Contents.json │ │ │ └── bookmark_collect.png │ ├── Contents.json │ ├── Info │ │ ├── Contents.json │ │ └── ic_share.imageset │ │ │ ├── Contents.json │ │ │ ├── ic_share@2x.png │ │ │ └── ic_share@3x.png │ ├── Setting │ │ ├── Contents.json │ │ ├── checkbox.imageset │ │ │ ├── Contents.json │ │ │ ├── checkbox@2x.png │ │ │ └── checkbox@3x.png │ │ └── checkbox_unchecked.imageset │ │ │ ├── Contents.json │ │ │ ├── checkbox_unchecked@2x.png │ │ │ └── checkbox_unchecked@3x.png │ ├── Star │ │ ├── Contents.json │ │ ├── star_gray.imageset │ │ │ ├── Contents.json │ │ │ └── b27_icon_star_gray@2x.png │ │ └── star_yellow.imageset │ │ │ ├── Contents.json │ │ │ └── b27_icon_star_yellow@2x.png │ ├── TabBar │ │ ├── Contents.json │ │ ├── ic_favorite.imageset │ │ │ ├── Contents.json │ │ │ ├── ic_favorite@2x.png │ │ │ └── ic_favorite@3x.png │ │ ├── ic_favorite_border.imageset │ │ │ ├── Contents.json │ │ │ ├── ic_favorite_border@2x.png │ │ │ └── ic_favorite_border@3x.png │ │ ├── ic_format_list_bulleted.imageset │ │ │ ├── Contents.json │ │ │ ├── ic_format_list_bulleted@2x.png │ │ │ └── ic_format_list_bulleted@3x.png │ │ ├── ic_notifications.imageset │ │ │ ├── Contents.json │ │ │ ├── ic_notifications@2x.png │ │ │ └── ic_notifications@3x.png │ │ ├── ic_settings.imageset │ │ │ ├── Contents.json │ │ │ ├── ic_settings@2x.png │ │ │ └── ic_settings@3x.png │ │ └── ic_whatshot.imageset │ │ │ ├── Contents.json │ │ │ ├── ic_whatshot@2x.png │ │ │ └── ic_whatshot@3x.png │ ├── arrow_right.imageset │ │ ├── Contents.json │ │ └── arrow_right.png │ ├── home_logo.imageset │ │ ├── Contents.json │ │ └── home_logo.png │ ├── mutSelect.imageset │ │ ├── Contents.json │ │ ├── mutSelect.png │ │ ├── mutSelect@2x.png │ │ └── mutSelect@3x.png │ ├── sift.imageset │ │ ├── Contents.json │ │ └── sift.png │ ├── thumb.imageset │ │ ├── Contents.json │ │ └── thumb.jpg │ ├── toplist.imageset │ │ ├── Contents.json │ │ ├── toplist.png │ │ ├── toplist@2x.png │ │ └── toplist@3x.png │ ├── touchid.imageset │ │ ├── Contents.json │ │ └── touchid.png │ └── unlike.imageset │ │ ├── Contents.json │ │ └── collect@2x.png ├── Base.lproj │ ├── LaunchScreen.storyboard │ └── Main.storyboard ├── EhTag_CN.json ├── Gallery+CoreDataClass.h ├── Gallery+CoreDataClass.m ├── Gallery+CoreDataProperties.h ├── Gallery+CoreDataProperties.m ├── GalleryPage+CoreDataClass.h ├── GalleryPage+CoreDataClass.m ├── GalleryPage+CoreDataProperties.h ├── GalleryPage+CoreDataProperties.m ├── Info.plist ├── NJKWebViewProgress.h ├── NJKWebViewProgress.m ├── NJKWebViewProgressView.h ├── NJKWebViewProgressView.m ├── NSString+StringHeight.h ├── NSString+StringHeight.m ├── PrefixHeader.pch ├── QJAddMytagsSearchController.h ├── QJAddMytagsSearchController.m ├── QJAllCommentController.h ├── QJAllCommentController.m ├── QJBigImageItem.h ├── QJBigImageItem.m ├── QJBrowerCollectManager.h ├── QJBrowerCollectManager.m ├── QJBrowerSettingPopView.h ├── QJBrowerSettingPopView.m ├── QJBrowerSettingPopView.xib ├── QJBrowserBookMarkPopView.h ├── QJBrowserBookMarkPopView.m ├── QJBrowserBookMarkPopView.xib ├── QJBrowserBookMarkPopViewCell.h ├── QJBrowserBookMarkPopViewCell.m ├── QJBrowserBookMarkPopViewCell.xib ├── QJButton.h ├── QJButton.m ├── QJCollectionViewFlowLayout.h ├── QJCollectionViewFlowLayout.m ├── QJColorPickBoard.h ├── QJColorPickBoard.m ├── QJColorPickProtocol.h ├── QJColorPickShowView.h ├── QJColorPickShowView.m ├── QJColorPickSlider.h ├── QJColorPickSlider.m ├── QJColorPickUtils.h ├── QJColorPickUtils.m ├── QJCommentCell.h ├── QJCommentCell.m ├── QJCommentCell.xib ├── QJContentSplitViewController.h ├── QJContentSplitViewController.m ├── QJCustomTabbarSettingController.h ├── QJCustomTabbarSettingController.m ├── QJFavoritesSelectCell.h ├── QJFavoritesSelectCell.m ├── QJFavoritesSelectCell.xib ├── QJFavoritesSelectController.h ├── QJFavoritesSelectController.m ├── QJFavouriteViewController.h ├── QJFavouriteViewController.m ├── QJFavouriteViewController.xib ├── QJGalleryItem.h ├── QJGalleryItem.m ├── QJGlobalInfo.h ├── QJGlobalInfo.m ├── QJGoCommentController.h ├── QJGoCommentController.m ├── QJGoCommentController.xib ├── QJHeadFreshingView.h ├── QJHeadFreshingView.m ├── QJHenTaiParser.h ├── QJHenTaiParser.m ├── QJHomeViewController.h ├── QJHomeViewController.m ├── QJHotAndLikeViewController.h ├── QJHotAndLikeViewController.m ├── QJImageCollectionViewCell.h ├── QJImageCollectionViewCell.m ├── QJImageCollectionViewCell.xib ├── QJLabel.h ├── QJLabel.m ├── QJLanguageOutCell.h ├── QJLanguageOutCell.m ├── QJLanguageOutCell.xib ├── QJLanguageOutHeadView.h ├── QJLanguageOutHeadView.m ├── QJLanguageOutHeadView.xib ├── QJLanguageOutViewController.h ├── QJLanguageOutViewController.m ├── QJLikeButton.h ├── QJLikeButton.m ├── QJLikeSearchBar.h ├── QJLikeSearchBar.m ├── QJLikeSearchBar.xib ├── QJListCell.h ├── QJListCell.m ├── QJListCell.xib ├── QJListItem.h ├── QJListItem.m ├── QJListTableView.h ├── QJListTableView.m ├── QJLoginViewController.h ├── QJLoginViewController.m ├── QJLoginViewController.xib ├── QJMainSettingListCell.h ├── QJMainSettingListCell.m ├── QJMainSettingListCell.xib ├── QJMainSplitViewController.h ├── QJMainSplitViewController.m ├── QJMangaImageDownloader.h ├── QJMangaImageDownloader.m ├── QJMangaImageModel.h ├── QJMangaImageModel.m ├── QJMangaImageParser.h ├── QJMangaImageParser.m ├── QJMangaManager.h ├── QJMangaManager.m ├── QJMangaTorrentActivity.h ├── QJMangaTorrentActivity.m ├── QJNetworkTool.h ├── QJNetworkTool.m ├── QJNewBrowerImageCell.h ├── QJNewBrowerImageCell.m ├── QJNewBrowerImageCell.xib ├── QJNewBrowerViewController.h ├── QJNewBrowerViewController.m ├── QJNewBrowerViewController.xib ├── QJNewCommentCell.h ├── QJNewCommentCell.m ├── QJNewCommentCell.xib ├── QJNewInfoViewController.h ├── QJNewInfoViewController.m ├── QJNewInfoViewController.xib ├── QJNewSearchViewController.h ├── QJNewSearchViewController.m ├── QJNowViewController.h ├── QJNowViewController.m ├── QJOrientationManager.h ├── QJOrientationManager.m ├── QJPasteManager.h ├── QJPasteManager.m ├── QJProtectTool.h ├── QJProtectTool.m ├── QJRankingHeadInfoCell.h ├── QJRankingHeadInfoCell.m ├── QJRankingHeadInfoCell.xib ├── QJRankingInfoCell.h ├── QJRankingInfoCell.m ├── QJRankingInfoCell.xib ├── QJRankingUploadCell.h ├── QJRankingUploadCell.m ├── QJRankingUploadCell.xib ├── QJRankingViewController.h ├── QJRankingViewController.m ├── QJRankingViewController.xib ├── QJScrollView.h ├── QJScrollView.m ├── QJSearchBar.h ├── QJSearchBar.m ├── QJSearchBar.xib ├── QJSearchClassifyCell.h ├── QJSearchClassifyCell.m ├── QJSearchClassifyCell.xib ├── QJSearchController.h ├── QJSearchController.m ├── QJSearchSettingSubViewController.h ├── QJSearchSettingSubViewController.m ├── QJSearchSettingTagSearchViewController.h ├── QJSearchSettingTagSearchViewController.m ├── QJSearchSettingViewController.h ├── QJSearchSettingViewController.m ├── QJSearchSiftHeadView.h ├── QJSearchSiftHeadView.m ├── QJSearchSoreCell.h ├── QJSearchSoreCell.m ├── QJSearchSoreCell.xib ├── QJSearchViewController.h ├── QJSearchViewController.m ├── QJSecretBgTool.h ├── QJSecretBgTool.m ├── QJSettingHightOtherController.h ├── QJSettingHightOtherController.m ├── QJSettingInfo.xib ├── QJSettingItem.h ├── QJSettingItem.m ├── QJSettingListCell.h ├── QJSettingListCell.m ├── QJSettingListCell.xib ├── QJSettingLoginCell.h ├── QJSettingLoginCell.m ├── QJSettingLoginCell.xib ├── QJSettingModel.h ├── QJSettingModel.m ├── QJSettingModel.plist ├── QJSettingMyTagsCell.h ├── QJSettingMyTagsCell.m ├── QJSettingMyTagsCell.xib ├── QJSettingMyTagsController.h ├── QJSettingMyTagsController.m ├── QJSettingMytagsEditController.h ├── QJSettingMytagsEditController.m ├── QJSettingMytagsEditController.xib ├── QJSettingViewController.h ├── QJSettingViewController.m ├── QJSettingWatchSettingController.h ├── QJSettingWatchSettingController.m ├── QJTabBarController.h ├── QJTabBarController.m ├── QJTableViewCell.h ├── QJTableViewCell.m ├── QJTagModel.h ├── QJTagModel.m ├── QJTagView.h ├── QJTagView.m ├── QJTipViewController.h ├── QJTipViewController.m ├── QJToast.h ├── QJToast.m ├── QJTool.h ├── QJTool.m ├── QJToplistUploaderItem.h ├── QJToplistUploaderItem.m ├── QJTorrentInfoCell.h ├── QJTorrentInfoCell.m ├── QJTorrentInfoCell.xib ├── QJTorrentInfoController.h ├── QJTorrentInfoController.m ├── QJTorrentItem.h ├── QJTorrentItem.m ├── QJTouchIDViewController.h ├── QJTouchIDViewController.m ├── QJTouchIDViewController.xib ├── QJViewController.h ├── QJViewController.m ├── QJWatchedViewController.h ├── QJWatchedViewController.m ├── QJWebViewController.h ├── QJWebViewController.m ├── QJWebViewController.xib ├── Reachability.h ├── Reachability.m ├── TBCityIconFont.h ├── TBCityIconFont.m ├── TBCityIconInfo.h ├── TBCityIconInfo.m ├── TFHpple.h ├── TFHpple.m ├── TFHppleElement.h ├── TFHppleElement.m ├── Tag+CoreDataClass.h ├── Tag+CoreDataClass.m ├── Tag+CoreDataProperties.h ├── Tag+CoreDataProperties.m ├── UIDevice+QJDevice.h ├── UIDevice+QJDevice.m ├── UIImage+TBCityIconFont.h ├── UIImage+TBCityIconFont.m ├── UITableViewCell+QJAddition.h ├── UITableViewCell+QJAddition.m ├── UITextView+Addition.h ├── UITextView+Addition.m ├── UIView+Layer.h ├── UIView+Layer.m ├── XHStarRateView │ ├── XHStarRateView.h │ └── XHStarRateView.m ├── XPathQuery.h ├── XPathQuery.m ├── iconfont.ttf ├── launch.png ├── loading.gif └── main.m ├── EhCoreData.xcdatamodeld └── EhCoreData.xcdatamodel │ └── contents ├── LICENSE ├── Podfile ├── Podfile.lock ├── Pods ├── MagicalRecord │ ├── LICENSE │ ├── MagicalRecord │ │ ├── Categories │ │ │ ├── DataImport │ │ │ │ ├── MagicalImportFunctions.h │ │ │ │ ├── MagicalImportFunctions.m │ │ │ │ ├── NSAttributeDescription+MagicalDataImport.h │ │ │ │ ├── NSAttributeDescription+MagicalDataImport.m │ │ │ │ ├── NSEntityDescription+MagicalDataImport.h │ │ │ │ ├── NSEntityDescription+MagicalDataImport.m │ │ │ │ ├── NSNumber+MagicalDataImport.h │ │ │ │ ├── NSNumber+MagicalDataImport.m │ │ │ │ ├── NSObject+MagicalDataImport.h │ │ │ │ ├── NSObject+MagicalDataImport.m │ │ │ │ ├── NSRelationshipDescription+MagicalDataImport.h │ │ │ │ ├── NSRelationshipDescription+MagicalDataImport.m │ │ │ │ ├── NSString+MagicalDataImport.h │ │ │ │ └── NSString+MagicalDataImport.m │ │ │ ├── NSManagedObject │ │ │ │ ├── NSManagedObject+MagicalAggregation.h │ │ │ │ ├── NSManagedObject+MagicalAggregation.m │ │ │ │ ├── NSManagedObject+MagicalDataImport.h │ │ │ │ ├── NSManagedObject+MagicalDataImport.m │ │ │ │ ├── NSManagedObject+MagicalFinders.h │ │ │ │ ├── NSManagedObject+MagicalFinders.m │ │ │ │ ├── NSManagedObject+MagicalRecord.h │ │ │ │ ├── NSManagedObject+MagicalRecord.m │ │ │ │ ├── NSManagedObject+MagicalRequests.h │ │ │ │ └── NSManagedObject+MagicalRequests.m │ │ │ ├── NSManagedObjectContext │ │ │ │ ├── NSManagedObjectContext+MagicalChainSave.h │ │ │ │ ├── NSManagedObjectContext+MagicalChainSave.m │ │ │ │ ├── NSManagedObjectContext+MagicalObserving.h │ │ │ │ ├── NSManagedObjectContext+MagicalObserving.m │ │ │ │ ├── NSManagedObjectContext+MagicalRecord.h │ │ │ │ ├── NSManagedObjectContext+MagicalRecord.m │ │ │ │ ├── NSManagedObjectContext+MagicalSaves.h │ │ │ │ ├── NSManagedObjectContext+MagicalSaves.m │ │ │ │ ├── NSManagedObjectContext+MagicalThreading.h │ │ │ │ └── NSManagedObjectContext+MagicalThreading.m │ │ │ ├── NSManagedObjectModel+MagicalRecord.h │ │ │ ├── NSManagedObjectModel+MagicalRecord.m │ │ │ ├── NSPersistentStore+MagicalRecord.h │ │ │ ├── NSPersistentStore+MagicalRecord.m │ │ │ ├── NSPersistentStoreCoordinator+MagicalRecord.h │ │ │ └── NSPersistentStoreCoordinator+MagicalRecord.m │ │ ├── Core │ │ │ ├── MagicalRecord+Actions.h │ │ │ ├── MagicalRecord+Actions.m │ │ │ ├── MagicalRecord+ErrorHandling.h │ │ │ ├── MagicalRecord+ErrorHandling.m │ │ │ ├── MagicalRecord+Options.h │ │ │ ├── MagicalRecord+Options.m │ │ │ ├── MagicalRecord+Setup.h │ │ │ ├── MagicalRecord+Setup.m │ │ │ ├── MagicalRecord+ShorthandMethods.h │ │ │ ├── MagicalRecord+ShorthandMethods.m │ │ │ ├── MagicalRecord+iCloud.h │ │ │ ├── MagicalRecord+iCloud.m │ │ │ ├── MagicalRecordDeprecationMacros.h │ │ │ ├── MagicalRecordInternal.h │ │ │ ├── MagicalRecordInternal.m │ │ │ ├── MagicalRecordLogging.h │ │ │ └── MagicalRecordXcode7CompatibilityMacros.h │ │ └── MagicalRecord.h │ └── README.md ├── Manifest.lock ├── Masonry │ ├── LICENSE │ ├── Masonry │ │ ├── MASCompositeConstraint.h │ │ ├── MASCompositeConstraint.m │ │ ├── MASConstraint+Private.h │ │ ├── MASConstraint.h │ │ ├── MASConstraint.m │ │ ├── MASConstraintMaker.h │ │ ├── MASConstraintMaker.m │ │ ├── MASLayoutConstraint.h │ │ ├── MASLayoutConstraint.m │ │ ├── MASUtilities.h │ │ ├── MASViewAttribute.h │ │ ├── MASViewAttribute.m │ │ ├── MASViewConstraint.h │ │ ├── MASViewConstraint.m │ │ ├── Masonry.h │ │ ├── NSArray+MASAdditions.h │ │ ├── NSArray+MASAdditions.m │ │ ├── NSArray+MASShorthandAdditions.h │ │ ├── NSLayoutConstraint+MASDebugAdditions.h │ │ ├── NSLayoutConstraint+MASDebugAdditions.m │ │ ├── View+MASAdditions.h │ │ ├── View+MASAdditions.m │ │ ├── View+MASShorthandAdditions.h │ │ ├── ViewController+MASAdditions.h │ │ └── ViewController+MASAdditions.m │ └── README.md ├── Pods.xcodeproj │ └── project.pbxproj ├── Target Support Files │ ├── MagicalRecord │ │ ├── Info.plist │ │ ├── MagicalRecord-Info.plist │ │ ├── MagicalRecord-dummy.m │ │ ├── MagicalRecord-prefix.pch │ │ ├── MagicalRecord-umbrella.h │ │ ├── MagicalRecord.modulemap │ │ └── MagicalRecord.xcconfig │ ├── Masonry │ │ ├── Masonry-Info.plist │ │ ├── Masonry-dummy.m │ │ ├── Masonry-prefix.pch │ │ ├── Masonry-umbrella.h │ │ ├── Masonry.modulemap │ │ └── Masonry.xcconfig │ ├── Pods-EHenTaiViewer │ │ ├── Info.plist │ │ ├── Pods-EHenTaiViewer-Info.plist │ │ ├── Pods-EHenTaiViewer-acknowledgements.markdown │ │ ├── Pods-EHenTaiViewer-acknowledgements.plist │ │ ├── Pods-EHenTaiViewer-dummy.m │ │ ├── Pods-EHenTaiViewer-frameworks.sh │ │ ├── Pods-EHenTaiViewer-resources.sh │ │ ├── Pods-EHenTaiViewer-umbrella.h │ │ ├── Pods-EHenTaiViewer.debug.xcconfig │ │ ├── Pods-EHenTaiViewer.modulemap │ │ └── Pods-EHenTaiViewer.release.xcconfig │ ├── YYCache │ │ ├── Info.plist │ │ ├── YYCache-Info.plist │ │ ├── YYCache-dummy.m │ │ ├── YYCache-prefix.pch │ │ ├── YYCache-umbrella.h │ │ ├── YYCache.modulemap │ │ └── YYCache.xcconfig │ ├── YYImage │ │ ├── Info.plist │ │ ├── YYImage-Info.plist │ │ ├── YYImage-dummy.m │ │ ├── YYImage-prefix.pch │ │ ├── YYImage-umbrella.h │ │ ├── YYImage.modulemap │ │ └── YYImage.xcconfig │ └── YYWebImage │ │ ├── Info.plist │ │ ├── YYWebImage-Info.plist │ │ ├── YYWebImage-dummy.m │ │ ├── YYWebImage-prefix.pch │ │ ├── YYWebImage-umbrella.h │ │ ├── YYWebImage.modulemap │ │ └── YYWebImage.xcconfig ├── YYCache │ ├── LICENSE │ ├── README.md │ └── YYCache │ │ ├── YYCache.h │ │ ├── YYCache.m │ │ ├── YYDiskCache.h │ │ ├── YYDiskCache.m │ │ ├── YYKVStorage.h │ │ ├── YYKVStorage.m │ │ ├── YYMemoryCache.h │ │ └── YYMemoryCache.m ├── YYImage │ ├── LICENSE │ ├── README.md │ └── YYImage │ │ ├── YYAnimatedImageView.h │ │ ├── YYAnimatedImageView.m │ │ ├── YYFrameImage.h │ │ ├── YYFrameImage.m │ │ ├── YYImage.h │ │ ├── YYImage.m │ │ ├── YYImageCoder.h │ │ ├── YYImageCoder.m │ │ ├── YYSpriteSheetImage.h │ │ └── YYSpriteSheetImage.m └── YYWebImage │ ├── LICENSE │ ├── README.md │ └── YYWebImage │ ├── Categories │ ├── CALayer+YYWebImage.h │ ├── CALayer+YYWebImage.m │ ├── MKAnnotationView+YYWebImage.h │ ├── MKAnnotationView+YYWebImage.m │ ├── UIButton+YYWebImage.h │ ├── UIButton+YYWebImage.m │ ├── UIImage+YYWebImage.h │ ├── UIImage+YYWebImage.m │ ├── UIImageView+YYWebImage.h │ ├── UIImageView+YYWebImage.m │ ├── _YYWebImageSetter.h │ └── _YYWebImageSetter.m │ ├── YYImageCache.h │ ├── YYImageCache.m │ ├── YYWebImage.h │ ├── YYWebImageManager.h │ ├── YYWebImageManager.m │ ├── YYWebImageOperation.h │ └── YYWebImageOperation.m ├── README.md └── docs └── issue_template.md /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | .DS_Store 3 | /xcuserdata/ 4 | .xcscmblueprint 5 | 6 | # Xcode 7 | # 8 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore 9 | 10 | ## Build generated 11 | build/ 12 | DerivedData 13 | 14 | ## Various settings 15 | *.pbxuser 16 | !default.pbxuser 17 | *.mode1v3 18 | !default.mode1v3 19 | *.mode2v3 20 | !default.mode2v3 21 | *.perspectivev3 22 | !default.perspectivev3 23 | xcuserdata 24 | 25 | ## Other 26 | *.xccheckout 27 | *.moved-aside 28 | *.xcuserstate 29 | *.xcscmblueprint 30 | *.xcscheme 31 | 32 | ## Obj-C/Swift specific 33 | *.hmap 34 | *.ipa -------------------------------------------------------------------------------- /EHenTaiViewer.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /EHenTaiViewer.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /EHenTaiViewer.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /EHenTaiViewer/AppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.h 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2017/5/17. 6 | // Copyright © 2017年 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface AppDelegate : UIResponder 12 | 13 | @property (strong, nonatomic) UIWindow *window; 14 | 15 | // 一些参数设置 16 | @property (nonatomic, assign) UIInterfaceOrientationMask orientation; // 控制横竖屏 17 | 18 | @end 19 | 20 | -------------------------------------------------------------------------------- /EHenTaiViewer/Assets.xcassets/AppIcon.appiconset/App Store-1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayanouriko/E-HentaiViewer/3f954c3e1892a8eca1e2b0a2d3ac6049864abedb/EHenTaiViewer/Assets.xcassets/AppIcon.appiconset/App Store-1024.png -------------------------------------------------------------------------------- /EHenTaiViewer/Assets.xcassets/AppIcon.appiconset/CarPlay-60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayanouriko/E-HentaiViewer/3f954c3e1892a8eca1e2b0a2d3ac6049864abedb/EHenTaiViewer/Assets.xcassets/AppIcon.appiconset/CarPlay-60@2x.png -------------------------------------------------------------------------------- /EHenTaiViewer/Assets.xcassets/AppIcon.appiconset/CarPlay-60@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayanouriko/E-HentaiViewer/3f954c3e1892a8eca1e2b0a2d3ac6049864abedb/EHenTaiViewer/Assets.xcassets/AppIcon.appiconset/CarPlay-60@3x.png -------------------------------------------------------------------------------- /EHenTaiViewer/Assets.xcassets/AppIcon.appiconset/iPad App-76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayanouriko/E-HentaiViewer/3f954c3e1892a8eca1e2b0a2d3ac6049864abedb/EHenTaiViewer/Assets.xcassets/AppIcon.appiconset/iPad App-76.png -------------------------------------------------------------------------------- /EHenTaiViewer/Assets.xcassets/AppIcon.appiconset/iPad App-76@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayanouriko/E-HentaiViewer/3f954c3e1892a8eca1e2b0a2d3ac6049864abedb/EHenTaiViewer/Assets.xcassets/AppIcon.appiconset/iPad App-76@2x.png -------------------------------------------------------------------------------- /EHenTaiViewer/Assets.xcassets/AppIcon.appiconset/iPad Notifications-20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayanouriko/E-HentaiViewer/3f954c3e1892a8eca1e2b0a2d3ac6049864abedb/EHenTaiViewer/Assets.xcassets/AppIcon.appiconset/iPad Notifications-20.png -------------------------------------------------------------------------------- /EHenTaiViewer/Assets.xcassets/AppIcon.appiconset/iPad Notifications-20@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayanouriko/E-HentaiViewer/3f954c3e1892a8eca1e2b0a2d3ac6049864abedb/EHenTaiViewer/Assets.xcassets/AppIcon.appiconset/iPad Notifications-20@2x.png -------------------------------------------------------------------------------- /EHenTaiViewer/Assets.xcassets/AppIcon.appiconset/iPad Pro App-83.5@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayanouriko/E-HentaiViewer/3f954c3e1892a8eca1e2b0a2d3ac6049864abedb/EHenTaiViewer/Assets.xcassets/AppIcon.appiconset/iPad Pro App-83.5@2x.png -------------------------------------------------------------------------------- /EHenTaiViewer/Assets.xcassets/AppIcon.appiconset/iPad Settings-29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayanouriko/E-HentaiViewer/3f954c3e1892a8eca1e2b0a2d3ac6049864abedb/EHenTaiViewer/Assets.xcassets/AppIcon.appiconset/iPad Settings-29.png -------------------------------------------------------------------------------- /EHenTaiViewer/Assets.xcassets/AppIcon.appiconset/iPad Settings-29@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayanouriko/E-HentaiViewer/3f954c3e1892a8eca1e2b0a2d3ac6049864abedb/EHenTaiViewer/Assets.xcassets/AppIcon.appiconset/iPad Settings-29@2x.png -------------------------------------------------------------------------------- /EHenTaiViewer/Assets.xcassets/AppIcon.appiconset/iPad Spotlight-40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayanouriko/E-HentaiViewer/3f954c3e1892a8eca1e2b0a2d3ac6049864abedb/EHenTaiViewer/Assets.xcassets/AppIcon.appiconset/iPad Spotlight-40.png -------------------------------------------------------------------------------- /EHenTaiViewer/Assets.xcassets/AppIcon.appiconset/iPad Spotlight-40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayanouriko/E-HentaiViewer/3f954c3e1892a8eca1e2b0a2d3ac6049864abedb/EHenTaiViewer/Assets.xcassets/AppIcon.appiconset/iPad Spotlight-40@2x.png -------------------------------------------------------------------------------- /EHenTaiViewer/Assets.xcassets/AppIcon.appiconset/iPhone Notification-20@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayanouriko/E-HentaiViewer/3f954c3e1892a8eca1e2b0a2d3ac6049864abedb/EHenTaiViewer/Assets.xcassets/AppIcon.appiconset/iPhone Notification-20@2x.png -------------------------------------------------------------------------------- /EHenTaiViewer/Assets.xcassets/AppIcon.appiconset/iPhone Notification-20@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayanouriko/E-HentaiViewer/3f954c3e1892a8eca1e2b0a2d3ac6049864abedb/EHenTaiViewer/Assets.xcassets/AppIcon.appiconset/iPhone Notification-20@3x.png -------------------------------------------------------------------------------- /EHenTaiViewer/Assets.xcassets/AppIcon.appiconset/iPhone Settings-29@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayanouriko/E-HentaiViewer/3f954c3e1892a8eca1e2b0a2d3ac6049864abedb/EHenTaiViewer/Assets.xcassets/AppIcon.appiconset/iPhone Settings-29@2x.png -------------------------------------------------------------------------------- /EHenTaiViewer/Assets.xcassets/AppIcon.appiconset/iPhone Settings-29@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayanouriko/E-HentaiViewer/3f954c3e1892a8eca1e2b0a2d3ac6049864abedb/EHenTaiViewer/Assets.xcassets/AppIcon.appiconset/iPhone Settings-29@3x.png -------------------------------------------------------------------------------- /EHenTaiViewer/Assets.xcassets/AppIcon.appiconset/iPhone Spotlight-40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayanouriko/E-HentaiViewer/3f954c3e1892a8eca1e2b0a2d3ac6049864abedb/EHenTaiViewer/Assets.xcassets/AppIcon.appiconset/iPhone Spotlight-40@2x.png -------------------------------------------------------------------------------- /EHenTaiViewer/Assets.xcassets/AppIcon.appiconset/iPhone Spotlight-40@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayanouriko/E-HentaiViewer/3f954c3e1892a8eca1e2b0a2d3ac6049864abedb/EHenTaiViewer/Assets.xcassets/AppIcon.appiconset/iPhone Spotlight-40@3x.png -------------------------------------------------------------------------------- /EHenTaiViewer/Assets.xcassets/Bookmark/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /EHenTaiViewer/Assets.xcassets/Bookmark/bookmark_all.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "scale" : "2x" 10 | }, 11 | { 12 | "idiom" : "universal", 13 | "filename" : "bookmark_all.png", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /EHenTaiViewer/Assets.xcassets/Bookmark/bookmark_all.imageset/bookmark_all.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayanouriko/E-HentaiViewer/3f954c3e1892a8eca1e2b0a2d3ac6049864abedb/EHenTaiViewer/Assets.xcassets/Bookmark/bookmark_all.imageset/bookmark_all.png -------------------------------------------------------------------------------- /EHenTaiViewer/Assets.xcassets/Bookmark/bookmark_collect.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "scale" : "2x" 10 | }, 11 | { 12 | "idiom" : "universal", 13 | "filename" : "bookmark_collect.png", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /EHenTaiViewer/Assets.xcassets/Bookmark/bookmark_collect.imageset/bookmark_collect.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayanouriko/E-HentaiViewer/3f954c3e1892a8eca1e2b0a2d3ac6049864abedb/EHenTaiViewer/Assets.xcassets/Bookmark/bookmark_collect.imageset/bookmark_collect.png -------------------------------------------------------------------------------- /EHenTaiViewer/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /EHenTaiViewer/Assets.xcassets/Info/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /EHenTaiViewer/Assets.xcassets/Info/ic_share.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "ic_share@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "ic_share@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /EHenTaiViewer/Assets.xcassets/Info/ic_share.imageset/ic_share@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayanouriko/E-HentaiViewer/3f954c3e1892a8eca1e2b0a2d3ac6049864abedb/EHenTaiViewer/Assets.xcassets/Info/ic_share.imageset/ic_share@2x.png -------------------------------------------------------------------------------- /EHenTaiViewer/Assets.xcassets/Info/ic_share.imageset/ic_share@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayanouriko/E-HentaiViewer/3f954c3e1892a8eca1e2b0a2d3ac6049864abedb/EHenTaiViewer/Assets.xcassets/Info/ic_share.imageset/ic_share@3x.png -------------------------------------------------------------------------------- /EHenTaiViewer/Assets.xcassets/Setting/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /EHenTaiViewer/Assets.xcassets/Setting/checkbox.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "checkbox@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "checkbox@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /EHenTaiViewer/Assets.xcassets/Setting/checkbox.imageset/checkbox@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayanouriko/E-HentaiViewer/3f954c3e1892a8eca1e2b0a2d3ac6049864abedb/EHenTaiViewer/Assets.xcassets/Setting/checkbox.imageset/checkbox@2x.png -------------------------------------------------------------------------------- /EHenTaiViewer/Assets.xcassets/Setting/checkbox.imageset/checkbox@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayanouriko/E-HentaiViewer/3f954c3e1892a8eca1e2b0a2d3ac6049864abedb/EHenTaiViewer/Assets.xcassets/Setting/checkbox.imageset/checkbox@3x.png -------------------------------------------------------------------------------- /EHenTaiViewer/Assets.xcassets/Setting/checkbox_unchecked.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "checkbox_unchecked@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "checkbox_unchecked@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /EHenTaiViewer/Assets.xcassets/Setting/checkbox_unchecked.imageset/checkbox_unchecked@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayanouriko/E-HentaiViewer/3f954c3e1892a8eca1e2b0a2d3ac6049864abedb/EHenTaiViewer/Assets.xcassets/Setting/checkbox_unchecked.imageset/checkbox_unchecked@2x.png -------------------------------------------------------------------------------- /EHenTaiViewer/Assets.xcassets/Setting/checkbox_unchecked.imageset/checkbox_unchecked@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayanouriko/E-HentaiViewer/3f954c3e1892a8eca1e2b0a2d3ac6049864abedb/EHenTaiViewer/Assets.xcassets/Setting/checkbox_unchecked.imageset/checkbox_unchecked@3x.png -------------------------------------------------------------------------------- /EHenTaiViewer/Assets.xcassets/Star/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /EHenTaiViewer/Assets.xcassets/Star/star_gray.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "b27_icon_star_gray@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /EHenTaiViewer/Assets.xcassets/Star/star_gray.imageset/b27_icon_star_gray@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayanouriko/E-HentaiViewer/3f954c3e1892a8eca1e2b0a2d3ac6049864abedb/EHenTaiViewer/Assets.xcassets/Star/star_gray.imageset/b27_icon_star_gray@2x.png -------------------------------------------------------------------------------- /EHenTaiViewer/Assets.xcassets/Star/star_yellow.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "b27_icon_star_yellow@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /EHenTaiViewer/Assets.xcassets/Star/star_yellow.imageset/b27_icon_star_yellow@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayanouriko/E-HentaiViewer/3f954c3e1892a8eca1e2b0a2d3ac6049864abedb/EHenTaiViewer/Assets.xcassets/Star/star_yellow.imageset/b27_icon_star_yellow@2x.png -------------------------------------------------------------------------------- /EHenTaiViewer/Assets.xcassets/TabBar/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /EHenTaiViewer/Assets.xcassets/TabBar/ic_favorite.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "ic_favorite@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "ic_favorite@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /EHenTaiViewer/Assets.xcassets/TabBar/ic_favorite.imageset/ic_favorite@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayanouriko/E-HentaiViewer/3f954c3e1892a8eca1e2b0a2d3ac6049864abedb/EHenTaiViewer/Assets.xcassets/TabBar/ic_favorite.imageset/ic_favorite@2x.png -------------------------------------------------------------------------------- /EHenTaiViewer/Assets.xcassets/TabBar/ic_favorite.imageset/ic_favorite@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayanouriko/E-HentaiViewer/3f954c3e1892a8eca1e2b0a2d3ac6049864abedb/EHenTaiViewer/Assets.xcassets/TabBar/ic_favorite.imageset/ic_favorite@3x.png -------------------------------------------------------------------------------- /EHenTaiViewer/Assets.xcassets/TabBar/ic_favorite_border.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "ic_favorite_border@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "ic_favorite_border@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /EHenTaiViewer/Assets.xcassets/TabBar/ic_favorite_border.imageset/ic_favorite_border@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayanouriko/E-HentaiViewer/3f954c3e1892a8eca1e2b0a2d3ac6049864abedb/EHenTaiViewer/Assets.xcassets/TabBar/ic_favorite_border.imageset/ic_favorite_border@2x.png -------------------------------------------------------------------------------- /EHenTaiViewer/Assets.xcassets/TabBar/ic_favorite_border.imageset/ic_favorite_border@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayanouriko/E-HentaiViewer/3f954c3e1892a8eca1e2b0a2d3ac6049864abedb/EHenTaiViewer/Assets.xcassets/TabBar/ic_favorite_border.imageset/ic_favorite_border@3x.png -------------------------------------------------------------------------------- /EHenTaiViewer/Assets.xcassets/TabBar/ic_format_list_bulleted.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "ic_format_list_bulleted@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "ic_format_list_bulleted@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /EHenTaiViewer/Assets.xcassets/TabBar/ic_format_list_bulleted.imageset/ic_format_list_bulleted@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayanouriko/E-HentaiViewer/3f954c3e1892a8eca1e2b0a2d3ac6049864abedb/EHenTaiViewer/Assets.xcassets/TabBar/ic_format_list_bulleted.imageset/ic_format_list_bulleted@2x.png -------------------------------------------------------------------------------- /EHenTaiViewer/Assets.xcassets/TabBar/ic_format_list_bulleted.imageset/ic_format_list_bulleted@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayanouriko/E-HentaiViewer/3f954c3e1892a8eca1e2b0a2d3ac6049864abedb/EHenTaiViewer/Assets.xcassets/TabBar/ic_format_list_bulleted.imageset/ic_format_list_bulleted@3x.png -------------------------------------------------------------------------------- /EHenTaiViewer/Assets.xcassets/TabBar/ic_notifications.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "ic_notifications@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "ic_notifications@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /EHenTaiViewer/Assets.xcassets/TabBar/ic_notifications.imageset/ic_notifications@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayanouriko/E-HentaiViewer/3f954c3e1892a8eca1e2b0a2d3ac6049864abedb/EHenTaiViewer/Assets.xcassets/TabBar/ic_notifications.imageset/ic_notifications@2x.png -------------------------------------------------------------------------------- /EHenTaiViewer/Assets.xcassets/TabBar/ic_notifications.imageset/ic_notifications@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayanouriko/E-HentaiViewer/3f954c3e1892a8eca1e2b0a2d3ac6049864abedb/EHenTaiViewer/Assets.xcassets/TabBar/ic_notifications.imageset/ic_notifications@3x.png -------------------------------------------------------------------------------- /EHenTaiViewer/Assets.xcassets/TabBar/ic_settings.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "ic_settings@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "ic_settings@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /EHenTaiViewer/Assets.xcassets/TabBar/ic_settings.imageset/ic_settings@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayanouriko/E-HentaiViewer/3f954c3e1892a8eca1e2b0a2d3ac6049864abedb/EHenTaiViewer/Assets.xcassets/TabBar/ic_settings.imageset/ic_settings@2x.png -------------------------------------------------------------------------------- /EHenTaiViewer/Assets.xcassets/TabBar/ic_settings.imageset/ic_settings@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayanouriko/E-HentaiViewer/3f954c3e1892a8eca1e2b0a2d3ac6049864abedb/EHenTaiViewer/Assets.xcassets/TabBar/ic_settings.imageset/ic_settings@3x.png -------------------------------------------------------------------------------- /EHenTaiViewer/Assets.xcassets/TabBar/ic_whatshot.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "ic_whatshot@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "ic_whatshot@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /EHenTaiViewer/Assets.xcassets/TabBar/ic_whatshot.imageset/ic_whatshot@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayanouriko/E-HentaiViewer/3f954c3e1892a8eca1e2b0a2d3ac6049864abedb/EHenTaiViewer/Assets.xcassets/TabBar/ic_whatshot.imageset/ic_whatshot@2x.png -------------------------------------------------------------------------------- /EHenTaiViewer/Assets.xcassets/TabBar/ic_whatshot.imageset/ic_whatshot@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayanouriko/E-HentaiViewer/3f954c3e1892a8eca1e2b0a2d3ac6049864abedb/EHenTaiViewer/Assets.xcassets/TabBar/ic_whatshot.imageset/ic_whatshot@3x.png -------------------------------------------------------------------------------- /EHenTaiViewer/Assets.xcassets/arrow_right.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "arrow_right.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /EHenTaiViewer/Assets.xcassets/arrow_right.imageset/arrow_right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayanouriko/E-HentaiViewer/3f954c3e1892a8eca1e2b0a2d3ac6049864abedb/EHenTaiViewer/Assets.xcassets/arrow_right.imageset/arrow_right.png -------------------------------------------------------------------------------- /EHenTaiViewer/Assets.xcassets/home_logo.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "home_logo.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /EHenTaiViewer/Assets.xcassets/home_logo.imageset/home_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayanouriko/E-HentaiViewer/3f954c3e1892a8eca1e2b0a2d3ac6049864abedb/EHenTaiViewer/Assets.xcassets/home_logo.imageset/home_logo.png -------------------------------------------------------------------------------- /EHenTaiViewer/Assets.xcassets/mutSelect.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "mutSelect.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "mutSelect@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "mutSelect@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /EHenTaiViewer/Assets.xcassets/mutSelect.imageset/mutSelect.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayanouriko/E-HentaiViewer/3f954c3e1892a8eca1e2b0a2d3ac6049864abedb/EHenTaiViewer/Assets.xcassets/mutSelect.imageset/mutSelect.png -------------------------------------------------------------------------------- /EHenTaiViewer/Assets.xcassets/mutSelect.imageset/mutSelect@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayanouriko/E-HentaiViewer/3f954c3e1892a8eca1e2b0a2d3ac6049864abedb/EHenTaiViewer/Assets.xcassets/mutSelect.imageset/mutSelect@2x.png -------------------------------------------------------------------------------- /EHenTaiViewer/Assets.xcassets/mutSelect.imageset/mutSelect@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayanouriko/E-HentaiViewer/3f954c3e1892a8eca1e2b0a2d3ac6049864abedb/EHenTaiViewer/Assets.xcassets/mutSelect.imageset/mutSelect@3x.png -------------------------------------------------------------------------------- /EHenTaiViewer/Assets.xcassets/sift.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "sift.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /EHenTaiViewer/Assets.xcassets/sift.imageset/sift.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayanouriko/E-HentaiViewer/3f954c3e1892a8eca1e2b0a2d3ac6049864abedb/EHenTaiViewer/Assets.xcassets/sift.imageset/sift.png -------------------------------------------------------------------------------- /EHenTaiViewer/Assets.xcassets/thumb.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "thumb.jpg", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /EHenTaiViewer/Assets.xcassets/thumb.imageset/thumb.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayanouriko/E-HentaiViewer/3f954c3e1892a8eca1e2b0a2d3ac6049864abedb/EHenTaiViewer/Assets.xcassets/thumb.imageset/thumb.jpg -------------------------------------------------------------------------------- /EHenTaiViewer/Assets.xcassets/toplist.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "toplist.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "toplist@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "toplist@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /EHenTaiViewer/Assets.xcassets/toplist.imageset/toplist.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayanouriko/E-HentaiViewer/3f954c3e1892a8eca1e2b0a2d3ac6049864abedb/EHenTaiViewer/Assets.xcassets/toplist.imageset/toplist.png -------------------------------------------------------------------------------- /EHenTaiViewer/Assets.xcassets/toplist.imageset/toplist@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayanouriko/E-HentaiViewer/3f954c3e1892a8eca1e2b0a2d3ac6049864abedb/EHenTaiViewer/Assets.xcassets/toplist.imageset/toplist@2x.png -------------------------------------------------------------------------------- /EHenTaiViewer/Assets.xcassets/toplist.imageset/toplist@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayanouriko/E-HentaiViewer/3f954c3e1892a8eca1e2b0a2d3ac6049864abedb/EHenTaiViewer/Assets.xcassets/toplist.imageset/toplist@3x.png -------------------------------------------------------------------------------- /EHenTaiViewer/Assets.xcassets/touchid.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "touchid.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /EHenTaiViewer/Assets.xcassets/touchid.imageset/touchid.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayanouriko/E-HentaiViewer/3f954c3e1892a8eca1e2b0a2d3ac6049864abedb/EHenTaiViewer/Assets.xcassets/touchid.imageset/touchid.png -------------------------------------------------------------------------------- /EHenTaiViewer/Assets.xcassets/unlike.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "collect@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /EHenTaiViewer/Assets.xcassets/unlike.imageset/collect@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayanouriko/E-HentaiViewer/3f954c3e1892a8eca1e2b0a2d3ac6049864abedb/EHenTaiViewer/Assets.xcassets/unlike.imageset/collect@2x.png -------------------------------------------------------------------------------- /EHenTaiViewer/Gallery+CoreDataClass.h: -------------------------------------------------------------------------------- 1 | // 2 | // Gallery+CoreDataClass.h 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2018/8/13. 6 | // Copyright © 2018 kayanouriko. All rights reserved. 7 | // 8 | // 9 | 10 | #import 11 | #import 12 | 13 | @class GalleryPage; 14 | 15 | NS_ASSUME_NONNULL_BEGIN 16 | 17 | @interface Gallery : NSManagedObject 18 | 19 | @end 20 | 21 | NS_ASSUME_NONNULL_END 22 | 23 | #import "Gallery+CoreDataProperties.h" 24 | -------------------------------------------------------------------------------- /EHenTaiViewer/Gallery+CoreDataClass.m: -------------------------------------------------------------------------------- 1 | // 2 | // Gallery+CoreDataClass.m 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2018/8/13. 6 | // Copyright © 2018 kayanouriko. All rights reserved. 7 | // 8 | // 9 | 10 | #import "Gallery+CoreDataClass.h" 11 | 12 | @implementation Gallery 13 | 14 | @end 15 | -------------------------------------------------------------------------------- /EHenTaiViewer/Gallery+CoreDataProperties.h: -------------------------------------------------------------------------------- 1 | // 2 | // Gallery+CoreDataProperties.h 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2018/8/13. 6 | // Copyright © 2018 kayanouriko. All rights reserved. 7 | // 8 | // 9 | 10 | #import "Gallery+CoreDataClass.h" 11 | 12 | 13 | NS_ASSUME_NONNULL_BEGIN 14 | 15 | @interface Gallery (CoreDataProperties) 16 | 17 | + (NSFetchRequest *)fetchRequest; 18 | 19 | @property (nullable, nonatomic, copy) NSString *galleryid; 20 | @property (nullable, nonatomic, retain) NSSet *galleryPage; 21 | 22 | @end 23 | 24 | @interface Gallery (CoreDataGeneratedAccessors) 25 | 26 | - (void)addGalleryPageObject:(GalleryPage *)value; 27 | - (void)removeGalleryPageObject:(GalleryPage *)value; 28 | - (void)addGalleryPage:(NSSet *)values; 29 | - (void)removeGalleryPage:(NSSet *)values; 30 | 31 | @end 32 | 33 | NS_ASSUME_NONNULL_END 34 | -------------------------------------------------------------------------------- /EHenTaiViewer/Gallery+CoreDataProperties.m: -------------------------------------------------------------------------------- 1 | // 2 | // Gallery+CoreDataProperties.m 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2018/8/13. 6 | // Copyright © 2018 kayanouriko. All rights reserved. 7 | // 8 | // 9 | 10 | #import "Gallery+CoreDataProperties.h" 11 | 12 | @implementation Gallery (CoreDataProperties) 13 | 14 | + (NSFetchRequest *)fetchRequest { 15 | return [NSFetchRequest fetchRequestWithEntityName:@"Gallery"]; 16 | } 17 | 18 | @dynamic galleryid; 19 | @dynamic galleryPage; 20 | 21 | @end 22 | -------------------------------------------------------------------------------- /EHenTaiViewer/GalleryPage+CoreDataClass.h: -------------------------------------------------------------------------------- 1 | // 2 | // GalleryPage+CoreDataClass.h 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2018/8/13. 6 | // Copyright © 2018 kayanouriko. All rights reserved. 7 | // 8 | // 9 | 10 | #import 11 | #import 12 | 13 | @class Gallery; 14 | 15 | NS_ASSUME_NONNULL_BEGIN 16 | 17 | @interface GalleryPage : NSManagedObject 18 | 19 | @end 20 | 21 | NS_ASSUME_NONNULL_END 22 | 23 | #import "GalleryPage+CoreDataProperties.h" 24 | -------------------------------------------------------------------------------- /EHenTaiViewer/GalleryPage+CoreDataClass.m: -------------------------------------------------------------------------------- 1 | // 2 | // GalleryPage+CoreDataClass.m 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2018/8/13. 6 | // Copyright © 2018 kayanouriko. All rights reserved. 7 | // 8 | // 9 | 10 | #import "GalleryPage+CoreDataClass.h" 11 | 12 | @implementation GalleryPage 13 | 14 | @end 15 | -------------------------------------------------------------------------------- /EHenTaiViewer/GalleryPage+CoreDataProperties.h: -------------------------------------------------------------------------------- 1 | // 2 | // GalleryPage+CoreDataProperties.h 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2018/8/13. 6 | // Copyright © 2018 kayanouriko. All rights reserved. 7 | // 8 | // 9 | 10 | #import "GalleryPage+CoreDataClass.h" 11 | 12 | 13 | NS_ASSUME_NONNULL_BEGIN 14 | 15 | @interface GalleryPage (CoreDataProperties) 16 | 17 | + (NSFetchRequest *)fetchRequest; 18 | 19 | @property (nonatomic) int64_t page; 20 | @property (nullable, nonatomic, copy) NSString *smallImageUrl; 21 | @property (nullable, nonatomic, retain) Gallery *gallery; 22 | 23 | @end 24 | 25 | NS_ASSUME_NONNULL_END 26 | -------------------------------------------------------------------------------- /EHenTaiViewer/GalleryPage+CoreDataProperties.m: -------------------------------------------------------------------------------- 1 | // 2 | // GalleryPage+CoreDataProperties.m 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2018/8/13. 6 | // Copyright © 2018 kayanouriko. All rights reserved. 7 | // 8 | // 9 | 10 | #import "GalleryPage+CoreDataProperties.h" 11 | 12 | @implementation GalleryPage (CoreDataProperties) 13 | 14 | + (NSFetchRequest *)fetchRequest { 15 | return [NSFetchRequest fetchRequestWithEntityName:@"GalleryPage"]; 16 | } 17 | 18 | @dynamic page; 19 | @dynamic smallImageUrl; 20 | @dynamic gallery; 21 | 22 | @end 23 | -------------------------------------------------------------------------------- /EHenTaiViewer/NJKWebViewProgress.h: -------------------------------------------------------------------------------- 1 | // 2 | // NJKWebViewProgress.h 3 | // 4 | // Created by Satoshi Aasano on 4/20/13. 5 | // Copyright (c) 2013 Satoshi Asano. All rights reserved. 6 | // 7 | 8 | #import 9 | #import 10 | 11 | #undef njk_weak 12 | #if __has_feature(objc_arc_weak) 13 | #define njk_weak weak 14 | #else 15 | #define njk_weak unsafe_unretained 16 | #endif 17 | 18 | extern const float NJKInitialProgressValue; 19 | extern const float NJKInteractiveProgressValue; 20 | extern const float NJKFinalProgressValue; 21 | 22 | typedef void (^NJKWebViewProgressBlock)(float progress); 23 | @protocol NJKWebViewProgressDelegate; 24 | @interface NJKWebViewProgress : NSObject 25 | @property (nonatomic, njk_weak) idprogressDelegate; 26 | @property (nonatomic, njk_weak) idwebViewProxyDelegate; 27 | @property (nonatomic, copy) NJKWebViewProgressBlock progressBlock; 28 | @property (nonatomic, readonly) float progress; // 0.0..1.0 29 | 30 | - (void)reset; 31 | @end 32 | 33 | @protocol NJKWebViewProgressDelegate 34 | - (void)webViewProgress:(NJKWebViewProgress *)webViewProgress updateProgress:(float)progress; 35 | @end 36 | 37 | -------------------------------------------------------------------------------- /EHenTaiViewer/NJKWebViewProgressView.h: -------------------------------------------------------------------------------- 1 | // 2 | // NJKWebViewProgressView.h 3 | // iOS 7 Style WebView Progress Bar 4 | // 5 | // Created by Satoshi Aasano on 11/16/13. 6 | // Copyright (c) 2013 Satoshi Asano. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface NJKWebViewProgressView : UIView 12 | @property (nonatomic) float progress; 13 | 14 | @property (nonatomic) UIView *progressBarView; 15 | @property (nonatomic) NSTimeInterval barAnimationDuration; // default 0.1 16 | @property (nonatomic) NSTimeInterval fadeAnimationDuration; // default 0.27 17 | @property (nonatomic) NSTimeInterval fadeOutDelay; // default 0.1 18 | 19 | - (void)setProgress:(float)progress animated:(BOOL)animated; 20 | 21 | @end 22 | -------------------------------------------------------------------------------- /EHenTaiViewer/NSString+StringHeight.h: -------------------------------------------------------------------------------- 1 | // 2 | // NSString+StringHeight.h 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2017/5/26. 6 | // Copyright © 2017年 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface NSString (StringHeight) 12 | 13 | //获取高度 14 | - (CGFloat)StringHeightWithFontSize:(UIFont *)font maxWidth:(CGFloat)maxWidth; 15 | //获取宽度 16 | - (CGFloat)StringWidthWithFontSize:(UIFont *)font; 17 | //编码 18 | - (NSString *)urlEncode; 19 | //截取字符串,去除[]()【】等内容 20 | - (NSString *)handleString; 21 | //去除html标签 22 | - (NSString *)removeHtmlString; 23 | // 文本md5 24 | - (NSString *)MD5; 25 | // 根据字符串数组获取一个标签的富文本 26 | + (NSAttributedString *)convertStringsWithArray:(NSArray *)array; 27 | // 将html转义字符转为iOS可显示 28 | - (NSString *)digitalHTMLToUnicode; 29 | // 根据正则表示式传回适配的字符串 30 | - (NSString *)matchFristObjWithRegex:(NSString *)regex; 31 | - (NSArray *)matchWithRegex:(NSString *)regex; 32 | // 获取中文标签,如果有的话 33 | - (NSString *)getCHTagName; 34 | 35 | @end 36 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJAddMytagsSearchController.h: -------------------------------------------------------------------------------- 1 | // 2 | // QJAddMytagsSearchController.h 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2019/4/26. 6 | // Copyright © 2019 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import "QJViewController.h" 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface QJAddMytagsSearchController : QJViewController 14 | 15 | @property (strong, nonatomic) NSString *apikey; 16 | @property (strong, nonatomic) NSString *apiuid; 17 | 18 | @end 19 | 20 | NS_ASSUME_NONNULL_END 21 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJAllCommentController.h: -------------------------------------------------------------------------------- 1 | // 2 | // QJAllCommentController.h 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2017/11/24. 6 | // Copyright © 2017年 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import "QJViewController.h" 10 | 11 | @interface QJAllCommentController : QJViewController 12 | 13 | @property (nonatomic, strong) NSArray *allComments; 14 | @property (nonatomic, assign) NSInteger index; 15 | 16 | @end 17 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJBigImageItem.h: -------------------------------------------------------------------------------- 1 | // 2 | // QJBigImageItem.h 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2017/6/3. 6 | // Copyright © 2017年 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | typedef void (^SuccessHandler)(NSString *url); 12 | 13 | @interface QJBigImageItem : NSObject 14 | 15 | @property (nonatomic, assign) NSInteger page; 16 | @property (nonatomic, strong) NSString *realImageUrl; 17 | @property (nonatomic, strong) NSString *x; 18 | @property (nonatomic, strong) NSString *y; 19 | 20 | - (void)getReallyImageUrl:(SuccessHandler)successHandler; 21 | 22 | @end 23 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJBigImageItem.m: -------------------------------------------------------------------------------- 1 | // 2 | // QJBigImageItem.m 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2017/6/3. 6 | // Copyright © 2017年 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import "QJBigImageItem.h" 10 | 11 | @interface QJBigImageItem () 12 | 13 | @property (nonatomic, strong) SuccessHandler block; 14 | 15 | @end 16 | 17 | @implementation QJBigImageItem 18 | 19 | - (void)getReallyImageUrl:(SuccessHandler)successHandler { 20 | if (self.realImageUrl) { 21 | successHandler(self.realImageUrl); 22 | } 23 | self.block = successHandler; 24 | } 25 | 26 | #pragma mark -setter 27 | - (void)setRealImageUrl:(NSString *)realImageUrl { 28 | _realImageUrl = realImageUrl; 29 | if (self.block) { 30 | self.block(_realImageUrl); 31 | } 32 | } 33 | 34 | @end 35 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJBrowerCollectManager.h: -------------------------------------------------------------------------------- 1 | // 2 | // QJBrowerCollectManager.h 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2018/8/13. 6 | // Copyright © 2018 kayanouriko. All rights reserved. 7 | // 8 | 9 | // 管理书签相关 10 | 11 | #import 12 | 13 | @class GalleryPage; 14 | 15 | @interface QJBrowerCollectManager : NSObject 16 | 17 | /** 获取全部书签 18 | @param gid 画廊的唯一标识符 19 | */ 20 | + (NSArray *)getAllCollectPagesWithGid:(NSString *)gid; 21 | 22 | /** 添加一个书签 23 | @param gid 画廊的唯一标识符 24 | @param pageIndex 书签信息,页码 25 | @param smallImageUrl 书签信息,缩略图url 26 | */ 27 | + (void)saveOnePageWithGid:(NSString *)gid pageIndex:(NSInteger)pageIndex smallImageUrl:(NSString *)smallImageUrl; 28 | 29 | /** 删除一个书签 30 | @param gid 画廊的唯一标识符 31 | @param pageIndex 书签信息,页码 32 | @param smallImageUrl 书签信息,缩略图url 33 | */ 34 | + (void)deleteOnePageWithGid:(NSString *)gid pageIndex:(NSInteger)pageIndex smallImageUrl:(NSString *)smallImageUrl; 35 | 36 | @end 37 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJBrowerSettingPopView.h: -------------------------------------------------------------------------------- 1 | // 2 | // QJBrowerSettingPopView.h 3 | // EHenTaiViewer 4 | // 5 | // Created by kayanouriko on 2018/6/27. 6 | // Copyright © 2018年 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @protocol QJBrowerSettingPopViewDelegate 12 | 13 | /** 返回当前屏幕方向设置 14 | @return 0.竖屏 1.横屏 2.跟随系统 15 | */ 16 | - (NSInteger)currentOrientationSegSelectedIndex; 17 | 18 | /** 返回当前滚动方向设置 19 | @return 0.水平滚动 1.上下滚动 20 | */ 21 | - (NSInteger)currentDirectionSegSelectedIndex; 22 | 23 | /** 返回当前系统亮度 24 | @return brightness 系统亮度 25 | */ 26 | - (CGFloat)currentBrightness; 27 | 28 | @optional 29 | /** 旋转方式响应事件 30 | @param selectedIndex 选中的Seg下标 31 | */ 32 | - (void)orientationSegDidClickBtnWithSelectedIndex:(NSInteger)selectedIndex; 33 | 34 | /** 滚动方向响应事件 35 | @param selectedIndex 选中的Seg下标 36 | */ 37 | - (void)directionSegDidClickBtnWithSelectedIndex:(NSInteger)selectedIndex; 38 | 39 | /** 亮度调节响应事件 40 | @param value 改变的亮度值 41 | */ 42 | - (void)brightnessSliderDidChangeValue:(CGFloat)value; 43 | 44 | @end 45 | 46 | @interface QJBrowerSettingPopView : UIView 47 | 48 | @property (nonatomic, weak) id delegate; 49 | @property (nonatomic, assign, getter=isShowed) BOOL showed; 50 | 51 | + (instancetype)new NS_UNAVAILABLE; 52 | - (instancetype)init NS_UNAVAILABLE; 53 | + (QJBrowerSettingPopView *)initWithDelegate:(id)theDelegate; 54 | 55 | /** 呈现弹出框 */ 56 | - (void)show; 57 | /** 刷新布局,这里采用了比较笨的方法,直接重新布局 */ 58 | - (void)changeFrameIfNeed; 59 | 60 | @end 61 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJBrowserBookMarkPopView.h: -------------------------------------------------------------------------------- 1 | // 2 | // QJBrowserBookMarkPopView.h 3 | // AnimatedTransitioningDemo 4 | // 5 | // Created by zedmacbook on 2018/7/24. 6 | // Copyright © 2018年 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @class QJMangaManager; 12 | 13 | @protocol QJBrowserBookMarkPopViewDelegate 14 | 15 | @optional 16 | - (void)didSelectImageWithIndex:(NSInteger)index; 17 | 18 | @end 19 | 20 | @interface QJBrowserBookMarkPopView : UIView 21 | 22 | @property (nonatomic, weak) id delegate; 23 | @property (nonatomic, assign, getter=isShowed) BOOL showed; 24 | 25 | + (QJBrowserBookMarkPopView *)creatPopViewWithDelegate:(id)theDelagate manager:(QJMangaManager *)manager gid:(NSString *)gid; 26 | 27 | - (void)showWithIndexPath:(NSIndexPath *)indexPath; 28 | - (void)changeFrameIfNeedWithIndexPath:(NSIndexPath *)indexPath; 29 | 30 | @end 31 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJBrowserBookMarkPopViewCell.h: -------------------------------------------------------------------------------- 1 | // 2 | // QJBrowserBookMarkPopViewCell.h 3 | // AnimatedTransitioningDemo 4 | // 5 | // Created by zedmacbook on 2018/7/24. 6 | // Copyright © 2018年 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @class QJMangaImageModel, GalleryPage; 12 | 13 | @interface QJBrowserBookMarkPopViewCell : UICollectionViewCell 14 | 15 | @property (nonatomic, strong) QJMangaImageModel *model; 16 | @property (nonatomic, strong) GalleryPage *galleryPage; 17 | 18 | @end 19 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJBrowserBookMarkPopViewCell.m: -------------------------------------------------------------------------------- 1 | // 2 | // QJBrowserBookMarkPopViewCell.m 3 | // AnimatedTransitioningDemo 4 | // 5 | // Created by zedmacbook on 2018/7/24. 6 | // Copyright © 2018年 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import "QJBrowserBookMarkPopViewCell.h" 10 | #import "QJMangaImageModel.h" 11 | #import "GalleryPage+CoreDataClass.h" 12 | 13 | @interface QJBrowserBookMarkPopViewCell() 14 | 15 | @property (weak, nonatomic) IBOutlet UIImageView *thumbImageView; 16 | @property (weak, nonatomic) IBOutlet UILabel *pageLabel; 17 | 18 | @end 19 | 20 | @implementation QJBrowserBookMarkPopViewCell 21 | 22 | - (void)awakeFromNib { 23 | [super awakeFromNib]; 24 | self.layer.cornerRadius = 5.f; 25 | self.layer.borderWidth = 0.5f; 26 | self.layer.borderColor = [UIColor groupTableViewBackgroundColor].CGColor; 27 | self.layer.masksToBounds = YES; 28 | } 29 | 30 | #pragma mark - Setter 31 | - (void)setModel:(QJMangaImageModel *)model { 32 | _model = model; 33 | self.pageLabel.text = [NSString stringWithFormat:@"%ld", (long)model.page]; 34 | self.thumbImageView.image = nil; 35 | [model getSmallUrlWithBlock:^{ 36 | [self.thumbImageView yy_setImageWithURL:[NSURL URLWithString:model.smallImageUrl] options:YYWebImageOptionProgressiveBlur | YYWebImageOptionSetImageWithFadeAnimation | YYWebImageOptionHandleCookies]; 37 | }]; 38 | } 39 | 40 | - (void)setGalleryPage:(GalleryPage *)galleryPage { 41 | _galleryPage = galleryPage; 42 | self.pageLabel.text = [NSString stringWithFormat:@"%ld", (long)galleryPage.page + 1]; 43 | [self.thumbImageView yy_setImageWithURL:[NSURL URLWithString:galleryPage.smallImageUrl] options:YYWebImageOptionProgressiveBlur | YYWebImageOptionSetImageWithFadeAnimation | YYWebImageOptionHandleCookies]; 44 | } 45 | 46 | @end 47 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJButton.h: -------------------------------------------------------------------------------- 1 | // 2 | // QJButton.h 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2017/11/9. 6 | // Copyright © 2017年 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | IB_DESIGNABLE 12 | 13 | @interface QJButton : UIButton 14 | 15 | //本身具备一个存储值 16 | @property (nonatomic, strong) IBInspectable NSString *value; 17 | 18 | @end 19 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJButton.m: -------------------------------------------------------------------------------- 1 | // 2 | // QJButton.m 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2017/11/9. 6 | // Copyright © 2017年 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import "QJButton.h" 10 | 11 | @implementation QJButton 12 | 13 | /* 14 | // Only override drawRect: if you perform custom drawing. 15 | // An empty implementation adversely affects performance during animation. 16 | - (void)drawRect:(CGRect)rect { 17 | // Drawing code 18 | } 19 | */ 20 | 21 | @end 22 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJCollectionViewFlowLayout.h: -------------------------------------------------------------------------------- 1 | // 2 | // QJCollectionViewFlowLayout.h 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2017/12/15. 6 | // Copyright © 2017年 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface QJCollectionViewFlowLayout : UICollectionViewFlowLayout 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJColorPickBoard.h: -------------------------------------------------------------------------------- 1 | // 2 | // QJColorPickBoard.h 3 | // QJColorPicker 4 | // 5 | // Created by QinJ on 2019/4/28. 6 | // Copyright © 2019 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "QJColorPickProtocol.h" 11 | 12 | NS_ASSUME_NONNULL_BEGIN 13 | 14 | @interface QJColorPickBoard : UIView 15 | 16 | @property (weak, nonatomic) iddelegate; 17 | @property (strong, nonatomic) UIColor *currentColor; 18 | 19 | @end 20 | 21 | NS_ASSUME_NONNULL_END 22 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJColorPickProtocol.h: -------------------------------------------------------------------------------- 1 | // 2 | // QJColorPickProtocol.h 3 | // QJColorPicker 4 | // 5 | // Created by QinJ on 2019/4/28. 6 | // Copyright © 2019 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @class QJColorPickBoard, QJColorPickSlider; 12 | 13 | @protocol QJColorPickBoardDelegate 14 | 15 | @optional 16 | - (void)colorPickBoard:(QJColorPickBoard *)colorPickBoard didChangeColor:(UIColor *)color; 17 | 18 | @end 19 | 20 | @protocol QJColorPickSliderDelegate 21 | 22 | @optional 23 | - (void)colorPickSlider:(QJColorPickSlider *)colorPickSlider didChangeColor:(UIColor *)color; 24 | 25 | @end 26 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJColorPickShowView.h: -------------------------------------------------------------------------------- 1 | // 2 | // QJColorPickShowView.h 3 | // QJColorPicker 4 | // 5 | // Created by QinJ on 2019/4/28. 6 | // Copyright © 2019 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface QJColorPickShowView : UIView 14 | 15 | @property (strong, nonatomic) UIColor *showColor; 16 | @property (strong, nonatomic) NSString *hexColor; 17 | 18 | @end 19 | 20 | NS_ASSUME_NONNULL_END 21 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJColorPickSlider.h: -------------------------------------------------------------------------------- 1 | // 2 | // QJColorPickSlider.h 3 | // QJColorPicker 4 | // 5 | // Created by QinJ on 2019/4/28. 6 | // Copyright © 2019 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "QJColorPickProtocol.h" 11 | 12 | NS_ASSUME_NONNULL_BEGIN 13 | 14 | @interface QJColorPickSlider : UIView 15 | 16 | @property (weak, nonatomic) iddelegate; 17 | @property (strong, nonatomic) UIColor *showColor; // 从board获取的颜色 18 | @property (strong, nonatomic) UIColor *currentColor; // 修改后的颜色 19 | 20 | @end 21 | 22 | NS_ASSUME_NONNULL_END 23 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJColorPickUtils.h: -------------------------------------------------------------------------------- 1 | // 2 | // QJColorPickUtils.h 3 | // QJColorPicker 4 | // 5 | // Created by QinJ on 2019/4/28. 6 | // Copyright © 2019 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface QJColorPickUtils : NSObject 14 | 15 | // UIColor --> Hex 16 | + (NSString *)hexStringWithColor:(UIColor *)color hasAlpha:(BOOL)hasAlpha; 17 | // change alpha 18 | + (UIColor *)changeColorAlpha:(UIColor *)color alpha:(CGFloat)alpha; 19 | // Point --> UIColor 20 | + (UIColor *)getColorWithPoint:(CGPoint)point layer:(CALayer *)layer; 21 | 22 | @end 23 | 24 | NS_ASSUME_NONNULL_END 25 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJColorPickUtils.m: -------------------------------------------------------------------------------- 1 | // 2 | // QJColorPickUtils.m 3 | // QJColorPicker 4 | // 5 | // Created by QinJ on 2019/4/28. 6 | // Copyright © 2019 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import "QJColorPickUtils.h" 10 | 11 | @implementation QJColorPickUtils 12 | 13 | + (NSString *)hexStringWithColor:(UIColor *)color hasAlpha:(BOOL)hasAlpha { 14 | CGFloat r, g, b, a; 15 | [color getRed:&r green:&g blue:&b alpha:&a]; 16 | int rgb = (int)(r * 255.0f)<<16 | (int)(g * 255.0f)<<8 | (int)(b * 255.0f)<<0; 17 | if (hasAlpha) { 18 | rgb = (int)(a * 255.0f)<<24 | (int)(r * 255.0f)<<16 | (int)(g * 255.0f)<<8 | (int)(b * 255.0f)<<0; 19 | } 20 | return [[NSString stringWithFormat:@"%06x", rgb] uppercaseString]; 21 | } 22 | 23 | + (UIColor *)changeColorAlpha:(UIColor *)color alpha:(CGFloat)alpha { 24 | const CGFloat *component = CGColorGetComponents(color.CGColor); 25 | return [UIColor colorWithRed:component[0] green:component[1] blue:component[2] alpha:alpha]; 26 | } 27 | 28 | + (UIColor *)getColorWithPoint:(CGPoint)point layer:(CALayer *)layer { 29 | unsigned char pixel[4] = {0}; 30 | CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 31 | CGContextRef context = CGBitmapContextCreate(pixel, 1, 1, 8, 4, colorSpace, (CGBitmapInfo)kCGImageAlphaPremultipliedLast); 32 | CGContextTranslateCTM(context, -point.x, -point.y); 33 | [layer renderInContext:context]; 34 | CGContextRelease(context); 35 | CGColorSpaceRelease(colorSpace); 36 | return [UIColor colorWithRed:pixel[0] / 255.f green:pixel[1] / 255.f blue:pixel[2] / 255.f alpha:pixel[3] / 255.f]; 37 | } 38 | 39 | @end 40 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJCommentCell.h: -------------------------------------------------------------------------------- 1 | // 2 | // QJCommentCell.h 3 | // ExReadViewer 4 | // 5 | // Created by 覃江 on 2016/12/31. 6 | // Copyright © 2016年 茅野瓜子. All rights reserved. 7 | // 8 | 9 | #import "QJTableViewCell.h" 10 | 11 | @class QJCommentCell; 12 | 13 | @protocol QJCommentCellDelegate 14 | 15 | @optional 16 | // 点击了用户的名字 17 | - (void)commentCell:(QJCommentCell *)cell didClickUserImageWithUserName:(NSString *)userName; 18 | // 点击了评论内容的url 19 | - (void)commentCell:(QJCommentCell *)cell didClickContentUrlWithURL:(NSURL *)URL; 20 | 21 | @end 22 | 23 | @interface QJCommentCell : QJTableViewCell 24 | 25 | @property (weak, nonatomic) iddelegate; 26 | 27 | - (void)refreshUI:(NSDictionary *)dict; 28 | 29 | @end 30 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJContentSplitViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // QJContentSplitViewController.h 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2019/5/6. 6 | // Copyright © 2019 kayanouriko. All rights reserved. 7 | // 8 | 9 | // 第二个SplitViewController,控制着列表和画廊内容 10 | 11 | #import 12 | 13 | NS_ASSUME_NONNULL_BEGIN 14 | 15 | @interface QJContentSplitViewController : UISplitViewController 16 | 17 | @property(nonatomic, assign) CGFloat maximumPrimaryColumnWidth NS_AVAILABLE_IOS(8_0); 18 | 19 | @end 20 | 21 | NS_ASSUME_NONNULL_END 22 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJContentSplitViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // QJContentSplitViewController.m 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2019/5/6. 6 | // Copyright © 2019 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import "QJContentSplitViewController.h" 10 | 11 | @interface QJContentSplitViewController () 12 | 13 | @end 14 | 15 | @implementation QJContentSplitViewController 16 | 17 | @dynamic maximumPrimaryColumnWidth; 18 | 19 | - (void)viewDidLoad { 20 | [super viewDidLoad]; 21 | self.preferredDisplayMode = UISplitViewControllerDisplayModeAllVisible; 22 | self.preferredPrimaryColumnWidthFraction = 1.f; 23 | self.maximumPrimaryColumnWidth = self.view.bounds.size.width; 24 | } 25 | 26 | @end 27 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJCustomTabbarSettingController.h: -------------------------------------------------------------------------------- 1 | // 2 | // QJCustomTabbarSettingController.h 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2018/7/23. 6 | // Copyright © 2018 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import "QJViewController.h" 10 | 11 | @interface QJCustomTabbarSettingController : QJViewController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJFavoritesSelectCell.h: -------------------------------------------------------------------------------- 1 | // 2 | // QJFavoritesSelectCell.h 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2017/12/12. 6 | // Copyright © 2017年 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface QJFavoritesSelectCell : UITableViewCell 12 | 13 | @property (weak, nonatomic) IBOutlet UIView *colorView; 14 | @property (weak, nonatomic) IBOutlet UILabel *titleNameLabel; 15 | @property (weak, nonatomic) IBOutlet UILabel *countLabel; 16 | 17 | @end 18 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJFavoritesSelectCell.m: -------------------------------------------------------------------------------- 1 | // 2 | // QJFavoritesSelectCell.m 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2017/12/12. 6 | // Copyright © 2017年 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import "QJFavoritesSelectCell.h" 10 | 11 | @implementation QJFavoritesSelectCell 12 | 13 | - (void)awakeFromNib { 14 | [super awakeFromNib]; 15 | // Initialization code 16 | } 17 | 18 | - (void)setSelected:(BOOL)selected animated:(BOOL)animated { 19 | [super setSelected:selected animated:animated]; 20 | 21 | // Configure the view for the selected state 22 | } 23 | 24 | @end 25 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJFavoritesSelectController.h: -------------------------------------------------------------------------------- 1 | // 2 | // QJFavoritesSelectController.h 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2017/12/12. 6 | // Copyright © 2017年 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import "QJViewController.h" 10 | 11 | @protocol QJFavoritesSelectControllerDelegate 12 | 13 | @optional 14 | - (void)didSelectFavFolderNameWithArr:(NSArray *)array index:(NSInteger)index; 15 | 16 | @end 17 | 18 | @interface QJFavoritesSelectController : QJViewController 19 | 20 | @property (weak, nonatomic) iddelegate; 21 | //判断是不是从收藏界面来的 22 | //如果是收藏界面来的,则显示'全部收藏'这个选项,否则是隐藏该选项 23 | @property (nonatomic, assign, getter=isLikeVCJump) BOOL likeVCJump; 24 | 25 | @end 26 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJFavouriteViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // QJFavouriteViewController.h 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2017/6/16. 6 | // Copyright © 2017年 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import "QJViewController.h" 10 | 11 | @protocol QJFavouriteViewControllerDelagate 12 | 13 | @optional 14 | - (void)didSelectFolder:(NSInteger)index content:(NSString *)content; 15 | 16 | @end 17 | 18 | @interface QJFavouriteViewController : QJViewController 19 | 20 | @property (weak, nonatomic) iddelegate; 21 | 22 | @end 23 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJGalleryItem.h: -------------------------------------------------------------------------------- 1 | // 2 | // QJGalleryItem.h 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2017/5/31. 6 | // Copyright © 2017年 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @class TFHpple; 12 | 13 | @interface QJGalleryTagItem : NSObject 14 | 15 | @property (nonatomic, strong) NSString *name; 16 | @property (nonatomic, strong) NSString *cname;//汉化标签 17 | @property (nonatomic, strong) NSString *searchKey;//用于在搜索页面显示 18 | @property (nonatomic, strong) NSString *url; 19 | //日语的位置 20 | @property (nonatomic, assign) CGFloat buttonWidth; 21 | @property (nonatomic, assign) CGFloat buttonX; 22 | @property (nonatomic, assign) CGFloat buttonY; 23 | //中文的位置 24 | @property (nonatomic, assign) CGFloat buttonWidthCN; 25 | @property (nonatomic, assign) CGFloat buttonXCN; 26 | @property (nonatomic, assign) CGFloat buttonYCN; 27 | 28 | @end 29 | 30 | @interface QJGalleryItem : NSObject 31 | 32 | @property (nonatomic, strong) NSDictionary *baseInfoDic;//基础信息 33 | @property (nonatomic, strong) NSArray *smallImages;//缩略图合集 34 | @property (nonatomic, strong) NSArray *imageUrls;//图片的url 35 | @property (nonatomic, strong) NSArray *comments;//评论 36 | @property (nonatomic, strong) NSArray *tagArr;//tag 37 | @property (nonatomic, assign) BOOL isFavorite;//是否收藏 38 | @property (nonatomic, assign) CGFloat customSore;//用户评分 39 | @property (nonatomic, strong) NSString *testUrl;//获取showkey的链接 40 | @property (nonatomic, strong) NSString *showkey;//24小时变换的token 41 | @property (nonatomic, strong) NSString *apiuid; 42 | @property (nonatomic, strong) NSString *apikey; 43 | 44 | - (instancetype)initWithHpple:(TFHpple *)xpathParser; 45 | 46 | @end 47 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJGoCommentController.h: -------------------------------------------------------------------------------- 1 | // 2 | // QJGoCommentController.h 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2017/6/1. 6 | // Copyright © 2017年 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import "QJViewController.h" 10 | 11 | @interface QJGoCommentController : QJViewController 12 | 13 | @property (nonatomic, strong) NSString *url; 14 | 15 | @end 16 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJHeadFreshingView.h: -------------------------------------------------------------------------------- 1 | // 2 | // QJHeadFreshingView.h 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2017/6/12. 6 | // Copyright © 2017年 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @class QJHeadFreshingView; 12 | 13 | @protocol QJHeadFreshingViewDelagate 14 | 15 | - (void)didBeginReFreshingWithFreshingView:(QJHeadFreshingView *)headFreshingView; 16 | 17 | @end 18 | 19 | @interface QJHeadFreshingView : UIView 20 | 21 | @property (weak, nonatomic) iddelegate; 22 | 23 | @property (nonatomic, assign, getter=isReFreshing) BOOL refreshing; 24 | 25 | - (void)beginReFreshing; 26 | - (void)endRefreshing; 27 | 28 | @end 29 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJHomeViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // QJHomeViewController.h 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2017/5/18. 6 | // Copyright © 2017年 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import "QJViewController.h" 10 | 11 | @interface QJHomeViewController : QJViewController 12 | 13 | @property (nonatomic, strong) NSString *navTitle; 14 | @property (nonatomic, strong) NSString *url; 15 | 16 | - (void)scrollToTop; 17 | 18 | @end 19 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJHotAndLikeViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // QJHotAndLikeViewController.h 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2017/5/17. 6 | // Copyright © 2017年 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import "QJViewController.h" 10 | 11 | @interface QJHotAndLikeViewController : QJViewController 12 | 13 | - (void)scrollToTop; 14 | 15 | @end 16 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJImageCollectionViewCell.h: -------------------------------------------------------------------------------- 1 | // 2 | // QJImageCollectionViewCell.h 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2017/5/31. 6 | // Copyright © 2017年 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface QJImageCollectionViewCell : UICollectionViewCell 12 | 13 | @property (weak, nonatomic) IBOutlet UIImageView *thumbImageView; 14 | 15 | @end 16 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJImageCollectionViewCell.m: -------------------------------------------------------------------------------- 1 | // 2 | // QJImageCollectionViewCell.m 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2017/5/31. 6 | // Copyright © 2017年 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import "QJImageCollectionViewCell.h" 10 | 11 | @implementation QJImageCollectionViewCell 12 | 13 | - (void)awakeFromNib { 14 | [super awakeFromNib]; 15 | self.thumbImageView.layer.cornerRadius = 5.f; 16 | self.thumbImageView.layer.borderWidth = 0.5f; 17 | self.thumbImageView.layer.borderColor = [UIColor groupTableViewBackgroundColor].CGColor; 18 | self.thumbImageView.layer.masksToBounds = YES; 19 | } 20 | 21 | @end 22 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJLabel.h: -------------------------------------------------------------------------------- 1 | // 2 | // QJLabel.h 3 | // EHenTaiViewer 4 | // 5 | // Created by zedmacbook on 2018/6/28. 6 | // Copyright © 2018年 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | IB_DESIGNABLE 12 | @interface QJLabel : UILabel 13 | 14 | /** 设置内边距自适应高度 */ 15 | @property (nonatomic, assign, getter=isCusRadiusInsets) IBInspectable BOOL cusRadiusInsets; 16 | 17 | 18 | @end 19 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJLabel.m: -------------------------------------------------------------------------------- 1 | // 2 | // QJLabel.m 3 | // EHenTaiViewer 4 | // 5 | // Created by zedmacbook on 2018/6/28. 6 | // Copyright © 2018年 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import "QJLabel.h" 10 | 11 | @interface QJLabel() 12 | 13 | @property (nonatomic, assign) UIEdgeInsets edgeInsets; 14 | 15 | @end 16 | 17 | @implementation QJLabel 18 | 19 | - (void)setCusRadiusInsets:(BOOL)cusRadiusInsets { 20 | _cusRadiusInsets = cusRadiusInsets; 21 | 22 | self.edgeInsets = UIEdgeInsetsMake(2, 8 + 2, 2, 8 + 2); 23 | [self sizeToFit]; 24 | 25 | // CGRect rect = self.frame; 26 | self.layer.cornerRadius = 5.f; 27 | self.layer.masksToBounds = YES; 28 | } 29 | 30 | - (CGRect)textRectForBounds:(CGRect)bounds limitedToNumberOfLines:(NSInteger)numberOfLines { 31 | UIEdgeInsets insets = self.edgeInsets; 32 | CGRect rect = [super textRectForBounds:UIEdgeInsetsInsetRect(bounds, insets) limitedToNumberOfLines:numberOfLines]; 33 | rect.origin.x -= insets.left; 34 | rect.origin.y -= insets.top; 35 | rect.size.width += (insets.left + insets.right); 36 | rect.size.height += (insets.top + insets.bottom); 37 | return rect; 38 | } 39 | 40 | - (void)drawRect:(CGRect)rect { 41 | [super drawRect:UIEdgeInsetsInsetRect(rect, self.edgeInsets)]; 42 | } 43 | 44 | 45 | @end 46 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJLanguageOutCell.h: -------------------------------------------------------------------------------- 1 | // 2 | // QJLanguageOutCell.h 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2017/8/31. 6 | // Copyright © 2017年 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @class QJSettingLanguageItem; 12 | 13 | @protocol QJLanguageOutCellDelagate 14 | 15 | @optional 16 | - (void)didClickBtn; 17 | 18 | @end 19 | 20 | @interface QJLanguageOutCell : UITableViewCell 21 | 22 | @property (weak, nonatomic) iddelegate; 23 | @property (nonatomic, strong) QJSettingLanguageItem *model; 24 | 25 | @end 26 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJLanguageOutHeadView.h: -------------------------------------------------------------------------------- 1 | // 2 | // QJLanguageOutHeadView.h 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2017/8/31. 6 | // Copyright © 2017年 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface QJLanguageOutHeadView : UITableViewCell 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJLanguageOutHeadView.m: -------------------------------------------------------------------------------- 1 | // 2 | // QJLanguageOutHeadView.m 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2017/8/31. 6 | // Copyright © 2017年 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import "QJLanguageOutHeadView.h" 10 | 11 | @implementation QJLanguageOutHeadView 12 | 13 | - (void)awakeFromNib { 14 | [super awakeFromNib]; 15 | // Initialization code 16 | } 17 | 18 | - (void)setSelected:(BOOL)selected animated:(BOOL)animated { 19 | [super setSelected:selected animated:animated]; 20 | 21 | // Configure the view for the selected state 22 | } 23 | 24 | @end 25 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJLanguageOutViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // QJLanguageOutViewController.h 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2017/8/31. 6 | // Copyright © 2017年 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import "QJViewController.h" 10 | 11 | @class QJSettingItem; 12 | 13 | @interface QJLanguageOutViewController : QJViewController 14 | 15 | @property (nonatomic, strong) QJSettingItem *model; 16 | 17 | @end 18 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJLikeButton.h: -------------------------------------------------------------------------------- 1 | // 2 | // QJLikeButton.h 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2017/12/1. 6 | // Copyright © 2017年 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | typedef NS_ENUM(NSInteger, QJLikeButtonState) { 12 | QJLikeButtonStateUnLike, 13 | QJLikeButtonStateLike, 14 | QJLikeButtonStateLoading, 15 | }; 16 | 17 | @interface QJLikeButton : UIButton 18 | 19 | @property (nonatomic, assign) QJLikeButtonState likeState; 20 | 21 | @end 22 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJLikeSearchBar.h: -------------------------------------------------------------------------------- 1 | // 2 | // QJLikeSearchBar.h 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2017/12/15. 6 | // Copyright © 2017年 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface QJLikeSearchBar : UIView 12 | 13 | @property (weak, nonatomic) IBOutlet UITextField *searchTextF; 14 | 15 | @end 16 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJLikeSearchBar.m: -------------------------------------------------------------------------------- 1 | // 2 | // QJLikeSearchBar.m 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2017/12/15. 6 | // Copyright © 2017年 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import "QJLikeSearchBar.h" 10 | 11 | @interface QJLikeSearchBar () 12 | 13 | @property (weak, nonatomic) IBOutlet UIView *searchBgView; 14 | 15 | @end 16 | 17 | @implementation QJLikeSearchBar 18 | 19 | - (void)awakeFromNib { 20 | [super awakeFromNib]; 21 | self.searchBgView.layer.cornerRadius = 18.f; 22 | } 23 | 24 | @end 25 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJListCell.h: -------------------------------------------------------------------------------- 1 | // 2 | // QJListCell.h 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2017/5/19. 6 | // Copyright © 2017年 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @class QJListItem; 12 | 13 | @interface QJListCell : UITableViewCell 14 | 15 | - (void)refreshUI:(QJListItem *)item; 16 | 17 | @end 18 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJListItem.h: -------------------------------------------------------------------------------- 1 | // 2 | // QJListItem.h 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2017/5/19. 6 | // Copyright © 2017年 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | @interface QJListItem : NSObject 13 | 14 | @property (nonatomic, strong) NSString *url;//链接 15 | @property (nonatomic, strong) NSString *thumb;//封面 16 | @property (nonatomic, strong) NSString *title;//标题 17 | @property (nonatomic, strong) NSString *title_jpn;//日语标题 18 | @property (nonatomic, strong) NSString *similarKey;//类似画廊关键字 19 | @property (nonatomic, strong) NSString *category;//分类 20 | @property (nonatomic, strong) UIColor *categoryColor;//分类颜色 21 | @property (nonatomic, strong) NSString *language;//语言 22 | @property (nonatomic, strong) NSString *uploader;//上传人 23 | @property (nonatomic, assign) NSInteger filecount;//文件数 24 | @property (nonatomic, strong) NSString *filesize;//文件大小 25 | @property (nonatomic, assign) CGFloat rating;//评分 26 | @property (nonatomic, strong) NSString *posted;//上传时间 27 | @property (nonatomic, assign) BOOL expunged;//是否被删除???? 28 | @property (nonatomic, assign) NSInteger torrentcount;//种子数 29 | @property (nonatomic, strong) NSArray *tags;//tag数组 30 | @property (strong, nonatomic) NSArray *chTags; // 中文数组 31 | @property (strong, nonatomic) NSArray *listTags; // 列表中显示的tag 32 | @property (strong, nonatomic) NSArray *listChTags; 33 | @property (nonatomic, assign) NSInteger page;//所在的页码 34 | //下面两个为接口请求所需的参数 35 | @property (nonatomic, strong) NSString *gid; 36 | @property (nonatomic, strong) NSString *token; 37 | 38 | - (instancetype)initWithDict:(NSDictionary *)dict classifyArr:(NSArray *)classifyArr colorArr:(NSArray *)colorArr; 39 | 40 | @end 41 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJListTableView.h: -------------------------------------------------------------------------------- 1 | // 2 | // QJListTableView.h 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2017/5/25. 6 | // Copyright © 2017年 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface QJListTableView : UITableView 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJListTableView.m: -------------------------------------------------------------------------------- 1 | // 2 | // QJListTableView.m 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2017/5/25. 6 | // Copyright © 2017年 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import "QJListTableView.h" 10 | #import "QJListCell.h" 11 | 12 | @implementation QJListTableView 13 | 14 | - (instancetype)init 15 | { 16 | self = [super init]; 17 | if (self) { 18 | self.translatesAutoresizingMaskIntoConstraints = NO; 19 | self.rowHeight = UITableViewAutomaticDimension; 20 | self.estimatedRowHeight = UIScreenHeight(); 21 | self.tableFooterView = [UIView new]; 22 | [self registerNib:[UINib nibWithNibName:NSStringFromClass([QJListCell class]) bundle:nil] forCellReuseIdentifier:NSStringFromClass([QJListCell class])]; 23 | } 24 | return self; 25 | } 26 | 27 | @end 28 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJLoginViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // QJLoginViewController.h 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2017/5/22. 6 | // Copyright © 2017年 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import "QJViewController.h" 10 | 11 | @interface QJLoginViewController : QJViewController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJMainSettingListCell.h: -------------------------------------------------------------------------------- 1 | // 2 | // QJMainSettingListCell.h 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2018/9/2. 6 | // Copyright © 2018 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface QJMainSettingListCell : UITableViewCell 14 | 15 | @property (weak, nonatomic) IBOutlet UILabel *funcNameLabel; 16 | 17 | @end 18 | 19 | NS_ASSUME_NONNULL_END 20 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJMainSettingListCell.m: -------------------------------------------------------------------------------- 1 | // 2 | // QJMainSettingListCell.m 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2018/9/2. 6 | // Copyright © 2018 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import "QJMainSettingListCell.h" 10 | 11 | @interface QJMainSettingListCell () 12 | 13 | @property (weak, nonatomic) IBOutlet UIView *contentBgView; 14 | 15 | 16 | @end 17 | 18 | @implementation QJMainSettingListCell 19 | 20 | - (void)awakeFromNib { 21 | [super awakeFromNib]; 22 | // self.contentBgView.layer.cornerRadius = 5.f; 23 | // self.contentBgView.layer.borderWidth = 1.f; 24 | // self.contentBgView.layer.borderColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0.1f].CGColor; 25 | // self.contentBgView.clipsToBounds = YES; 26 | } 27 | 28 | - (void)setSelected:(BOOL)selected animated:(BOOL)animated { 29 | [super setSelected:selected animated:animated]; 30 | } 31 | 32 | @end 33 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJMainSplitViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // QJMainSplitViewController.h 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2019/5/6. 6 | // Copyright © 2019 kayanouriko. All rights reserved. 7 | // 8 | 9 | // 第一个SplitViewController,控制着边缘按钮和内容 10 | 11 | #import 12 | 13 | NS_ASSUME_NONNULL_BEGIN 14 | 15 | @interface QJMainSplitViewController : UISplitViewController 16 | 17 | @property(nonatomic, assign) CGFloat maximumPrimaryColumnWidth NS_AVAILABLE_IOS(8_0); 18 | 19 | @end 20 | 21 | NS_ASSUME_NONNULL_END 22 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJMainSplitViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // QJMainSplitViewController.m 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2019/5/6. 6 | // Copyright © 2019 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import "QJMainSplitViewController.h" 10 | 11 | @interface QJMainSplitViewController () 12 | 13 | @end 14 | 15 | @implementation QJMainSplitViewController 16 | 17 | @dynamic maximumPrimaryColumnWidth; 18 | 19 | - (void)viewDidLoad { 20 | [super viewDidLoad]; 21 | self.preferredDisplayMode = UISplitViewControllerDisplayModeAllVisible; 22 | 23 | self.maximumPrimaryColumnWidth = 80.f; 24 | self.splitViewController.maximumPrimaryColumnWidth = self.maximumPrimaryColumnWidth; 25 | } 26 | 27 | @end 28 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJMangaImageDownloader.h: -------------------------------------------------------------------------------- 1 | // 2 | // QJMangaImageDownloader.h 3 | // EHenTaiViewer 4 | // 5 | // Created by kayanouriko on 2018/6/12. 6 | // Copyright © 2018年 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @class QJMangaImageModel, QJMangaImageDownloader; 12 | 13 | @protocol QJMangaImageDownloaderDelegate 14 | 15 | @optional 16 | - (void)imageDownloadFinishWithLoader:(QJMangaImageDownloader *)loader; 17 | 18 | @end 19 | 20 | @interface QJMangaImageDownloader : NSOperation 21 | 22 | @property (nonatomic, strong) id delegate; 23 | // 持有的对象 24 | @property (nonatomic, strong) QJMangaImageModel *model; 25 | // indexPath 26 | @property (nonatomic, strong, readonly) NSIndexPath *indexPathInTableView; 27 | 28 | // 初始化 29 | - (instancetype)initWithModel:(QJMangaImageModel *)model atIndexPath:(NSIndexPath *)indexPath showKey:(NSString *)showkey gid:(NSString *)gid thdelegate:(id)delegate; 30 | 31 | - (void)cancelTask; 32 | 33 | @end 34 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJMangaImageModel.h: -------------------------------------------------------------------------------- 1 | // 2 | // QJMangaImageModel.h 3 | // EHenTaiViewer 4 | // 5 | // Created by kayanouriko on 2018/6/12. 6 | // Copyright © 2018年 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @class QJMangaImageModel; 12 | 13 | typedef void(^smallImageUrlBlock)(); 14 | 15 | @protocol QJMangaImageModelDelegate 16 | 17 | @optional 18 | - (void)imageDidDownloadFinshWithModel:(QJMangaImageModel *)model; 19 | - (void)imageDidDownloadFailWithModel:(QJMangaImageModel *)model; 20 | - (void)imageDidChangeRateWithModel:(QJMangaImageModel *)model; 21 | 22 | @end 23 | 24 | @interface QJMangaImageModel : NSObject 25 | 26 | @property (nonatomic, weak) id delegate; 27 | // 页码 28 | @property (nonatomic, assign) NSInteger page; 29 | // 大图url 30 | @property (nonatomic, strong) NSString *imageUrl; 31 | // 小图url 32 | @property (nonatomic, strong) NSString *smallImageUrl; 33 | // url 34 | @property (nonatomic, strong) NSString *url; 35 | // 已经下载的data,用于恢复下载用 36 | @property (nonatomic, strong) NSData *currentData; 37 | // 进度 38 | @property (nonatomic, assign) CGFloat rate; 39 | // image本地存储路径 40 | @property (nonatomic, strong) NSString *imagePath; 41 | // image缩放度为1的size 42 | @property (nonatomic, assign) CGSize size; 43 | // 是否有图片url 44 | @property (nonatomic, assign, readonly) BOOL hasImage; 45 | // 是否已经解析出图片url 46 | @property (nonatomic, assign, getter=isParser) BOOL parser; 47 | // 是否失败 48 | @property (nonatomic, assign, getter=isFailed) BOOL failed; 49 | // 获取smallurl 50 | - (void)getSmallUrlWithBlock:(smallImageUrlBlock)block; 51 | 52 | 53 | @end 54 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJMangaImageParser.h: -------------------------------------------------------------------------------- 1 | // 2 | // QJMangaImageParser.h 3 | // EHenTaiViewer 4 | // 5 | // Created by kayanouriko on 2018/6/13. 6 | // Copyright © 2018年 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @class QJMangaImageParser; 12 | 13 | @protocol QJMangaImageParserDelegate 14 | 15 | @optional 16 | /** 17 | 解析出来的图片url 18 | urls:链接数组 19 | beginIndex:图片起始下标 20 | */ 21 | - (void)imageUrlDidParserWithArray:(NSArray *)urls smallUrls:(NSArray *)smallUrls page:(NSInteger)page parser:(QJMangaImageParser *)parser; 22 | 23 | @end 24 | 25 | @interface QJMangaImageParser : NSOperation 26 | 27 | // 这里需要主要,operation的代理在main函数里面就被释放了,所以要强引用,这里还没有理解原理,待处理 28 | // 临时处理,将dalegate设置为强引用,在线程完成时,在外部把delegate置nil 29 | @property (nonatomic, strong) id delegate; 30 | 31 | - (instancetype)initWithGalleryUrl:(NSString *)url pageCount:(NSInteger)count theDelegate:(id)delegate; 32 | 33 | @end 34 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJMangaTorrentActivity.h: -------------------------------------------------------------------------------- 1 | // 2 | // QJMangaTorrentActivity.h 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2017/6/8. 6 | // Copyright © 2017年 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface QJMangaTorrentActivity : UIActivity 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJMangaTorrentActivity.m: -------------------------------------------------------------------------------- 1 | // 2 | // QJMangaTorrentActivity.m 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2017/6/8. 6 | // Copyright © 2017年 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import "QJMangaTorrentActivity.h" 10 | 11 | NSString *const UIActivityTypeQJTorrent = @"QJMangaTorrentActivity"; 12 | 13 | @implementation QJMangaTorrentActivity 14 | 15 | - (NSString *)activityType { 16 | return UIActivityTypeQJTorrent; 17 | } 18 | 19 | - (NSString *)activityTitle { 20 | return @"复制画廊磁力链接"; 21 | } 22 | 23 | - (UIImage *)activityImage { 24 | return [UIImage imageNamed:@"torrent"]; 25 | } 26 | 27 | @end 28 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJNetworkTool.h: -------------------------------------------------------------------------------- 1 | // 2 | // QJNetworkTool.h 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2017/5/24. 6 | // Copyright © 2017年 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface QJNetworkTool : NSObject 12 | 13 | + (QJNetworkTool *)shareTool; 14 | /* 15 | * 监听网络变化 16 | */ 17 | - (void)starNotifier; 18 | 19 | - (BOOL)isEnableNetwork;//判断是否有网 20 | - (BOOL)isEnableMobleNetwork;//判断是否为移动数据 21 | 22 | // 用于控制显示系统网络请求的菊花 23 | - (void)showNetworkActivity; 24 | - (void)hiddenNetworkActivity; 25 | 26 | @end 27 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJNewBrowerImageCell.h: -------------------------------------------------------------------------------- 1 | // 2 | // QJNewBrowerImageCell.h 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2018/4/6. 6 | // Copyright © 2018年 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @class QJMangaImageModel; 12 | 13 | @protocol QJNewBrowerImageCellDelegate 14 | 15 | @optional 16 | - (void)collectionViewShouldRefreshWithModel:(QJMangaImageModel *)model; 17 | - (void)scrollViewInCellWillBeginDragging; 18 | 19 | @end 20 | 21 | @interface QJNewBrowerImageCell : UICollectionViewCell 22 | 23 | /** QJNewBrowerImageCell Delegate */ 24 | @property (nonatomic, weak) id delegate; 25 | /** model */ 26 | @property (nonatomic, strong) QJMangaImageModel *model; 27 | 28 | @end 29 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJNewBrowerViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // QJNewBrowerViewController.h 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2017/12/7. 6 | // Copyright © 2017年 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import "QJViewController.h" 10 | 11 | @interface QJNewBrowerViewController : QJViewController 12 | 13 | @property (nonatomic, strong) NSString *mangaName; 14 | @property (nonatomic, strong) NSString *showkey; 15 | @property (nonatomic, strong) NSString *url; 16 | @property (nonatomic, strong) NSString *gid; 17 | @property (nonatomic, assign) NSInteger count; 18 | @property (nonatomic, strong) NSArray *imageUrls; 19 | @property (nonatomic, strong) NSArray *smallImageUrls; 20 | 21 | @end 22 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJNewCommentCell.h: -------------------------------------------------------------------------------- 1 | // 2 | // QJNewCommentCell.h 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2017/11/23. 6 | // Copyright © 2017年 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @class QJNewCommentCell; 12 | 13 | @protocol QJNewCommentCellDelegate 14 | 15 | @optional 16 | - (void)didClickMoreBtnWithCell:(QJNewCommentCell *)cell; 17 | 18 | @end 19 | 20 | @interface QJNewCommentCell : UICollectionViewCell 21 | 22 | @property (weak, nonatomic) iddelegate; 23 | @property (nonatomic, strong) NSIndexPath *indexPath; 24 | - (void)refreshUIWithDict:(NSDictionary *)dict; 25 | 26 | @end 27 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJNewInfoViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // QJNewInfoViewController.h 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2017/11/20. 6 | // Copyright © 2017年 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import "QJViewController.h" 10 | 11 | @class QJListItem; 12 | 13 | @interface QJNewInfoViewController : QJViewController 14 | 15 | @property (nonatomic, strong) QJListItem *model; 16 | 17 | @end 18 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJNewSearchViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // QJNewSearchViewController.h 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2019/3/26. 6 | // Copyright © 2019 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import "QJViewController.h" 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | typedef NS_ENUM(NSInteger, QJNewSearchViewControllerType) { 14 | QJNewSearchViewControllerTypeSearch, // 普通搜索 15 | QJNewSearchViewControllerTypeFavorites, // 收藏夹搜索 16 | QJNewSearchViewControllerTypeTag, // 标签跳转 17 | QJNewSearchViewControllerTypeWatched, // 关注搜索 18 | }; 19 | 20 | @interface QJNewSearchViewController : QJViewController 21 | 22 | @property (strong, nonatomic) NSString *searchKey; // 搜索关键词 23 | @property (strong, nonatomic) NSMutableArray *settings; 24 | @property (assign, nonatomic) QJNewSearchViewControllerType type; 25 | @property (strong, nonatomic) UINavigationController *nav; 26 | 27 | // 父类触发了搜索按钮的方法 28 | - (void)viewsShouldSearchBarSearchButtonClicked:(UISearchBar *)searchBar; 29 | // 父类触发了筛选按钮的方法 30 | - (void)viewsShouldSearchBarBookmarkButtonClicked:(UISearchBar *)searchBar; 31 | 32 | @end 33 | 34 | NS_ASSUME_NONNULL_END 35 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJNowViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // QJNowViewController.h 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2017/9/20. 6 | // Copyright © 2017年 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import "QJViewController.h" 10 | 11 | @interface QJNowViewController : QJViewController 12 | 13 | - (void)scrollToTop; 14 | 15 | @end 16 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJOrientationManager.h: -------------------------------------------------------------------------------- 1 | // 2 | // QJOrientationManager.h 3 | // EHenTaiViewer 4 | // 5 | // Created by kayanouriko on 2018/6/26. 6 | // Copyright © 2018年 kayanouriko. All rights reserved. 7 | // 8 | 9 | /** 10 | 该类主要控制一些杂项设置 11 | */ 12 | 13 | #import 14 | 15 | @interface QJOrientationManager : NSObject 16 | 17 | /** 通过配置文件改变目前的屏幕方向 */ 18 | + (void)changeOrientationFromSetting; 19 | 20 | /** 通过配置文件获取屏幕方向并转换为seg对应的index 21 | @return seg对应的index, 0. 竖屏 1. 横屏 2. 跟随系统 22 | */ 23 | + (NSInteger)getOrientationSegSelected; 24 | 25 | /** 恢复竖屏方向 */ 26 | + (void)recoverPortraitOrienttation; 27 | 28 | /** 根据seg的selectedIndex修改配置文件并修改屏幕方向 29 | @param selectedIndex seg的选中index 30 | */ 31 | + (void)setOrientationWithSelected:(NSInteger)selectedIndex; 32 | 33 | /** 通过配置文件获取滚动方向并转换为seg对应的index 34 | @return seg对应的index, 0. 水平滚动 1. 上下滚动 35 | */ 36 | + (NSInteger)getDiretionSegSelected; 37 | 38 | /** 根据seg的selectedIndex修改配置文件并修改滚动方向 39 | @param selectedIndex seg的选中index 40 | */ 41 | + (void)setDiretionWithSelected:(NSInteger)selectedIndex; 42 | 43 | /** 保存目标图片到系统相册 44 | @param imagePath 沙盒图片路径 45 | */ 46 | + (void)saveImageToSystemThumbWithImagePath:(NSString *)imagePath; 47 | 48 | @end 49 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJPasteManager.h: -------------------------------------------------------------------------------- 1 | // 2 | // QJPasteManager.h 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2019/4/25. 6 | // Copyright © 2019 kayanouriko. All rights reserved. 7 | // 8 | 9 | // 该类主要是检测粘贴板里面的内容 10 | 11 | #import 12 | 13 | NS_ASSUME_NONNULL_BEGIN 14 | 15 | @interface QJPasteManager : NSObject 16 | 17 | + (instancetype)sharedInstance; 18 | 19 | // 检测剪切板里面的url 20 | - (void)checkInfoFromPasteBoard; 21 | // 通过外部传入的url识别画廊 22 | - (BOOL)checkInfoWithUrl:(NSString *)url; 23 | 24 | @end 25 | 26 | NS_ASSUME_NONNULL_END 27 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJProtectTool.h: -------------------------------------------------------------------------------- 1 | // 2 | // QJProtectTool.h 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2017/5/25. 6 | // Copyright © 2017年 kayanouriko. All rights reserved. 7 | // 8 | 9 | //感谢maltsugar,终于明白了系统密码调用的方法 10 | 11 | #import 12 | 13 | typedef NS_ENUM(NSInteger, QJProtectToolStatus) { 14 | QJProtectToolStatusSuccess,//成功 15 | QJProtectToolStatusCannel,//用户点击了退出 16 | }; 17 | 18 | typedef void(^CompletBlock)(QJProtectToolStatus status); 19 | 20 | @interface QJProtectTool : NSObject 21 | 22 | + (QJProtectTool *)shareTool; 23 | 24 | - (BOOL)isEnableTouchID; 25 | - (void)showTouchID:(CompletBlock)completion; 26 | 27 | @end 28 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJProtectTool.m: -------------------------------------------------------------------------------- 1 | // 2 | // QJProtectTool.m 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2017/5/25. 6 | // Copyright © 2017年 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import "QJProtectTool.h" 10 | #import 11 | 12 | @implementation QJProtectTool 13 | 14 | + (QJProtectTool *)shareTool { 15 | static QJProtectTool *sharedInstance = nil; 16 | static dispatch_once_t onceToken; 17 | dispatch_once(&onceToken, ^{ 18 | sharedInstance = [QJProtectTool new]; 19 | }); 20 | return sharedInstance; 21 | } 22 | 23 | - (BOOL)isEnableTouchID { 24 | LAContext *laContext = [LAContext new]; 25 | return [laContext canEvaluatePolicy:kLAPolicyDeviceOwnerAuthenticationWithBiometrics error:NULL]; 26 | } 27 | 28 | //是否支持系统密码验证 29 | - (BOOL)isSupportDeviceOwnerAuth { 30 | if (@available(iOS 9.0, *)) { 31 | LAContext *laContext = [LAContext new]; 32 | return [laContext canEvaluatePolicy:LAPolicyDeviceOwnerAuthentication error:NULL]; 33 | } else { 34 | return NO; 35 | } 36 | return NO; 37 | } 38 | 39 | - (void)showTouchID:(CompletBlock)completion { 40 | LAContext *context = [LAContext new]; 41 | NSString *des = @"验证用于打开应用"; 42 | LAPolicy policy = LAPolicyDeviceOwnerAuthenticationWithBiometrics; 43 | if (@available(iOS 9.0, *)) { 44 | policy = LAPolicyDeviceOwnerAuthentication; 45 | } 46 | [context evaluatePolicy:policy localizedReason:des reply:^(BOOL success, NSError *error) { 47 | dispatch_async(dispatch_get_main_queue(), ^{ 48 | if (success) { 49 | completion(QJProtectToolStatusSuccess); 50 | } else { 51 | completion(QJProtectToolStatusCannel); 52 | } 53 | }); 54 | }]; 55 | } 56 | 57 | @end 58 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJRankingHeadInfoCell.h: -------------------------------------------------------------------------------- 1 | // 2 | // QJRankingHeadInfoCell.h 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2017/12/15. 6 | // Copyright © 2017年 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @class QJListItem; 12 | 13 | @interface QJRankingHeadInfoCell : UICollectionViewCell 14 | 15 | @property (nonatomic, assign) NSInteger index; 16 | @property (nonatomic, strong) QJListItem *model; 17 | 18 | @end 19 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJRankingInfoCell.h: -------------------------------------------------------------------------------- 1 | // 2 | // QJRankingInfoCell.h 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2017/12/14. 6 | // Copyright © 2017年 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @class QJListItem; 12 | 13 | @interface QJRankingInfoCell : UICollectionViewCell 14 | 15 | @property (nonatomic, strong) QJListItem *model; 16 | @property (weak, nonatomic) IBOutlet UIView *underLine; 17 | 18 | @end 19 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJRankingInfoCell.m: -------------------------------------------------------------------------------- 1 | // 2 | // QJRankingInfoCell.m 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2017/12/14. 6 | // Copyright © 2017年 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import "QJRankingInfoCell.h" 10 | #import "QJListItem.h" 11 | 12 | @interface QJRankingInfoCell () 13 | 14 | @property (weak, nonatomic) IBOutlet UIImageView *leftImageView; 15 | @property (weak, nonatomic) IBOutlet UILabel *titleNameLabel; 16 | @property (weak, nonatomic) IBOutlet UILabel *catgoryLabel; 17 | @property (weak, nonatomic) IBOutlet UILabel *langueLabel; 18 | 19 | @end 20 | 21 | @implementation QJRankingInfoCell 22 | 23 | - (void)awakeFromNib { 24 | [super awakeFromNib]; 25 | self.backgroundColor = [UIColor whiteColor]; 26 | 27 | self.leftImageView.layer.cornerRadius = 5.f; 28 | self.catgoryLabel.layer.cornerRadius = 3.f; 29 | self.catgoryLabel.clipsToBounds = YES; 30 | } 31 | 32 | - (void)setModel:(QJListItem *)model { 33 | _model = model; 34 | 35 | self.titleNameLabel.text = ([QJGlobalInfo isExHentaiTitleJnMode] && _model.title_jpn.length) ? _model.title_jpn : _model.title; 36 | self.catgoryLabel.text = [NSString stringWithFormat:@" %@ ",_model.category]; 37 | self.catgoryLabel.backgroundColor = _model.categoryColor; 38 | self.langueLabel.text = _model.language; 39 | [self.leftImageView yy_setImageWithURL:[NSURL URLWithString:_model.thumb] options:YYWebImageOptionProgressiveBlur | YYWebImageOptionSetImageWithFadeAnimation | YYWebImageOptionHandleCookies]; 40 | } 41 | 42 | @end 43 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJRankingUploadCell.h: -------------------------------------------------------------------------------- 1 | // 2 | // QJRankingUploadCell.h 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2017/12/18. 6 | // Copyright © 2017年 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @class QJToplistUploaderItem; 12 | 13 | @interface QJRankingUploadCell : UICollectionViewCell 14 | 15 | - (void)refreshCellWithModel:(QJToplistUploaderItem *)model index:(NSInteger)index isHidden:(BOOL)isHidden; 16 | 17 | @end 18 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJRankingViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // QJRankingViewController.h 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2017/12/14. 6 | // Copyright © 2017年 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import "QJViewController.h" 10 | 11 | @interface QJRankingViewController : QJViewController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJScrollView.h: -------------------------------------------------------------------------------- 1 | // 2 | // QJScrollView.h 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2017/7/28. 6 | // Copyright © 2017年 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface QJScrollView : UIScrollView 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJScrollView.m: -------------------------------------------------------------------------------- 1 | // 2 | // QJScrollView.m 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2017/7/28. 6 | // Copyright © 2017年 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import "QJScrollView.h" 10 | 11 | @interface QJScrollView () 12 | 13 | @end 14 | 15 | @implementation QJScrollView 16 | 17 | -(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { 18 | if(gestureRecognizer.state != 0) { 19 | return YES; 20 | }else { 21 | return NO; 22 | } 23 | } 24 | 25 | @end 26 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJSearchBar.h: -------------------------------------------------------------------------------- 1 | // 2 | // QJSearchBar.h 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2017/11/6. 6 | // Copyright © 2017年 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @protocol QJSearchBarDelagate 12 | 13 | @optional 14 | - (void)didClickSiftBtn; 15 | 16 | @end 17 | 18 | @interface QJSearchBar : UIView 19 | 20 | @property (weak, nonatomic) iddelegate; 21 | @property (weak, nonatomic) IBOutlet UITextField *searchTextF; 22 | 23 | @end 24 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJSearchBar.m: -------------------------------------------------------------------------------- 1 | // 2 | // QJSearchBar.m 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2017/11/6. 6 | // Copyright © 2017年 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import "QJSearchBar.h" 10 | 11 | @interface QJSearchBar () 12 | 13 | @property (weak, nonatomic) IBOutlet UIView *searchBgView; 14 | 15 | - (IBAction)btnAction:(UIButton *)sender; 16 | 17 | @end 18 | 19 | @implementation QJSearchBar 20 | 21 | - (void)awakeFromNib { 22 | [super awakeFromNib]; 23 | self.searchBgView.layer.cornerRadius = 18.f; 24 | } 25 | 26 | - (IBAction)btnAction:(UIButton *)sender { 27 | if (self.delegate != nil && [self.delegate respondsToSelector:@selector(didClickSiftBtn)]) { 28 | [self.delegate didClickSiftBtn]; 29 | } 30 | } 31 | 32 | @end 33 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJSearchClassifyCell.h: -------------------------------------------------------------------------------- 1 | // 2 | // QJSearchClassifyCell.h 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2017/5/18. 6 | // Copyright © 2017年 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface QJSearchClassifyCell : UITableViewCell 12 | 13 | - (void)saveButtonState; 14 | 15 | @end 16 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJSearchController.h: -------------------------------------------------------------------------------- 1 | // 2 | // QJSearchController.h 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2019/4/16. 6 | // Copyright © 2019 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface QJSearchController : UISearchController 14 | 15 | @end 16 | 17 | NS_ASSUME_NONNULL_END 18 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJSearchController.m: -------------------------------------------------------------------------------- 1 | // 2 | // QJSearchController.m 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2019/4/16. 6 | // Copyright © 2019 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import "QJSearchController.h" 10 | 11 | @interface QJSearchController () 12 | 13 | @end 14 | 15 | @implementation QJSearchController 16 | 17 | - (instancetype)initWithSearchResultsController:(UIViewController *)searchResultsController { 18 | self = [super initWithSearchResultsController:searchResultsController]; 19 | if (self) { 20 | [self.searchBar setImage:[UIImage imageNamed:@"sift"] forSearchBarIcon:UISearchBarIconBookmark state:UIControlStateNormal]; 21 | self.searchBar.enablesReturnKeyAutomatically = NO; // 设置无内容的时候可以点击搜索按钮 22 | } 23 | return self; 24 | } 25 | 26 | - (void)viewDidLoad { 27 | [super viewDidLoad]; 28 | // Do any additional setup after loading the view. 29 | } 30 | 31 | @end 32 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJSearchSettingSubViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // QJSearchSettingSubViewController.h 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2019/3/30. 6 | // Copyright © 2019 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import "QJViewController.h" 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | typedef NS_ENUM(NSInteger, QJSearchSettingSubViewControllerType) { 14 | QJSearchSettingSubViewControllerTypeNormal, 15 | QJSearchSettingSubViewControllerTypeSift, 16 | }; 17 | 18 | @interface QJSearchSettingSubViewController : QJViewController 19 | 20 | @property (assign, nonatomic) QJSearchSettingSubViewControllerType type; 21 | @property (strong, nonatomic) NSArray *settings; // 高级筛选 22 | 23 | - (NSArray *)saveAndGetSettingInfo; 24 | 25 | @end 26 | 27 | NS_ASSUME_NONNULL_END 28 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJSearchSettingTagSearchViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // QJSearchSettingTagSearchViewController.h 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2019/4/1. 6 | // Copyright © 2019 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import "QJViewController.h" 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @class QJSearchSettingTagSearchViewController; 14 | 15 | @protocol QJSearchSettingTagSearchViewControllerDelegate 16 | 17 | @optional 18 | - (void)tagSearchController:(QJSearchSettingTagSearchViewController *)controller tagName:(NSString *)tagName indexPath:(NSIndexPath *)indexPath; 19 | 20 | @end 21 | 22 | @interface QJSearchSettingTagSearchViewController : QJViewController 23 | 24 | @property (strong, nonatomic) NSIndexPath *indexPath; 25 | @property (weak, nonatomic) iddelegate; 26 | 27 | @end 28 | 29 | NS_ASSUME_NONNULL_END 30 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJSearchSettingViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // QJSearchSettingViewController.h 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2019/3/30. 6 | // Copyright © 2019 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import "QJViewController.h" 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @class QJSearchSettingViewController; 14 | 15 | @protocol QJSearchSettingViewControllerDelegate 16 | 17 | @optional 18 | - (void)settingController:(QJSearchSettingViewController *)settingController changeSiftSettingWithArr:(NSArray *)settings; 19 | 20 | @end 21 | 22 | @interface QJSearchSettingViewController : QJViewController 23 | 24 | @property (weak, nonatomic) iddelegate; 25 | @property (strong, nonatomic) NSArray *settings; // 高级筛选 26 | 27 | @end 28 | 29 | NS_ASSUME_NONNULL_END 30 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJSearchSiftHeadView.h: -------------------------------------------------------------------------------- 1 | // 2 | // QJSearchSiftHeadView.h 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2019/3/26. 6 | // Copyright © 2019 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @class QJSearchSiftHeadView; 14 | 15 | @protocol QJSearchSiftHeadViewDelegate 16 | 17 | @optional 18 | // 点击标签按钮 19 | - (void)didClickTagActionWithHeadView:(QJSearchSiftHeadView *)headView index:(NSInteger)index; 20 | 21 | @end 22 | 23 | @interface QJSearchSiftHeadView : UIVisualEffectView 24 | 25 | @property (strong, nonatomic) NSArray *keys; 26 | @property (weak, nonatomic) iddelegate; 27 | 28 | - (instancetype)initWithKeys:(NSArray *)keys theDelegate:(id)delegate; 29 | 30 | 31 | @end 32 | 33 | NS_ASSUME_NONNULL_END 34 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJSearchSoreCell.h: -------------------------------------------------------------------------------- 1 | // 2 | // QJSearchSoreCell.h 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2017/5/18. 6 | // Copyright © 2017年 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface QJSearchSoreCell : UITableViewCell 12 | 13 | @property (weak, nonatomic) IBOutlet UISegmentedControl *segController; 14 | 15 | @end 16 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJSearchSoreCell.m: -------------------------------------------------------------------------------- 1 | // 2 | // QJSearchSoreCell.m 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2017/5/18. 6 | // Copyright © 2017年 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import "QJSearchSoreCell.h" 10 | 11 | @interface QJSearchSoreCell () 12 | 13 | - (IBAction)valueChange:(UISegmentedControl *)sender; 14 | 15 | @end 16 | 17 | @implementation QJSearchSoreCell 18 | 19 | - (void)awakeFromNib { 20 | [super awakeFromNib]; 21 | } 22 | 23 | - (void)setSelected:(BOOL)selected animated:(BOOL)animated { 24 | [super setSelected:selected animated:animated]; 25 | } 26 | 27 | - (IBAction)valueChange:(UISegmentedControl *)sender { 28 | NSObjSetForKey(@"SearchSore", @(sender.selectedSegmentIndex)); 29 | NSObjSynchronize(); 30 | } 31 | @end 32 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJSearchViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // QJSearchViewController.h 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2017/7/31. 6 | // Copyright © 2017年 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import "QJViewController.h" 10 | 11 | @class QJGalleryTagItem; 12 | 13 | @interface QJSearchViewController : QJViewController 14 | 15 | @property (nonatomic, strong) QJGalleryTagItem *model; 16 | 17 | - (void)scrollToTop; 18 | 19 | @end 20 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJSecretBgTool.h: -------------------------------------------------------------------------------- 1 | // 2 | // QJSecretBgTool.h 3 | // EHenTaiViewer 4 | // 5 | // Created by zedmacbook on 2018/7/3. 6 | // Copyright © 2018年 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface QJSecretBgTool : NSObject 12 | 13 | + (instancetype)sharedInstance; 14 | 15 | - (void)showSecretBackground; 16 | - (void)hiddenSecretBackground; 17 | 18 | @end 19 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJSettingHightOtherController.h: -------------------------------------------------------------------------------- 1 | // 2 | // QJSettingHightOtherController.h 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2017/9/1. 6 | // Copyright © 2017年 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import "QJViewController.h" 10 | 11 | @class QJSettingItem; 12 | 13 | @interface QJSettingHightOtherController : QJViewController 14 | 15 | @property (nonatomic, strong) QJSettingItem *model; 16 | 17 | @end 18 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJSettingItem.h: -------------------------------------------------------------------------------- 1 | // 2 | // QJSettingItem.h 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2017/8/24. 6 | // Copyright © 2017年 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @class TFHppleElement; 12 | 13 | @interface QJSettingLanguageCheckBoxItem : NSObject 14 | 15 | @property (nonatomic, strong) NSString *name;//名字 16 | @property (nonatomic, assign, getter=isChecked) BOOL checked;//是否被选中 17 | 18 | + (QJSettingLanguageCheckBoxItem *)creatModelWithHpple:(TFHppleElement *)hpple; 19 | 20 | @end 21 | 22 | @interface QJSettingLanguageItem : NSObject 23 | 24 | @property (nonatomic, strong) NSString *name;//语言名字 25 | @property (nonatomic, strong) NSArray *models;//是否被选中 26 | 27 | + (QJSettingLanguageItem *)creatModelWithHpple:(TFHppleElement *)hpple; 28 | 29 | @end 30 | 31 | @interface QJSettingCheckboxItem : NSObject 32 | 33 | @property (nonatomic, strong) NSString *title; 34 | @property (nonatomic, strong) NSString *name; 35 | @property (nonatomic, assign, getter=isChecked) BOOL checked; 36 | 37 | + (QJSettingCheckboxItem *)creatModelWithLabel:(TFHppleElement *)labelElement input:(TFHppleElement *)inputElement; 38 | 39 | @end 40 | 41 | @interface QJSettingItem : NSObject 42 | 43 | @property (nonatomic, strong) NSString *name;//名字 44 | @property (nonatomic, strong) NSArray *subModels; 45 | 46 | + (QJSettingItem *)creatModelWithHpple:(TFHppleElement *)hpple; 47 | 48 | @end 49 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJSettingListCell.h: -------------------------------------------------------------------------------- 1 | // 2 | // QJSettingListCell.h 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2017/8/24. 6 | // Copyright © 2017年 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @class QJSettingModel; 12 | 13 | @protocol QJSettingListCellDelagate 14 | 15 | @optional 16 | - (void)valueChangeWithSwitch:(UISwitch *)switchBtn model:(QJSettingModel *)model; 17 | 18 | @end 19 | 20 | @interface QJSettingListCell : UITableViewCell 21 | 22 | @property (weak, nonatomic) iddelegate; 23 | @property (nonatomic, strong) QJSettingModel *model; 24 | 25 | @end 26 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJSettingLoginCell.h: -------------------------------------------------------------------------------- 1 | // 2 | // QJSettingLoginCell.h 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2017/5/22. 6 | // Copyright © 2017年 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface QJSettingLoginCell : UITableViewCell 12 | 13 | - (void)updateUserInfo; 14 | 15 | @end 16 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJSettingLoginCell.m: -------------------------------------------------------------------------------- 1 | // 2 | // QJSettingLoginCell.m 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2017/5/22. 6 | // Copyright © 2017年 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import "QJSettingLoginCell.h" 10 | 11 | @interface QJSettingLoginCell () 12 | 13 | // 控件 14 | @property (weak, nonatomic) IBOutlet UILabel *loginNameLabel; 15 | @property (weak, nonatomic) IBOutlet UIImageView *leftImageView; 16 | @property (weak, nonatomic) IBOutlet UIView *leftImageBgView; // 封面阴影 17 | @property (weak, nonatomic) IBOutlet UILabel *desLabel; // 描述信息 18 | 19 | @end 20 | 21 | @implementation QJSettingLoginCell 22 | 23 | - (void)awakeFromNib { 24 | [super awakeFromNib]; 25 | 26 | self.leftImageBgView.layer.shadowColor = [UIColor blackColor].CGColor; 27 | self.leftImageBgView.layer.cornerRadius = 30.f; 28 | self.leftImageBgView.layer.shadowOffset = CGSizeMake(0, 0); 29 | self.leftImageBgView.layer.shadowOpacity = 0.1f; 30 | self.leftImageBgView.layer.shadowRadius = 4.f; 31 | } 32 | 33 | - (void)updateUserInfo { 34 | NSString *imageUrl = [QJGlobalInfo getExHentaiUserImageUrl]; 35 | if ([imageUrl containsString:@"http"]) { 36 | [self.leftImageView yy_setImageWithURL:[NSURL URLWithString:imageUrl] options:YYWebImageOptionProgressiveBlur | YYWebImageOptionSetImageWithFadeAnimation | YYWebImageOptionHandleCookies]; 37 | } 38 | else { 39 | self.leftImageView.image = [UIImage imageNamed:imageUrl]; 40 | } 41 | 42 | self.loginNameLabel.text = [QJGlobalInfo getExHentaiUserName]; 43 | self.desLabel.text = [QJGlobalInfo getExHentaiUserDes]; 44 | } 45 | 46 | - (void)setSelected:(BOOL)selected animated:(BOOL)animated { 47 | [super setSelected:selected animated:animated]; 48 | 49 | // Configure the view for the selected state 50 | } 51 | 52 | @end 53 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJSettingModel.h: -------------------------------------------------------------------------------- 1 | // 2 | // QJSettingModel.h 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2017/8/28. 6 | // Copyright © 2017年 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface QJSettingModel : NSObject 12 | 13 | @property (nonatomic, strong) NSString *title; 14 | @property (nonatomic, strong) NSString *subTitle; 15 | @property (nonatomic, strong) NSString *subTitleSelected; 16 | @property (nonatomic, strong) NSString *value; 17 | @property (nonatomic, strong) NSString *type; 18 | 19 | + (QJSettingModel *)creatModelWithDict:(NSDictionary *)dict; 20 | 21 | @end 22 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJSettingModel.m: -------------------------------------------------------------------------------- 1 | // 2 | // QJSettingModel.m 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2017/8/28. 6 | // Copyright © 2017年 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import "QJSettingModel.h" 10 | 11 | @implementation QJSettingModel 12 | 13 | + (QJSettingModel *)creatModelWithDict:(NSDictionary *)dict { 14 | QJSettingModel *model = [QJSettingModel new]; 15 | [model setValuesForKeysWithDictionary:dict]; 16 | return model; 17 | } 18 | 19 | - (instancetype)init 20 | { 21 | self = [super init]; 22 | if (self) { 23 | self.value = @""; 24 | } 25 | return self; 26 | } 27 | 28 | @end 29 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJSettingMyTagsCell.h: -------------------------------------------------------------------------------- 1 | // 2 | // QJSettingMyTagsCell.h 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2019/4/26. 6 | // Copyright © 2019 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @class QJTagModel; 14 | 15 | @interface QJSettingMyTagsCell : UITableViewCell 16 | 17 | @property (strong, nonatomic) QJTagModel *model; 18 | 19 | @end 20 | 21 | NS_ASSUME_NONNULL_END 22 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJSettingMyTagsController.h: -------------------------------------------------------------------------------- 1 | // 2 | // QJSettingMyTagsController.h 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2019/4/26. 6 | // Copyright © 2019 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import "QJViewController.h" 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface QJSettingMyTagsController : QJViewController 14 | 15 | @end 16 | 17 | NS_ASSUME_NONNULL_END 18 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJSettingMytagsEditController.h: -------------------------------------------------------------------------------- 1 | // 2 | // QJSettingMytagsEditController.h 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2019/4/26. 6 | // Copyright © 2019 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import "QJViewController.h" 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @class QJTagModel; 14 | 15 | @interface QJSettingMytagsEditController : QJViewController 16 | 17 | @property (strong, nonatomic) NSString *apikey; 18 | @property (strong, nonatomic) NSString *apiuid; 19 | @property (strong, nonatomic) QJTagModel *model; 20 | 21 | @end 22 | 23 | NS_ASSUME_NONNULL_END 24 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJSettingViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // QJSettingViewController.h 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2017/5/22. 6 | // Copyright © 2017年 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import "QJViewController.h" 10 | 11 | @interface QJSettingViewController : QJViewController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJSettingWatchSettingController.h: -------------------------------------------------------------------------------- 1 | // 2 | // QJSettingWatchSettingController.h 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2017/8/16. 6 | // Copyright © 2017年 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import "QJViewController.h" 10 | 11 | typedef NS_ENUM(NSInteger, QJSettingWatchSettingControllerType) { 12 | QJSettingWatchSettingControllerTypeEH, // 常规设置 13 | QJSettingWatchSettingControllerTypeHight, // 高级设置 14 | QJSettingWatchSettingControllerTypeMyTags, // 我的标签,占位用 15 | QJSettingWatchSettingControllerTypeSuggest, // 建议 16 | QJSettingWatchSettingControllerTypeAbout, // 关于 17 | QJSettingWatchSettingControllerTypeAboutReference, // 参考 18 | QJSettingWatchSettingControllerTypeAboutFrame, // 框架 19 | }; 20 | 21 | @interface QJSettingWatchSettingController : QJViewController 22 | 23 | @property (nonatomic, assign) QJSettingWatchSettingControllerType type; 24 | 25 | @end 26 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJTabBarController.h: -------------------------------------------------------------------------------- 1 | // 2 | // QJTabBarController.h 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2017/6/19. 6 | // Copyright © 2017年 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface QJTabBarController : UITabBarController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJTableViewCell.h: -------------------------------------------------------------------------------- 1 | // 2 | // QJTableViewCell.h 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2017/7/26. 6 | // Copyright © 2017年 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface QJTableViewCell : UITableViewCell 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJTableViewCell.m: -------------------------------------------------------------------------------- 1 | // 2 | // QJTableViewCell.m 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2017/7/26. 6 | // Copyright © 2017年 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import "QJTableViewCell.h" 10 | 11 | @implementation QJTableViewCell 12 | 13 | - (void)layoutSubviews { 14 | [super layoutSubviews]; 15 | 16 | } 17 | 18 | - (void)awakeFromNib { 19 | [super awakeFromNib]; 20 | } 21 | 22 | - (void)setSelected:(BOOL)selected animated:(BOOL)animated { 23 | [super setSelected:selected animated:animated]; 24 | 25 | // Configure the view for the selected state 26 | } 27 | 28 | @end 29 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJTagModel.h: -------------------------------------------------------------------------------- 1 | // 2 | // QJTagModel.h 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2019/4/26. 6 | // Copyright © 2019 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface QJTagModel : NSObject 14 | 15 | /** 16 | @"usertag": usertag, 17 | @"name": name, 18 | @"group": group, 19 | @"color": color, 20 | @"backgroundColor": backgroundColor, 21 | @"watched": watched, 22 | @"hidden": hidden, 23 | @"none": none, 24 | @"weight": weight, 25 | */ 26 | 27 | @property (strong, nonatomic) NSString *usertag; // id 28 | @property (strong, nonatomic) NSString *group; // 所属分组 29 | @property (strong, nonatomic) NSString *name; // 标签名字 30 | @property (strong, nonatomic) NSString *name_ch; // 标签名字_中文 31 | @property (strong, nonatomic) NSString *color; 32 | @property (strong, nonatomic) NSString *backgroundColor; 33 | @property (assign, nonatomic) BOOL isWatched; 34 | @property (assign, nonatomic) BOOL isHidden; 35 | @property (assign, nonatomic) BOOL isNone; 36 | @property (strong, nonatomic) NSString *weight; 37 | 38 | // 从api获取的model 39 | + (QJTagModel *)creatModelWithUserTag:(NSString *)usertag dict:(NSDictionary *)dict; 40 | // 从解析的html回调获取的model 41 | + (QJTagModel *)creatModelWithDict:(NSDictionary *)dict; 42 | 43 | @end 44 | 45 | @interface QJTagListModel : NSObject 46 | /** 47 | @"apiuid": apiuid, 48 | @"apikey": apikey, 49 | @"tagset_name": tagset_name, 50 | @"usertags": usertags, 51 | */ 52 | @property (strong, nonatomic) NSString *apiuid; 53 | @property (strong, nonatomic) NSString *apikey; 54 | @property (strong, nonatomic) NSString *tagset_name; 55 | @property (strong, nonatomic) NSArray *tags; 56 | 57 | + (QJTagListModel *)creatModelWithDict:(NSDictionary *)dict; 58 | 59 | @end 60 | 61 | NS_ASSUME_NONNULL_END 62 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJTagView.h: -------------------------------------------------------------------------------- 1 | // 2 | // QJTagView.h 3 | // ExReadViewer 4 | // 5 | // Created by 覃江 on 2016/12/31. 6 | // Copyright © 2016年 茅野瓜子. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @class QJTagView, QJGalleryTagItem; 12 | 13 | @protocol QJTagViewDelegate 14 | 15 | @optional 16 | - (void)tagView:(QJTagView *)tagView didClickTagWithModel:(QJGalleryTagItem *)model; 17 | 18 | @end 19 | 20 | @interface QJTagView : UIView 21 | 22 | @property (weak, nonatomic) iddelegate; 23 | /* array构成 24 | 数组分两个元素,第一个为分类名 第二个为tag模型,类名为QJCategoryButtonInfo 25 | */ 26 | - (void)refreshUI:(NSArray *)array isCN:(BOOL)isCN; 27 | 28 | @end 29 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJTipViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // QJTipViewController.h 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2017/11/30. 6 | // Copyright © 2017年 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface QJTipViewController : UIViewController 12 | 13 | - (void)startAnimateWithTip:(NSString *)tip; 14 | - (void)stopAnimateWithTip:(NSString *)tip; 15 | 16 | 17 | @end 18 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJToast.h: -------------------------------------------------------------------------------- 1 | // 2 | // QJToast.h 3 | // Nimingban 4 | // 5 | // Created by QinJ on 2017/6/30. 6 | // Copyright © 2017年 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface QJToast : UILabel 12 | 13 | + (void)showWithTip:(NSString *)tip; 14 | 15 | @end 16 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJTool.h: -------------------------------------------------------------------------------- 1 | // 2 | // QJTool.h 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2019/4/17. 6 | // Copyright © 2019 kayanouriko. All rights reserved. 7 | // 8 | 9 | // 存放一些工具方法 10 | 11 | #import 12 | 13 | NS_ASSUME_NONNULL_BEGIN 14 | 15 | @interface QJTool : NSObject 16 | 17 | // 是否为异形屏 18 | + (BOOL)isiPhoneXAfter; 19 | 20 | // 颜色获取 21 | + (UIColor *)colorWithHexString:(NSString *)color; 22 | 23 | // 获取当前控制器 24 | + (UIViewController *)visibleViewController; 25 | + (UINavigationController *)visibleNavigationController; 26 | 27 | @end 28 | 29 | NS_ASSUME_NONNULL_END 30 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJToplistUploaderItem.h: -------------------------------------------------------------------------------- 1 | // 2 | // QJToplistUploaderItem.h 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2017/8/2. 6 | // Copyright © 2017年 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface QJToplistUploaderItem : NSObject 12 | 13 | @property (nonatomic, strong) NSString *name; 14 | @property (nonatomic, strong) NSString *url; 15 | 16 | @end 17 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJToplistUploaderItem.m: -------------------------------------------------------------------------------- 1 | // 2 | // QJToplistUploaderItem.m 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2017/8/2. 6 | // Copyright © 2017年 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import "QJToplistUploaderItem.h" 10 | 11 | @implementation QJToplistUploaderItem 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJTorrentInfoCell.h: -------------------------------------------------------------------------------- 1 | // 2 | // QJTorrentInfoCell.h 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2017/6/9. 6 | // Copyright © 2017年 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @class QJTorrentItem; 12 | 13 | @interface QJTorrentInfoCell : UITableViewCell 14 | 15 | - (void)refreshUI:(QJTorrentItem *)item; 16 | 17 | @end 18 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJTorrentInfoCell.m: -------------------------------------------------------------------------------- 1 | // 2 | // QJTorrentInfoCell.m 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2017/6/9. 6 | // Copyright © 2017年 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import "QJTorrentInfoCell.h" 10 | #import "QJTorrentItem.h" 11 | 12 | @interface QJTorrentInfoCell () 13 | 14 | @property (weak, nonatomic) IBOutlet UILabel *nameLabel; 15 | @property (weak, nonatomic) IBOutlet UILabel *uploaderLabel; 16 | @property (weak, nonatomic) IBOutlet UILabel *postedLabel; 17 | @property (weak, nonatomic) IBOutlet UILabel *sizeLabel; 18 | @property (weak, nonatomic) IBOutlet UILabel *seedsLabel; 19 | @property (weak, nonatomic) IBOutlet UILabel *peersLabel; 20 | @property (weak, nonatomic) IBOutlet UILabel *downloadsLabel; 21 | 22 | @end 23 | 24 | @implementation QJTorrentInfoCell 25 | 26 | - (void)refreshUI:(QJTorrentItem *)item { 27 | self.nameLabel.text = item.name; 28 | self.uploaderLabel.text = item.uploader; 29 | self.postedLabel.text = item.posted; 30 | self.sizeLabel.text = item.size; 31 | self.seedsLabel.text = item.seeds; 32 | self.peersLabel.text = item.peers; 33 | self.downloadsLabel.text = item.downloads; 34 | } 35 | 36 | - (void)awakeFromNib { 37 | [super awakeFromNib]; 38 | // Initialization code 39 | } 40 | 41 | - (void)setSelected:(BOOL)selected animated:(BOOL)animated { 42 | [super setSelected:selected animated:animated]; 43 | 44 | // Configure the view for the selected state 45 | } 46 | 47 | @end 48 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJTorrentInfoController.h: -------------------------------------------------------------------------------- 1 | // 2 | // QJTorrentInfoController.h 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2017/6/9. 6 | // Copyright © 2017年 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import "QJViewController.h" 10 | 11 | @interface QJTorrentInfoController : QJViewController 12 | 13 | @property (nonatomic, strong) NSString *gid; 14 | @property (nonatomic, strong) NSString *token; 15 | 16 | @end 17 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJTorrentItem.h: -------------------------------------------------------------------------------- 1 | // 2 | // QJTorrentItem.h 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2017/6/9. 6 | // Copyright © 2017年 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface QJTorrentItem : NSObject 12 | 13 | @property (nonatomic, strong) NSString *posted; 14 | @property (nonatomic, strong) NSString *size; 15 | @property (nonatomic, strong) NSString *seeds; 16 | @property (nonatomic, strong) NSString *peers; 17 | @property (nonatomic, strong) NSString *downloads; 18 | @property (nonatomic, strong) NSString *uploader; 19 | @property (nonatomic, strong) NSString *name; 20 | @property (nonatomic, strong) NSString *magnet; 21 | 22 | @end 23 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJTorrentItem.m: -------------------------------------------------------------------------------- 1 | // 2 | // QJTorrentItem.m 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2017/6/9. 6 | // Copyright © 2017年 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import "QJTorrentItem.h" 10 | 11 | @implementation QJTorrentItem 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJTouchIDViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // QJTouchIDViewController.h 3 | // ExReadViewer 4 | // 5 | // Created by 覃江 on 2017/1/9. 6 | // Copyright © 2017年 茅野瓜子. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | typedef void(^TouchidBlock)(BOOL isSuccess); 12 | 13 | @interface QJTouchIDViewController : UIViewController 14 | 15 | @property (nonatomic, strong) TouchidBlock block; 16 | 17 | @end 18 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJTouchIDViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // QJTouchIDViewController.m 3 | // ExReadViewer 4 | // 5 | // Created by 覃江 on 2017/1/9. 6 | // Copyright © 2017年 茅野瓜子. All rights reserved. 7 | // 8 | 9 | #import "QJTouchIDViewController.h" 10 | #import "QJProtectTool.h" 11 | 12 | @interface QJTouchIDViewController () 13 | 14 | - (IBAction)btnAction:(UIButton *)sender; 15 | 16 | @end 17 | 18 | @implementation QJTouchIDViewController 19 | 20 | - (void)viewDidLoad { 21 | [super viewDidLoad]; 22 | [self unlockWithTouchID]; 23 | } 24 | 25 | - (IBAction)btnAction:(UIButton *)sender { 26 | [self unlockWithTouchID]; 27 | } 28 | 29 | - (void)unlockWithTouchID { 30 | [[QJProtectTool shareTool] showTouchID:^(QJProtectToolStatus status) { 31 | if (status == QJProtectToolStatusSuccess) { 32 | [self dismissViewControllerAnimated:YES completion:^{ 33 | if (self.block) { 34 | self.block(YES); 35 | } 36 | }]; 37 | } 38 | }]; 39 | } 40 | 41 | - (void)didReceiveMemoryWarning { 42 | [super didReceiveMemoryWarning]; 43 | } 44 | 45 | @end 46 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // QJViewController.h 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2017/5/18. 6 | // Copyright © 2017年 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface QJViewController : UIViewController 12 | 13 | //是否为刷新状态 14 | - (BOOL)isShowFreshingStatus; 15 | //显示菊花 16 | - (void)showFreshingViewWithTip:(NSString *)tip; 17 | //关闭菊花 18 | - (void)hiddenFreshingView; 19 | //显示错误 20 | - (void)showErrorViewWithTip:(NSString *)tip; 21 | 22 | @end 23 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJWatchedViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // QJWatchedViewController.h 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2019/5/4. 6 | // Copyright © 2019 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import "QJViewController.h" 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface QJWatchedViewController : QJViewController 14 | 15 | - (void)scrollToTop; 16 | 17 | @end 18 | 19 | NS_ASSUME_NONNULL_END 20 | -------------------------------------------------------------------------------- /EHenTaiViewer/QJWebViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // QJWebViewController.h 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2017/5/23. 6 | // Copyright © 2017年 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import "QJViewController.h" 10 | 11 | @interface QJWebViewController : QJViewController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /EHenTaiViewer/TBCityIconFont.h: -------------------------------------------------------------------------------- 1 | #import "UIImage+TBCityIconFont.h" 2 | #import "TBCityIconInfo.h" 3 | 4 | #define TBCityIconInfoMake(text, imageSize, imageColor) [TBCityIconInfo iconInfoWithText:text size:imageSize color:imageColor] 5 | 6 | @interface TBCityIconFont : NSObject 7 | 8 | + (UIFont *)fontWithSize: (CGFloat)size; 9 | + (void)setFontName:(NSString *)fontName; 10 | 11 | @end -------------------------------------------------------------------------------- /EHenTaiViewer/TBCityIconFont.m: -------------------------------------------------------------------------------- 1 | #import "TBCityIconFont.h" 2 | #import 3 | 4 | @implementation TBCityIconFont 5 | 6 | static NSString *_fontName; 7 | 8 | + (void)registerFontWithURL:(NSURL *)url { 9 | NSAssert([[NSFileManager defaultManager] fileExistsAtPath:[url path]], @"Font file doesn't exist"); 10 | CGDataProviderRef fontDataProvider = CGDataProviderCreateWithURL((__bridge CFURLRef)url); 11 | CGFontRef newFont = CGFontCreateWithDataProvider(fontDataProvider); 12 | CGDataProviderRelease(fontDataProvider); 13 | CTFontManagerRegisterGraphicsFont(newFont, nil); 14 | CGFontRelease(newFont); 15 | } 16 | 17 | + (UIFont *)fontWithSize:(CGFloat)size { 18 | UIFont *font = [UIFont fontWithName:[self fontName] size:size]; 19 | if (font == nil) { 20 | NSURL *fontFileUrl = [[NSBundle mainBundle] URLForResource:[self fontName] withExtension:@"ttf"]; 21 | [self registerFontWithURL: fontFileUrl]; 22 | font = [UIFont fontWithName:[self fontName] size:size]; 23 | NSAssert(font, @"UIFont object should not be nil, check if the font file is added to the application bundle and you're using the correct font name."); 24 | } 25 | return font; 26 | } 27 | 28 | + (void)setFontName:(NSString *)fontName { 29 | _fontName = fontName; 30 | 31 | } 32 | 33 | + (NSString *)fontName { 34 | return _fontName ? : @"iconfont"; 35 | } 36 | 37 | @end 38 | -------------------------------------------------------------------------------- /EHenTaiViewer/TBCityIconInfo.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import 3 | 4 | @interface TBCityIconInfo : NSObject 5 | 6 | @property (nonatomic, strong) NSString *text; 7 | @property (nonatomic, assign) NSInteger size; 8 | @property (nonatomic, strong) UIColor *color; 9 | 10 | - (instancetype)initWithText:(NSString *)text size:(NSInteger)size color:(UIColor *)color; 11 | + (instancetype)iconInfoWithText:(NSString *)text size:(NSInteger)size color:(UIColor *)color; 12 | 13 | @end -------------------------------------------------------------------------------- /EHenTaiViewer/TBCityIconInfo.m: -------------------------------------------------------------------------------- 1 | #import "TBCityIconInfo.h" 2 | 3 | @implementation TBCityIconInfo 4 | 5 | - (instancetype)initWithText:(NSString *)text size:(NSInteger)size color:(UIColor *)color { 6 | if (self = [super init]) { 7 | self.text = text; 8 | self.size = size; 9 | self.color = color; 10 | } 11 | return self; 12 | } 13 | 14 | + (instancetype)iconInfoWithText:(NSString *)text size:(NSInteger)size color:(UIColor *)color { 15 | return [[TBCityIconInfo alloc] initWithText:text size:size color:color]; 16 | } 17 | 18 | @end -------------------------------------------------------------------------------- /EHenTaiViewer/Tag+CoreDataClass.h: -------------------------------------------------------------------------------- 1 | // 2 | // Tag+CoreDataClass.h 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2017/7/31. 6 | // Copyright © 2017年 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | NS_ASSUME_NONNULL_BEGIN 13 | 14 | @interface Tag : NSManagedObject 15 | 16 | @end 17 | 18 | NS_ASSUME_NONNULL_END 19 | 20 | #import "Tag+CoreDataProperties.h" 21 | -------------------------------------------------------------------------------- /EHenTaiViewer/Tag+CoreDataClass.m: -------------------------------------------------------------------------------- 1 | // 2 | // Tag+CoreDataClass.m 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2017/7/31. 6 | // Copyright © 2017年 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import "Tag+CoreDataClass.h" 10 | 11 | @implementation Tag 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /EHenTaiViewer/Tag+CoreDataProperties.h: -------------------------------------------------------------------------------- 1 | // 2 | // Tag+CoreDataProperties.h 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2017/7/31. 6 | // Copyright © 2017年 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import "Tag+CoreDataClass.h" 10 | 11 | 12 | NS_ASSUME_NONNULL_BEGIN 13 | 14 | @interface Tag (CoreDataProperties) 15 | 16 | + (NSFetchRequest *)fetchRequest; 17 | 18 | @property (nullable, nonatomic, copy) NSString *cname; 19 | @property (nullable, nonatomic, copy) NSString *info; 20 | @property (nullable, nonatomic, copy) NSString *name; 21 | 22 | @end 23 | 24 | NS_ASSUME_NONNULL_END 25 | -------------------------------------------------------------------------------- /EHenTaiViewer/Tag+CoreDataProperties.m: -------------------------------------------------------------------------------- 1 | // 2 | // Tag+CoreDataProperties.m 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2017/7/31. 6 | // Copyright © 2017年 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import "Tag+CoreDataProperties.h" 10 | 11 | @implementation Tag (CoreDataProperties) 12 | 13 | + (NSFetchRequest *)fetchRequest { 14 | return [[NSFetchRequest alloc] initWithEntityName:@"Tag"]; 15 | } 16 | 17 | @dynamic cname; 18 | @dynamic info; 19 | @dynamic name; 20 | 21 | @end 22 | -------------------------------------------------------------------------------- /EHenTaiViewer/UIDevice+QJDevice.h: -------------------------------------------------------------------------------- 1 | // 2 | // UIDevice+QJDevice.h 3 | // EHenTaiViewer 4 | // 5 | // Created by zedmacbook on 2018/6/26. 6 | // Copyright © 2018年 kayanouriko. All rights reserved. 7 | // 8 | 9 | // https://www.jianshu.com/p/d6cb54d2eaa1 10 | 11 | #import 12 | 13 | @interface UIDevice (QJDevice) 14 | 15 | /** 16 | * @interfaceOrientation 输入要强制转屏的方向 17 | */ 18 | + (void)switchNewOrientation:(UIInterfaceOrientation)interfaceOrientation; 19 | 20 | @end 21 | -------------------------------------------------------------------------------- /EHenTaiViewer/UIDevice+QJDevice.m: -------------------------------------------------------------------------------- 1 | // 2 | // UIDevice+QJDevice.m 3 | // EHenTaiViewer 4 | // 5 | // Created by zedmacbook on 2018/6/26. 6 | // Copyright © 2018年 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import "UIDevice+QJDevice.h" 10 | 11 | @implementation UIDevice (QJDevice) 12 | 13 | + (void)switchNewOrientation:(UIInterfaceOrientation)interfaceOrientation { 14 | NSNumber *resetOrientationTarget = [NSNumber numberWithInt:UIInterfaceOrientationUnknown]; 15 | [[UIDevice currentDevice] setValue:resetOrientationTarget forKey:@"orientation"]; 16 | NSNumber *orientationTarget = [NSNumber numberWithInt:interfaceOrientation]; 17 | [[UIDevice currentDevice] setValue:orientationTarget forKey:@"orientation"]; 18 | } 19 | 20 | @end 21 | -------------------------------------------------------------------------------- /EHenTaiViewer/UIImage+TBCityIconFont.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import "TBCityIconInfo.h" 3 | 4 | @interface UIImage (TBCityIconFont) 5 | 6 | + (UIImage *)iconWithInfo:(TBCityIconInfo *)info; 7 | 8 | @end -------------------------------------------------------------------------------- /EHenTaiViewer/UIImage+TBCityIconFont.m: -------------------------------------------------------------------------------- 1 | #import "UIImage+TBCityIconFont.h" 2 | #import "TBCityIconFont.h" 3 | #import 4 | 5 | @implementation UIImage (TBCityIconFont) 6 | 7 | + (UIImage *)iconWithInfo:(TBCityIconInfo *)info { 8 | CGFloat size = info.size; 9 | CGFloat scale = [UIScreen mainScreen].scale; 10 | CGFloat realSize = size * scale; 11 | UIFont *font = [TBCityIconFont fontWithSize:realSize]; 12 | UIGraphicsBeginImageContext(CGSizeMake(realSize, realSize)); 13 | CGContextRef context = UIGraphicsGetCurrentContext(); 14 | 15 | if ([info.text respondsToSelector:@selector(drawAtPoint:withAttributes:)]) { 16 | /** 17 | * 如果这里抛出异常,请打开断点列表,右击All Exceptions -> Edit Breakpoint -> All修改为Objective-C 18 | * See: http://stackoverflow.com/questions/1163981/how-to-add-a-breakpoint-to-objc-exception-throw/14767076#14767076 19 | */ 20 | [info.text drawAtPoint:CGPointZero withAttributes:@{NSFontAttributeName:font, NSForegroundColorAttributeName: info.color}]; 21 | } else { 22 | 23 | #pragma clang diagnostic push 24 | #pragma clang diagnostic ignored "-Wdeprecated-declarations" 25 | CGContextSetFillColorWithColor(context, info.color.CGColor); 26 | [info.text drawAtPoint:CGPointMake(0, 0) withFont:font]; 27 | #pragma clang pop 28 | } 29 | 30 | UIImage *image = [UIImage imageWithCGImage:UIGraphicsGetImageFromCurrentImageContext().CGImage scale:scale orientation:UIImageOrientationUp]; 31 | UIGraphicsEndImageContext(); 32 | 33 | return image; 34 | } 35 | 36 | @end 37 | -------------------------------------------------------------------------------- /EHenTaiViewer/UITableViewCell+QJAddition.h: -------------------------------------------------------------------------------- 1 | // 2 | // UITableViewCell+QJAddition.h 3 | // bangumitv 4 | // 5 | // Created by zedmacbook on 2018/11/5. 6 | // Copyright © 2018 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface UITableViewCell (QJAddition) 14 | 15 | /// 添加圆角设置 16 | - (void)addSectionCornerRadiusWithIndexPath:(NSIndexPath *)indexPath tableView:(UITableView *)tableView; 17 | 18 | @end 19 | 20 | NS_ASSUME_NONNULL_END 21 | -------------------------------------------------------------------------------- /EHenTaiViewer/UITextView+Addition.h: -------------------------------------------------------------------------------- 1 | // 2 | // UITextView+Addition.h 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2017/11/26. 6 | // Copyright © 2017年 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface UITextView (Addition) 12 | 13 | - (BOOL)checkContentLength; 14 | 15 | @end 16 | -------------------------------------------------------------------------------- /EHenTaiViewer/UITextView+Addition.m: -------------------------------------------------------------------------------- 1 | // 2 | // UITextView+Addition.m 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2017/11/26. 6 | // Copyright © 2017年 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import "UITextView+Addition.h" 10 | 11 | @implementation UITextView (Addition) 12 | 13 | - (BOOL)checkContentLength { 14 | CGFloat contentHeight = [self.text StringHeightWithFontSize:self.font maxWidth:self.contentSize.width]; 15 | return contentHeight > self.contentSize.height; 16 | } 17 | 18 | @end 19 | -------------------------------------------------------------------------------- /EHenTaiViewer/UIView+Layer.h: -------------------------------------------------------------------------------- 1 | // 2 | // UIView+Layer.h 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2018/8/26. 6 | // Copyright © 2018 kayanouriko. All rights reserved. 7 | // 8 | 9 | /// 添加圆角样式 10 | 11 | #import 12 | 13 | IB_DESIGNABLE 14 | @interface UIView (Layer) 15 | 16 | /// 圆角 17 | @property (assign, nonatomic) IBInspectable CGFloat cornerRadius; 18 | 19 | @end 20 | -------------------------------------------------------------------------------- /EHenTaiViewer/UIView+Layer.m: -------------------------------------------------------------------------------- 1 | // 2 | // UIView+Layer.m 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2018/8/26. 6 | // Copyright © 2018 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import "UIView+Layer.h" 10 | #import 11 | 12 | static char *CornerRadiusKey = "CornerRadiusKey"; 13 | 14 | @implementation UIView (Layer) 15 | 16 | #pragma mark - Setter 17 | - (void)setCornerRadius:(CGFloat)cornerRadius { 18 | objc_setAssociatedObject(self, CornerRadiusKey, @(cornerRadius), OBJC_ASSOCIATION_COPY_NONATOMIC); 19 | self.layer.cornerRadius = cornerRadius; 20 | self.layer.masksToBounds = YES; 21 | } 22 | 23 | #pragma mark - Getter 24 | - (CGFloat)cornerRadius { 25 | return [objc_getAssociatedObject(self, CornerRadiusKey) floatValue]; 26 | } 27 | 28 | @end 29 | -------------------------------------------------------------------------------- /EHenTaiViewer/XHStarRateView/XHStarRateView.h: -------------------------------------------------------------------------------- 1 | // 2 | // XHStarRateView.h 3 | // XHStarRateView 4 | // 5 | // Created by 江欣华 on 16/4/1. 6 | // Copyright © 2016年 jxh. All rights reserved. 7 | // 8 | 9 | #import 10 | @class XHStarRateView; 11 | 12 | typedef void(^finishBlock)(CGFloat currentScore); 13 | 14 | typedef NS_ENUM(NSInteger, RateStyle) 15 | { 16 | WholeStar = 0, //只能整星评论 17 | HalfStar = 1, //允许半星评论 18 | IncompleteStar = 2 //允许不完整星评论 19 | }; 20 | 21 | @protocol XHStarRateViewDelegate 22 | 23 | -(void)starRateView:(XHStarRateView *)starRateView currentScore:(CGFloat)currentScore; 24 | 25 | @end 26 | 27 | @interface XHStarRateView : UIView 28 | 29 | @property (nonatomic,assign)BOOL isAnimation; //是否动画显示,默认NO 30 | @property (nonatomic,assign)RateStyle rateStyle; //评分样式 默认是WholeStar 31 | @property (nonatomic,assign)CGFloat currentScore; // 当前评分:0-5 默认0 32 | @property (nonatomic, weak) iddelegate; 33 | 34 | 35 | -(instancetype)initWithFrame:(CGRect)frame; 36 | -(instancetype)initWithFrame:(CGRect)frame numberOfStars:(NSInteger)numberOfStars rateStyle:(RateStyle)rateStyle isAnination:(BOOL)isAnimation delegate:(id)delegate; 37 | 38 | 39 | -(instancetype)initWithFrame:(CGRect)frame finish:(finishBlock)finish; 40 | -(instancetype)initWithFrame:(CGRect)frame numberOfStars:(NSInteger)numberOfStars rateStyle:(RateStyle)rateStyle isAnination:(BOOL)isAnimation finish:(finishBlock)finish; 41 | 42 | @end 43 | -------------------------------------------------------------------------------- /EHenTaiViewer/XPathQuery.h: -------------------------------------------------------------------------------- 1 | // 2 | // XPathQuery.h 3 | // FuelFinder 4 | // 5 | // Created by Matt Gallagher on 4/08/08. 6 | // Copyright 2008 __MyCompanyName__. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NSArray *PerformHTMLXPathQuery(NSData *document, NSString *query); 12 | NSArray *PerformHTMLXPathQueryWithEncoding(NSData *document, NSString *query,NSString *encoding); 13 | NSArray *PerformXMLXPathQuery(NSData *document, NSString *query); 14 | NSArray *PerformXMLXPathQueryWithEncoding(NSData *document, NSString *query,NSString *encoding); 15 | -------------------------------------------------------------------------------- /EHenTaiViewer/iconfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayanouriko/E-HentaiViewer/3f954c3e1892a8eca1e2b0a2d3ac6049864abedb/EHenTaiViewer/iconfont.ttf -------------------------------------------------------------------------------- /EHenTaiViewer/launch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayanouriko/E-HentaiViewer/3f954c3e1892a8eca1e2b0a2d3ac6049864abedb/EHenTaiViewer/launch.png -------------------------------------------------------------------------------- /EHenTaiViewer/loading.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayanouriko/E-HentaiViewer/3f954c3e1892a8eca1e2b0a2d3ac6049864abedb/EHenTaiViewer/loading.gif -------------------------------------------------------------------------------- /EHenTaiViewer/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // EHenTaiViewer 4 | // 5 | // Created by QinJ on 2017/5/17. 6 | // Copyright © 2017年 kayanouriko. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "AppDelegate.h" 11 | 12 | int main(int argc, char * argv[]) { 13 | @autoreleasepool { 14 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 kayanouriko 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Podfile: -------------------------------------------------------------------------------- 1 | source 'https://mirrors.tuna.tsinghua.edu.cn/git/CocoaPods/Specs.git' 2 | project 'EHenTaiViewer.xcodeproj' 3 | 4 | # Uncomment the next line to define a global platform for your project 5 | platform :ios, '8.0' 6 | inhibit_all_warnings! 7 | 8 | target 'EHenTaiViewer' do 9 | # Uncomment the next line if you're using Swift or would like to use dynamic frameworks 10 | use_frameworks! 11 | # Pods for EHenTaiViewer 12 | pod 'YYWebImage' 13 | pod 'MagicalRecord' 14 | # 自动布局 15 | pod 'Masonry' 16 | end 17 | -------------------------------------------------------------------------------- /Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - MagicalRecord (2.3.2): 3 | - MagicalRecord/Core (= 2.3.2) 4 | - MagicalRecord/Core (2.3.2) 5 | - Masonry (1.1.0) 6 | - YYCache (1.0.4) 7 | - YYImage (1.0.4): 8 | - YYImage/Core (= 1.0.4) 9 | - YYImage/Core (1.0.4) 10 | - YYWebImage (1.0.5): 11 | - YYCache 12 | - YYImage 13 | 14 | DEPENDENCIES: 15 | - MagicalRecord 16 | - Masonry 17 | - YYWebImage 18 | 19 | SPEC REPOS: 20 | https://mirrors.tuna.tsinghua.edu.cn/git/CocoaPods/Specs.git: 21 | - MagicalRecord 22 | - Masonry 23 | - YYCache 24 | - YYImage 25 | - YYWebImage 26 | 27 | SPEC CHECKSUMS: 28 | MagicalRecord: 53bed74b4323b930992a725be713e53b37d19755 29 | Masonry: 678fab65091a9290e40e2832a55e7ab731aad201 30 | YYCache: 8105b6638f5e849296c71f331ff83891a4942952 31 | YYImage: 1e1b62a9997399593e4b9c4ecfbbabbf1d3f3b54 32 | YYWebImage: 5f7f36aee2ae293f016d418c7d6ba05c4863e928 33 | 34 | PODFILE CHECKSUM: bda02e66b2dd6f925682f6738ab778c8b849a5b2 35 | 36 | COCOAPODS: 1.6.1 37 | -------------------------------------------------------------------------------- /Pods/MagicalRecord/LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2010-2015, Magical Panda Software, LLC 2 | 3 | Permission is hereby granted, free of charge, to any person 4 | obtaining a copy of this software and associated documentation 5 | files (the "Software"), to deal in the Software without 6 | restriction, including without limitation the rights to use, 7 | copy, modify, merge, publish, distribute, sublicense, and/or sell 8 | copies of the Software, and to permit persons to whom the 9 | Software is furnished to do so, subject to the following 10 | conditions: 11 | 12 | * Link to the MagicalRecord Repository at https://github.com/magicalpanda/MagicalRecord in the credits section of your application 13 | 14 | The above copyright notice and this permission notice shall be 15 | included in all copies or substantial portions of the Software. 16 | 17 | This software license is in accordance with the standard MIT License. 18 | 19 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 20 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 21 | OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 22 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 23 | HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 24 | WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 25 | FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 26 | OTHER DEALINGS IN THE SOFTWARE. 27 | -------------------------------------------------------------------------------- /Pods/MagicalRecord/MagicalRecord/Categories/DataImport/MagicalImportFunctions.h: -------------------------------------------------------------------------------- 1 | // 2 | // MagicalImportFunctions.h 3 | // Magical Record 4 | // 5 | // Created by Saul Mora on 3/7/12. 6 | // Copyright (c) 2012 Magical Panda Software LLC. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | NSDate * __MR_nonnull MR_adjustDateForDST(NSDate *__MR_nonnull date); 13 | NSDate * __MR_nonnull MR_dateFromString(NSString *__MR_nonnull value, NSString *__MR_nonnull format); 14 | NSDate * __MR_nonnull MR_dateFromNumber(NSNumber *__MR_nonnull value, BOOL milliseconds); 15 | NSNumber * __MR_nonnull MR_numberFromString(NSString *__MR_nonnull value); 16 | NSString * __MR_nonnull MR_attributeNameFromString(NSString *__MR_nonnull value); 17 | NSString * __MR_nonnull MR_primaryKeyNameFromString(NSString *__MR_nonnull value); 18 | 19 | #if TARGET_OS_IPHONE 20 | #import 21 | UIColor * __MR_nullable MR_colorFromString(NSString *__MR_nonnull serializedColor); 22 | #else 23 | #import 24 | NSColor * __MR_nullable MR_colorFromString(NSString *__MR_nonnull serializedColor); 25 | #endif 26 | 27 | NSInteger * __MR_nullable MR_newColorComponentsFromString(NSString *__MR_nonnull serializedColor); 28 | -------------------------------------------------------------------------------- /Pods/MagicalRecord/MagicalRecord/Categories/DataImport/NSAttributeDescription+MagicalDataImport.h: -------------------------------------------------------------------------------- 1 | // 2 | // NSAttributeDescription+MagicalDataImport.h 3 | // Magical Record 4 | // 5 | // Created by Saul Mora on 9/4/11. 6 | // Copyright 2011 Magical Panda Software LLC. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | @interface NSAttributeDescription (MagicalRecord_DataImport) 13 | 14 | - (MR_nullable NSString *) MR_primaryKey; 15 | - (MR_nullable id) MR_valueForKeyPath:(MR_nonnull NSString *)keyPath fromObjectData:(MR_nonnull id)objectData; 16 | 17 | @end 18 | -------------------------------------------------------------------------------- /Pods/MagicalRecord/MagicalRecord/Categories/DataImport/NSEntityDescription+MagicalDataImport.h: -------------------------------------------------------------------------------- 1 | // 2 | // NSEntityDescription+MagicalDataImport.h 3 | // Magical Record 4 | // 5 | // Created by Saul Mora on 9/5/11. 6 | // Copyright 2011 Magical Panda Software LLC. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | @interface NSEntityDescription (MagicalRecord_DataImport) 13 | 14 | - (MR_nullable NSAttributeDescription *) MR_primaryAttributeToRelateBy; 15 | - (MR_nonnull NSManagedObject *) MR_createInstanceInContext:(MR_nonnull NSManagedObjectContext *)context; 16 | 17 | /** 18 | * Safely returns an attribute description for the given name, otherwise returns nil. In certain circumstances, the keys of the dictionary returned by `attributesByName` are not standard NSStrings and won't match using object subscripting or standard `objectForKey:` lookups. 19 | * 20 | * There may be performance implications to using this method if your entity has hundreds or thousands of attributes. 21 | * 22 | * @param name Name of the attribute description in the `attributesByName` dictionary on this instance 23 | * 24 | * @return The attribute description for the given name, otherwise nil 25 | */ 26 | - (MR_nullable NSAttributeDescription *) MR_attributeDescriptionForName:(MR_nonnull NSString *)name; 27 | 28 | @end 29 | -------------------------------------------------------------------------------- /Pods/MagicalRecord/MagicalRecord/Categories/DataImport/NSNumber+MagicalDataImport.h: -------------------------------------------------------------------------------- 1 | // 2 | // NSNumber+MagicalDataImport.h 3 | // Magical Record 4 | // 5 | // Created by Saul Mora on 9/4/11. 6 | // Copyright 2011 Magical Panda Software LLC. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | #import 12 | 13 | @interface NSNumber (MagicalRecord_DataImport) 14 | 15 | - (MR_nullable NSString *)MR_lookupKeyForAttribute:(MR_nonnull NSAttributeDescription *)attributeInfo; 16 | - (MR_nonnull id)MR_relatedValueForRelationship:(MR_nonnull NSRelationshipDescription *)relationshipInfo; 17 | 18 | @end 19 | -------------------------------------------------------------------------------- /Pods/MagicalRecord/MagicalRecord/Categories/DataImport/NSNumber+MagicalDataImport.m: -------------------------------------------------------------------------------- 1 | // 2 | // NSNumber+MagicalDataImport.m 3 | // Magical Record 4 | // 5 | // Created by Saul Mora on 9/4/11. 6 | // Copyright 2011 Magical Panda Software LLC. All rights reserved. 7 | // 8 | 9 | #import "NSNumber+MagicalDataImport.h" 10 | 11 | @implementation NSNumber (MagicalRecord_DataImport) 12 | 13 | - (NSString *)MR_lookupKeyForAttribute:(NSAttributeDescription *)attributeInfo 14 | { 15 | return nil; 16 | } 17 | 18 | - (id)MR_relatedValueForRelationship:(NSRelationshipDescription *)relationshipInfo 19 | { 20 | return self; 21 | } 22 | 23 | @end 24 | -------------------------------------------------------------------------------- /Pods/MagicalRecord/MagicalRecord/Categories/DataImport/NSObject+MagicalDataImport.h: -------------------------------------------------------------------------------- 1 | // 2 | // NSDictionary+MagicalDataImport.h 3 | // Magical Record 4 | // 5 | // Created by Saul Mora on 9/4/11. 6 | // Copyright 2011 Magical Panda Software LLC. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | #import 12 | 13 | @interface NSObject (MagicalRecord_DataImport) 14 | 15 | - (MR_nullable NSString *) MR_lookupKeyForAttribute:(MR_nonnull NSAttributeDescription *)attributeInfo; 16 | - (MR_nullable id) MR_valueForAttribute:(MR_nonnull NSAttributeDescription *)attributeInfo; 17 | 18 | - (MR_nullable NSString *) MR_lookupKeyForRelationship:(MR_nonnull NSRelationshipDescription *)relationshipInfo; 19 | - (MR_nullable id) MR_relatedValueForRelationship:(MR_nonnull NSRelationshipDescription *)relationshipInfo; 20 | 21 | @end 22 | -------------------------------------------------------------------------------- /Pods/MagicalRecord/MagicalRecord/Categories/DataImport/NSRelationshipDescription+MagicalDataImport.h: -------------------------------------------------------------------------------- 1 | // 2 | // NSRelationshipDescription+MagicalDataImport.h 3 | // Magical Record 4 | // 5 | // Created by Saul Mora on 9/4/11. 6 | // Copyright 2011 Magical Panda Software LLC. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | @interface NSRelationshipDescription (MagicalRecord_DataImport) 13 | 14 | - (MR_nonnull NSString *) MR_primaryKey; 15 | 16 | @end 17 | -------------------------------------------------------------------------------- /Pods/MagicalRecord/MagicalRecord/Categories/DataImport/NSRelationshipDescription+MagicalDataImport.m: -------------------------------------------------------------------------------- 1 | // 2 | // NSRelationshipDescription+MagicalDataImport.m 3 | // Magical Record 4 | // 5 | // Created by Saul Mora on 9/4/11. 6 | // Copyright 2011 Magical Panda Software LLC. All rights reserved. 7 | // 8 | 9 | #import "NSRelationshipDescription+MagicalDataImport.h" 10 | #import "NSManagedObject+MagicalDataImport.h" 11 | #import "MagicalImportFunctions.h" 12 | 13 | @implementation NSRelationshipDescription (MagicalRecord_DataImport) 14 | 15 | - (NSString *) MR_primaryKey; 16 | { 17 | NSString *primaryKeyName = [[self userInfo] objectForKey:kMagicalRecordImportRelationshipLinkedByKey] ?: 18 | MR_primaryKeyNameFromString([[self destinationEntity] name]); 19 | 20 | return primaryKeyName; 21 | } 22 | 23 | @end 24 | -------------------------------------------------------------------------------- /Pods/MagicalRecord/MagicalRecord/Categories/DataImport/NSString+MagicalDataImport.h: -------------------------------------------------------------------------------- 1 | // 2 | // NSString+MagicalRecord_MagicalDataImport.h 3 | // Magical Record 4 | // 5 | // Created by Saul Mora on 12/10/11. 6 | // Copyright (c) 2011 Magical Panda Software LLC. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | #import 12 | 13 | @interface NSString (MagicalRecord_DataImport) 14 | 15 | - (MR_nonnull NSString *) MR_capitalizedFirstCharacterString; 16 | 17 | @end 18 | -------------------------------------------------------------------------------- /Pods/MagicalRecord/MagicalRecord/Categories/DataImport/NSString+MagicalDataImport.m: -------------------------------------------------------------------------------- 1 | // 2 | // NSString+MagicalRecord_MagicalDataImport.m 3 | // Magical Record 4 | // 5 | // Created by Saul Mora on 12/10/11. 6 | // Copyright (c) 2011 Magical Panda Software LLC. All rights reserved. 7 | // 8 | 9 | #import "NSString+MagicalDataImport.h" 10 | 11 | 12 | @implementation NSString (MagicalRecord_DataImport) 13 | 14 | - (NSString *) MR_capitalizedFirstCharacterString; 15 | { 16 | if ([self length] > 0) 17 | { 18 | NSString *firstChar = [[self substringToIndex:1] capitalizedString]; 19 | return [firstChar stringByAppendingString:[self substringFromIndex:1]]; 20 | } 21 | return self; 22 | } 23 | 24 | - (id) MR_relatedValueForRelationship:(NSRelationshipDescription *)relationshipInfo 25 | { 26 | return self; 27 | } 28 | 29 | - (NSString *) MR_lookupKeyForAttribute:(NSAttributeDescription *)attributeInfo 30 | { 31 | return nil; 32 | } 33 | 34 | @end 35 | 36 | -------------------------------------------------------------------------------- /Pods/MagicalRecord/MagicalRecord/Categories/NSManagedObjectContext/NSManagedObjectContext+MagicalChainSave.m: -------------------------------------------------------------------------------- 1 | // 2 | // NSManagedObjectContext+MagicalChainSave.m 3 | // Magical Record 4 | // 5 | // Created by Lee on 8/27/14. 6 | // Copyright (c) 2014 Magical Panda Software LLC. All rights reserved. 7 | // 8 | 9 | #import "NSManagedObjectContext+MagicalChainSave.h" 10 | #import "NSManagedObjectContext+MagicalRecord.h" 11 | 12 | @implementation NSManagedObjectContext (MagicalRecord_ChainSave) 13 | - (void)MR_saveWithBlock:(void (^)(NSManagedObjectContext *localContext))block; 14 | { 15 | [self MR_saveWithBlock:block completion:nil]; 16 | } 17 | 18 | - (void)MR_saveWithBlock:(void (^)(NSManagedObjectContext *localContext))block completion:(MRSaveCompletionHandler)completion; 19 | { 20 | NSManagedObjectContext *localContext = [NSManagedObjectContext MR_contextWithParent:self]; 21 | 22 | [localContext performBlock:^{ 23 | [localContext MR_setWorkingName:NSStringFromSelector(_cmd)]; 24 | 25 | if (block) { 26 | block(localContext); 27 | } 28 | 29 | [localContext MR_saveWithOptions:MRSaveParentContexts completion:completion]; 30 | }]; 31 | } 32 | 33 | #pragma mark - Synchronous saving 34 | 35 | - (void)MR_saveWithBlockAndWait:(void (^)(NSManagedObjectContext *localContext))block; 36 | { 37 | NSManagedObjectContext *localContext = [NSManagedObjectContext MR_contextWithParent:self]; 38 | 39 | [localContext performBlockAndWait:^{ 40 | [localContext MR_setWorkingName:NSStringFromSelector(_cmd)]; 41 | 42 | if (block) { 43 | block(localContext); 44 | } 45 | 46 | [localContext MR_saveWithOptions:MRSaveParentContexts|MRSaveSynchronously completion:nil]; 47 | }]; 48 | } 49 | 50 | @end 51 | -------------------------------------------------------------------------------- /Pods/MagicalRecord/MagicalRecord/Categories/NSManagedObjectContext/NSManagedObjectContext+MagicalThreading.h: -------------------------------------------------------------------------------- 1 | // 2 | // NSManagedObjectContext+MagicalThreading.h 3 | // Magical Record 4 | // 5 | // Created by Saul Mora on 3/9/12. 6 | // Copyright (c) 2012 Magical Panda Software LLC. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | @interface NSManagedObjectContext (MagicalThreading) 13 | 14 | + (MR_nonnull NSManagedObjectContext *) MR_contextForCurrentThread __attribute((deprecated("This method will be removed in MagicalRecord 3.0"))); 15 | + (void) MR_clearNonMainThreadContextsCache __attribute((deprecated("This method will be removed in MagicalRecord 3.0"))); 16 | + (void) MR_resetContextForCurrentThread __attribute((deprecated("This method will be removed in MagicalRecord 3.0"))); 17 | + (void) MR_clearContextForCurrentThread __attribute((deprecated("This method will be removed in MagicalRecord 3.0"))); 18 | 19 | @end 20 | -------------------------------------------------------------------------------- /Pods/MagicalRecord/MagicalRecord/Categories/NSManagedObjectModel+MagicalRecord.h: -------------------------------------------------------------------------------- 1 | // 2 | // NSManagedObjectModel+MagicalRecord.h 3 | // 4 | // Created by Saul Mora on 3/11/10. 5 | // Copyright 2010 Magical Panda Software, LLC All rights reserved. 6 | // 7 | 8 | #import 9 | #import 10 | 11 | @interface NSManagedObjectModel (MagicalRecord) 12 | 13 | + (MR_nullable NSManagedObjectModel *) MR_defaultManagedObjectModel; 14 | 15 | + (void) MR_setDefaultManagedObjectModel:(MR_nullable NSManagedObjectModel *)newDefaultModel; 16 | 17 | + (MR_nullable NSManagedObjectModel *) MR_mergedObjectModelFromMainBundle; 18 | + (MR_nullable NSManagedObjectModel *) MR_newManagedObjectModelNamed:(MR_nonnull NSString *)modelFileName NS_RETURNS_RETAINED; 19 | + (MR_nullable NSManagedObjectModel *) MR_managedObjectModelNamed:(MR_nonnull NSString *)modelFileName; 20 | + (MR_nullable NSManagedObjectModel *) MR_newModelNamed:(MR_nonnull NSString *) modelName inBundleNamed:(MR_nonnull NSString *) bundleName NS_RETURNS_RETAINED; 21 | + (MR_nullable NSManagedObjectModel *) MR_newModelNamed:(MR_nonnull NSString *) modelName inBundle:(MR_nonnull NSBundle*) bundle NS_RETURNS_RETAINED; 22 | 23 | @end 24 | -------------------------------------------------------------------------------- /Pods/MagicalRecord/MagicalRecord/Categories/NSPersistentStore+MagicalRecord.h: -------------------------------------------------------------------------------- 1 | // 2 | // NSPersistentStore+MagicalRecord.h 3 | // 4 | // Created by Saul Mora on 3/11/10. 5 | // Copyright 2010 Magical Panda Software, LLC All rights reserved. 6 | // 7 | 8 | #import 9 | #import 10 | #import "MagicalRecordDeprecationMacros.h" 11 | 12 | // option to autodelete store if it already exists 13 | 14 | OBJC_EXPORT NSString * __MR_nonnull const kMagicalRecordDefaultStoreFileName; 15 | 16 | 17 | @interface NSPersistentStore (MagicalRecord) 18 | 19 | + (MR_nonnull NSURL *) MR_defaultLocalStoreUrl; 20 | 21 | + (MR_nullable NSPersistentStore *) MR_defaultPersistentStore; 22 | + (void) MR_setDefaultPersistentStore:(MR_nullable NSPersistentStore *) store; 23 | 24 | + (MR_nullable NSURL *) MR_urlForStoreName:(MR_nonnull NSString *)storeFileName; 25 | + (MR_nullable NSURL *) MR_cloudURLForUbiquitousContainer:(MR_nonnull NSString *)bucketName; 26 | + (MR_nullable NSURL *) MR_cloudURLForUbiqutiousContainer:(MR_nonnull NSString *)bucketName MR_DEPRECATED_WILL_BE_REMOVED_IN_PLEASE_USE("4.0", "MR_cloudURLForUbiquitousContainer:"); 27 | 28 | @end 29 | 30 | 31 | -------------------------------------------------------------------------------- /Pods/MagicalRecord/MagicalRecord/Core/MagicalRecord+ErrorHandling.h: -------------------------------------------------------------------------------- 1 | // 2 | // MagicalRecord+ErrorHandling.h 3 | // Magical Record 4 | // 5 | // Created by Saul Mora on 3/6/12. 6 | // Copyright (c) 2012 Magical Panda Software LLC. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | @interface MagicalRecord (ErrorHandling) 13 | 14 | + (void) handleErrors:(MR_nonnull NSError *)error; 15 | - (void) handleErrors:(MR_nonnull NSError *)error; 16 | 17 | + (void) setErrorHandlerTarget:(MR_nullable id)target action:(MR_nonnull SEL)action; 18 | + (MR_nonnull SEL) errorHandlerAction; 19 | + (MR_nullable id) errorHandlerTarget; 20 | 21 | @end 22 | -------------------------------------------------------------------------------- /Pods/MagicalRecord/MagicalRecord/Core/MagicalRecord+Setup.h: -------------------------------------------------------------------------------- 1 | // 2 | // MagicalRecord+Setup.h 3 | // Magical Record 4 | // 5 | // Created by Saul Mora on 3/7/12. 6 | // Copyright (c) 2012 Magical Panda Software LLC. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | @interface MagicalRecord (Setup) 13 | 14 | + (void) setupCoreDataStack; 15 | + (void) setupCoreDataStackWithInMemoryStore; 16 | + (void) setupAutoMigratingCoreDataStack; 17 | 18 | + (void) setupCoreDataStackWithStoreNamed:(MR_nonnull NSString *)storeName; 19 | + (void) setupCoreDataStackWithAutoMigratingSqliteStoreNamed:(MR_nonnull NSString *)storeName; 20 | 21 | + (void) setupCoreDataStackWithStoreAtURL:(MR_nonnull NSURL *)storeURL; 22 | + (void) setupCoreDataStackWithAutoMigratingSqliteStoreAtURL:(MR_nonnull NSURL *)storeURL; 23 | 24 | 25 | @end 26 | -------------------------------------------------------------------------------- /Pods/MagicalRecord/MagicalRecord/Core/MagicalRecord+ShorthandMethods.h: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2015 Magical Panda Software LLC. All rights reserved. 3 | 4 | #import 5 | 6 | @interface MagicalRecord (ShorthandMethods) 7 | 8 | + (void)enableShorthandMethods; 9 | 10 | @end 11 | -------------------------------------------------------------------------------- /Pods/MagicalRecord/MagicalRecord/Core/MagicalRecordDeprecationMacros.h: -------------------------------------------------------------------------------- 1 | // 2 | // Created by Tony Arnold on 10/04/2014. 3 | // Copyright (c) 2014 Magical Panda Software LLC. All rights reserved. 4 | // 5 | 6 | #define MR_DEPRECATED_WILL_BE_REMOVED_IN(VERSION) __attribute__((deprecated("This method has been deprecated and will be removed in MagicalRecord " VERSION "."))) 7 | #define MR_DEPRECATED_WILL_BE_REMOVED_IN_PLEASE_USE(VERSION, METHOD) __attribute__((deprecated("This method has been deprecated and will be removed in MagicalRecord " VERSION ". Please use `" METHOD "` instead."))) 8 | -------------------------------------------------------------------------------- /Pods/MagicalRecord/MagicalRecord/Core/MagicalRecordXcode7CompatibilityMacros.h: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright © 2015 Magical Panda Software LLC. All rights reserved. 3 | // 4 | // The following preprocessor macros can be used to adopt the new nullability annotations and generics 5 | // features available in Xcode 7, while maintaining backwards compatibility with earlier versions of 6 | // Xcode that do not support these features. 7 | // 8 | // Originally taken from https://gist.github.com/smileyborg/d513754bc1cf41678054 9 | 10 | #ifndef MagicalRecordXcode7CompatibilityMacros_h 11 | #define MagicalRecordXcode7CompatibilityMacros_h 12 | 13 | #if __has_feature(nullability) 14 | #define MR_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_BEGIN 15 | #define MR_ASSUME_NONNULL_END NS_ASSUME_NONNULL_END 16 | #define MR_nullable nullable 17 | #define MR_nonnull nonnull 18 | #define __MR_nullable __nullable 19 | #define __MR_nonnull __nonnull 20 | #else 21 | #define MR_ASSUME_NONNULL_BEGIN 22 | #define MR_ASSUME_NONNULL_END 23 | #define MR_nullable 24 | #define MR_nonnull 25 | #define __MR_nullable 26 | #define __MR_nonnull 27 | #endif 28 | 29 | #if __has_feature(objc_generics) 30 | #define MR_GENERIC(class, ...) class<__VA_ARGS__> 31 | #define MR_GENERIC_TYPE(type) type 32 | #define __MR_kindof(class) __kindof class 33 | #else 34 | #define MR_GENERIC(class, ...) class 35 | #define MR_GENERIC_TYPE(type) id 36 | #define __MR_kindof(class) id 37 | #endif 38 | 39 | #define MR_NSArrayOfNSManagedObjects MR_GENERIC(NSArray, __MR_kindof(NSManagedObject) *) * 40 | 41 | #endif /* MagicalRecordXcode7CompatibilityMacros_h */ 42 | -------------------------------------------------------------------------------- /Pods/Manifest.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - MagicalRecord (2.3.2): 3 | - MagicalRecord/Core (= 2.3.2) 4 | - MagicalRecord/Core (2.3.2) 5 | - Masonry (1.1.0) 6 | - YYCache (1.0.4) 7 | - YYImage (1.0.4): 8 | - YYImage/Core (= 1.0.4) 9 | - YYImage/Core (1.0.4) 10 | - YYWebImage (1.0.5): 11 | - YYCache 12 | - YYImage 13 | 14 | DEPENDENCIES: 15 | - MagicalRecord 16 | - Masonry 17 | - YYWebImage 18 | 19 | SPEC REPOS: 20 | https://mirrors.tuna.tsinghua.edu.cn/git/CocoaPods/Specs.git: 21 | - MagicalRecord 22 | - Masonry 23 | - YYCache 24 | - YYImage 25 | - YYWebImage 26 | 27 | SPEC CHECKSUMS: 28 | MagicalRecord: 53bed74b4323b930992a725be713e53b37d19755 29 | Masonry: 678fab65091a9290e40e2832a55e7ab731aad201 30 | YYCache: 8105b6638f5e849296c71f331ff83891a4942952 31 | YYImage: 1e1b62a9997399593e4b9c4ecfbbabbf1d3f3b54 32 | YYWebImage: 5f7f36aee2ae293f016d418c7d6ba05c4863e928 33 | 34 | PODFILE CHECKSUM: bda02e66b2dd6f925682f6738ab778c8b849a5b2 35 | 36 | COCOAPODS: 1.6.1 37 | -------------------------------------------------------------------------------- /Pods/Masonry/LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2011-2012 Masonry Team - https://github.com/Masonry 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in 11 | all copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19 | THE SOFTWARE. -------------------------------------------------------------------------------- /Pods/Masonry/Masonry/MASCompositeConstraint.h: -------------------------------------------------------------------------------- 1 | // 2 | // MASCompositeConstraint.h 3 | // Masonry 4 | // 5 | // Created by Jonas Budelmann on 21/07/13. 6 | // Copyright (c) 2013 cloudling. All rights reserved. 7 | // 8 | 9 | #import "MASConstraint.h" 10 | #import "MASUtilities.h" 11 | 12 | /** 13 | * A group of MASConstraint objects 14 | */ 15 | @interface MASCompositeConstraint : MASConstraint 16 | 17 | /** 18 | * Creates a composite with a predefined array of children 19 | * 20 | * @param children child MASConstraints 21 | * 22 | * @return a composite constraint 23 | */ 24 | - (id)initWithChildren:(NSArray *)children; 25 | 26 | @end 27 | -------------------------------------------------------------------------------- /Pods/Masonry/Masonry/MASLayoutConstraint.h: -------------------------------------------------------------------------------- 1 | // 2 | // MASLayoutConstraint.h 3 | // Masonry 4 | // 5 | // Created by Jonas Budelmann on 3/08/13. 6 | // Copyright (c) 2013 Jonas Budelmann. All rights reserved. 7 | // 8 | 9 | #import "MASUtilities.h" 10 | 11 | /** 12 | * When you are debugging or printing the constraints attached to a view this subclass 13 | * makes it easier to identify which constraints have been created via Masonry 14 | */ 15 | @interface MASLayoutConstraint : NSLayoutConstraint 16 | 17 | /** 18 | * a key to associate with this constraint 19 | */ 20 | @property (nonatomic, strong) id mas_key; 21 | 22 | @end 23 | -------------------------------------------------------------------------------- /Pods/Masonry/Masonry/MASLayoutConstraint.m: -------------------------------------------------------------------------------- 1 | // 2 | // MASLayoutConstraint.m 3 | // Masonry 4 | // 5 | // Created by Jonas Budelmann on 3/08/13. 6 | // Copyright (c) 2013 Jonas Budelmann. All rights reserved. 7 | // 8 | 9 | #import "MASLayoutConstraint.h" 10 | 11 | @implementation MASLayoutConstraint 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /Pods/Masonry/Masonry/MASViewAttribute.h: -------------------------------------------------------------------------------- 1 | // 2 | // MASViewAttribute.h 3 | // Masonry 4 | // 5 | // Created by Jonas Budelmann on 21/07/13. 6 | // Copyright (c) 2013 cloudling. All rights reserved. 7 | // 8 | 9 | #import "MASUtilities.h" 10 | 11 | /** 12 | * An immutable tuple which stores the view and the related NSLayoutAttribute. 13 | * Describes part of either the left or right hand side of a constraint equation 14 | */ 15 | @interface MASViewAttribute : NSObject 16 | 17 | /** 18 | * The view which the reciever relates to. Can be nil if item is not a view. 19 | */ 20 | @property (nonatomic, weak, readonly) MAS_VIEW *view; 21 | 22 | /** 23 | * The item which the reciever relates to. 24 | */ 25 | @property (nonatomic, weak, readonly) id item; 26 | 27 | /** 28 | * The attribute which the reciever relates to 29 | */ 30 | @property (nonatomic, assign, readonly) NSLayoutAttribute layoutAttribute; 31 | 32 | /** 33 | * Convenience initializer. 34 | */ 35 | - (id)initWithView:(MAS_VIEW *)view layoutAttribute:(NSLayoutAttribute)layoutAttribute; 36 | 37 | /** 38 | * The designated initializer. 39 | */ 40 | - (id)initWithView:(MAS_VIEW *)view item:(id)item layoutAttribute:(NSLayoutAttribute)layoutAttribute; 41 | 42 | /** 43 | * Determine whether the layoutAttribute is a size attribute 44 | * 45 | * @return YES if layoutAttribute is equal to NSLayoutAttributeWidth or NSLayoutAttributeHeight 46 | */ 47 | - (BOOL)isSizeAttribute; 48 | 49 | @end 50 | -------------------------------------------------------------------------------- /Pods/Masonry/Masonry/MASViewAttribute.m: -------------------------------------------------------------------------------- 1 | // 2 | // MASViewAttribute.m 3 | // Masonry 4 | // 5 | // Created by Jonas Budelmann on 21/07/13. 6 | // Copyright (c) 2013 cloudling. All rights reserved. 7 | // 8 | 9 | #import "MASViewAttribute.h" 10 | 11 | @implementation MASViewAttribute 12 | 13 | - (id)initWithView:(MAS_VIEW *)view layoutAttribute:(NSLayoutAttribute)layoutAttribute { 14 | self = [self initWithView:view item:view layoutAttribute:layoutAttribute]; 15 | return self; 16 | } 17 | 18 | - (id)initWithView:(MAS_VIEW *)view item:(id)item layoutAttribute:(NSLayoutAttribute)layoutAttribute { 19 | self = [super init]; 20 | if (!self) return nil; 21 | 22 | _view = view; 23 | _item = item; 24 | _layoutAttribute = layoutAttribute; 25 | 26 | return self; 27 | } 28 | 29 | - (BOOL)isSizeAttribute { 30 | return self.layoutAttribute == NSLayoutAttributeWidth 31 | || self.layoutAttribute == NSLayoutAttributeHeight; 32 | } 33 | 34 | - (BOOL)isEqual:(MASViewAttribute *)viewAttribute { 35 | if ([viewAttribute isKindOfClass:self.class]) { 36 | return self.view == viewAttribute.view 37 | && self.layoutAttribute == viewAttribute.layoutAttribute; 38 | } 39 | return [super isEqual:viewAttribute]; 40 | } 41 | 42 | - (NSUInteger)hash { 43 | return MAS_NSUINTROTATE([self.view hash], MAS_NSUINT_BIT / 2) ^ self.layoutAttribute; 44 | } 45 | 46 | @end 47 | -------------------------------------------------------------------------------- /Pods/Masonry/Masonry/MASViewConstraint.h: -------------------------------------------------------------------------------- 1 | // 2 | // MASViewConstraint.h 3 | // Masonry 4 | // 5 | // Created by Jonas Budelmann on 20/07/13. 6 | // Copyright (c) 2013 cloudling. All rights reserved. 7 | // 8 | 9 | #import "MASViewAttribute.h" 10 | #import "MASConstraint.h" 11 | #import "MASLayoutConstraint.h" 12 | #import "MASUtilities.h" 13 | 14 | /** 15 | * A single constraint. 16 | * Contains the attributes neccessary for creating a NSLayoutConstraint and adding it to the appropriate view 17 | */ 18 | @interface MASViewConstraint : MASConstraint 19 | 20 | /** 21 | * First item/view and first attribute of the NSLayoutConstraint 22 | */ 23 | @property (nonatomic, strong, readonly) MASViewAttribute *firstViewAttribute; 24 | 25 | /** 26 | * Second item/view and second attribute of the NSLayoutConstraint 27 | */ 28 | @property (nonatomic, strong, readonly) MASViewAttribute *secondViewAttribute; 29 | 30 | /** 31 | * initialises the MASViewConstraint with the first part of the equation 32 | * 33 | * @param firstViewAttribute view.mas_left, view.mas_width etc. 34 | * 35 | * @return a new view constraint 36 | */ 37 | - (id)initWithFirstViewAttribute:(MASViewAttribute *)firstViewAttribute; 38 | 39 | /** 40 | * Returns all MASViewConstraints installed with this view as a first item. 41 | * 42 | * @param view A view to retrieve constraints for. 43 | * 44 | * @return An array of MASViewConstraints. 45 | */ 46 | + (NSArray *)installedConstraintsForView:(MAS_VIEW *)view; 47 | 48 | @end 49 | -------------------------------------------------------------------------------- /Pods/Masonry/Masonry/Masonry.h: -------------------------------------------------------------------------------- 1 | // 2 | // Masonry.h 3 | // Masonry 4 | // 5 | // Created by Jonas Budelmann on 20/07/13. 6 | // Copyright (c) 2013 cloudling. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | //! Project version number for Masonry. 12 | FOUNDATION_EXPORT double MasonryVersionNumber; 13 | 14 | //! Project version string for Masonry. 15 | FOUNDATION_EXPORT const unsigned char MasonryVersionString[]; 16 | 17 | #import "MASUtilities.h" 18 | #import "View+MASAdditions.h" 19 | #import "View+MASShorthandAdditions.h" 20 | #import "ViewController+MASAdditions.h" 21 | #import "NSArray+MASAdditions.h" 22 | #import "NSArray+MASShorthandAdditions.h" 23 | #import "MASConstraint.h" 24 | #import "MASCompositeConstraint.h" 25 | #import "MASViewAttribute.h" 26 | #import "MASViewConstraint.h" 27 | #import "MASConstraintMaker.h" 28 | #import "MASLayoutConstraint.h" 29 | #import "NSLayoutConstraint+MASDebugAdditions.h" 30 | -------------------------------------------------------------------------------- /Pods/Masonry/Masonry/NSArray+MASShorthandAdditions.h: -------------------------------------------------------------------------------- 1 | // 2 | // NSArray+MASShorthandAdditions.h 3 | // Masonry 4 | // 5 | // Created by Jonas Budelmann on 22/07/13. 6 | // Copyright (c) 2013 Jonas Budelmann. All rights reserved. 7 | // 8 | 9 | #import "NSArray+MASAdditions.h" 10 | 11 | #ifdef MAS_SHORTHAND 12 | 13 | /** 14 | * Shorthand array additions without the 'mas_' prefixes, 15 | * only enabled if MAS_SHORTHAND is defined 16 | */ 17 | @interface NSArray (MASShorthandAdditions) 18 | 19 | - (NSArray *)makeConstraints:(void(^)(MASConstraintMaker *make))block; 20 | - (NSArray *)updateConstraints:(void(^)(MASConstraintMaker *make))block; 21 | - (NSArray *)remakeConstraints:(void(^)(MASConstraintMaker *make))block; 22 | 23 | @end 24 | 25 | @implementation NSArray (MASShorthandAdditions) 26 | 27 | - (NSArray *)makeConstraints:(void(^)(MASConstraintMaker *))block { 28 | return [self mas_makeConstraints:block]; 29 | } 30 | 31 | - (NSArray *)updateConstraints:(void(^)(MASConstraintMaker *))block { 32 | return [self mas_updateConstraints:block]; 33 | } 34 | 35 | - (NSArray *)remakeConstraints:(void(^)(MASConstraintMaker *))block { 36 | return [self mas_remakeConstraints:block]; 37 | } 38 | 39 | @end 40 | 41 | #endif 42 | -------------------------------------------------------------------------------- /Pods/Masonry/Masonry/NSLayoutConstraint+MASDebugAdditions.h: -------------------------------------------------------------------------------- 1 | // 2 | // NSLayoutConstraint+MASDebugAdditions.h 3 | // Masonry 4 | // 5 | // Created by Jonas Budelmann on 3/08/13. 6 | // Copyright (c) 2013 Jonas Budelmann. All rights reserved. 7 | // 8 | 9 | #import "MASUtilities.h" 10 | 11 | /** 12 | * makes debug and log output of NSLayoutConstraints more readable 13 | */ 14 | @interface NSLayoutConstraint (MASDebugAdditions) 15 | 16 | @end 17 | -------------------------------------------------------------------------------- /Pods/Masonry/Masonry/ViewController+MASAdditions.h: -------------------------------------------------------------------------------- 1 | // 2 | // UIViewController+MASAdditions.h 3 | // Masonry 4 | // 5 | // Created by Craig Siemens on 2015-06-23. 6 | // 7 | // 8 | 9 | #import "MASUtilities.h" 10 | #import "MASConstraintMaker.h" 11 | #import "MASViewAttribute.h" 12 | 13 | #ifdef MAS_VIEW_CONTROLLER 14 | 15 | @interface MAS_VIEW_CONTROLLER (MASAdditions) 16 | 17 | /** 18 | * following properties return a new MASViewAttribute with appropriate UILayoutGuide and NSLayoutAttribute 19 | */ 20 | @property (nonatomic, strong, readonly) MASViewAttribute *mas_topLayoutGuide; 21 | @property (nonatomic, strong, readonly) MASViewAttribute *mas_bottomLayoutGuide; 22 | @property (nonatomic, strong, readonly) MASViewAttribute *mas_topLayoutGuideTop; 23 | @property (nonatomic, strong, readonly) MASViewAttribute *mas_topLayoutGuideBottom; 24 | @property (nonatomic, strong, readonly) MASViewAttribute *mas_bottomLayoutGuideTop; 25 | @property (nonatomic, strong, readonly) MASViewAttribute *mas_bottomLayoutGuideBottom; 26 | 27 | 28 | @end 29 | 30 | #endif 31 | -------------------------------------------------------------------------------- /Pods/Masonry/Masonry/ViewController+MASAdditions.m: -------------------------------------------------------------------------------- 1 | // 2 | // UIViewController+MASAdditions.m 3 | // Masonry 4 | // 5 | // Created by Craig Siemens on 2015-06-23. 6 | // 7 | // 8 | 9 | #import "ViewController+MASAdditions.h" 10 | 11 | #ifdef MAS_VIEW_CONTROLLER 12 | 13 | @implementation MAS_VIEW_CONTROLLER (MASAdditions) 14 | 15 | - (MASViewAttribute *)mas_topLayoutGuide { 16 | return [[MASViewAttribute alloc] initWithView:self.view item:self.topLayoutGuide layoutAttribute:NSLayoutAttributeBottom]; 17 | } 18 | - (MASViewAttribute *)mas_topLayoutGuideTop { 19 | return [[MASViewAttribute alloc] initWithView:self.view item:self.topLayoutGuide layoutAttribute:NSLayoutAttributeTop]; 20 | } 21 | - (MASViewAttribute *)mas_topLayoutGuideBottom { 22 | return [[MASViewAttribute alloc] initWithView:self.view item:self.topLayoutGuide layoutAttribute:NSLayoutAttributeBottom]; 23 | } 24 | 25 | - (MASViewAttribute *)mas_bottomLayoutGuide { 26 | return [[MASViewAttribute alloc] initWithView:self.view item:self.bottomLayoutGuide layoutAttribute:NSLayoutAttributeTop]; 27 | } 28 | - (MASViewAttribute *)mas_bottomLayoutGuideTop { 29 | return [[MASViewAttribute alloc] initWithView:self.view item:self.bottomLayoutGuide layoutAttribute:NSLayoutAttributeTop]; 30 | } 31 | - (MASViewAttribute *)mas_bottomLayoutGuideBottom { 32 | return [[MASViewAttribute alloc] initWithView:self.view item:self.bottomLayoutGuide layoutAttribute:NSLayoutAttributeBottom]; 33 | } 34 | 35 | 36 | 37 | @end 38 | 39 | #endif 40 | -------------------------------------------------------------------------------- /Pods/Target Support Files/MagicalRecord/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 2.3.2 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Pods/Target Support Files/MagicalRecord/MagicalRecord-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 2.3.2 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Pods/Target Support Files/MagicalRecord/MagicalRecord-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_MagicalRecord : NSObject 3 | @end 4 | @implementation PodsDummy_MagicalRecord 5 | @end 6 | -------------------------------------------------------------------------------- /Pods/Target Support Files/MagicalRecord/MagicalRecord-prefix.pch: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | #import 14 | #import 15 | -------------------------------------------------------------------------------- /Pods/Target Support Files/MagicalRecord/MagicalRecord.modulemap: -------------------------------------------------------------------------------- 1 | framework module MagicalRecord { 2 | umbrella header "MagicalRecord-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Pods/Target Support Files/MagicalRecord/MagicalRecord.xcconfig: -------------------------------------------------------------------------------- 1 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/MagicalRecord 2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 | OTHER_LDFLAGS = $(inherited) -framework "CoreData" 4 | PODS_BUILD_DIR = ${BUILD_DIR} 5 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 6 | PODS_ROOT = ${SRCROOT} 7 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/MagicalRecord 8 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 9 | SKIP_INSTALL = YES 10 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Masonry/Masonry-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Masonry/Masonry-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Masonry : NSObject 3 | @end 4 | @implementation PodsDummy_Masonry 5 | @end 6 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Masonry/Masonry-prefix.pch: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Masonry/Masonry-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | #import "MASCompositeConstraint.h" 14 | #import "MASConstraint+Private.h" 15 | #import "MASConstraint.h" 16 | #import "MASConstraintMaker.h" 17 | #import "MASLayoutConstraint.h" 18 | #import "Masonry.h" 19 | #import "MASUtilities.h" 20 | #import "MASViewAttribute.h" 21 | #import "MASViewConstraint.h" 22 | #import "NSArray+MASAdditions.h" 23 | #import "NSArray+MASShorthandAdditions.h" 24 | #import "NSLayoutConstraint+MASDebugAdditions.h" 25 | #import "View+MASAdditions.h" 26 | #import "View+MASShorthandAdditions.h" 27 | #import "ViewController+MASAdditions.h" 28 | 29 | FOUNDATION_EXPORT double MasonryVersionNumber; 30 | FOUNDATION_EXPORT const unsigned char MasonryVersionString[]; 31 | 32 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Masonry/Masonry.modulemap: -------------------------------------------------------------------------------- 1 | framework module Masonry { 2 | umbrella header "Masonry-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Masonry/Masonry.xcconfig: -------------------------------------------------------------------------------- 1 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/Masonry 2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 | OTHER_LDFLAGS = $(inherited) -framework "Foundation" -framework "UIKit" 4 | PODS_BUILD_DIR = ${BUILD_DIR} 5 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 6 | PODS_ROOT = ${SRCROOT} 7 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/Masonry 8 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 9 | SKIP_INSTALL = YES 10 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-EHenTaiViewer/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-EHenTaiViewer/Pods-EHenTaiViewer-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-EHenTaiViewer/Pods-EHenTaiViewer-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Pods_EHenTaiViewer : NSObject 3 | @end 4 | @implementation PodsDummy_Pods_EHenTaiViewer 5 | @end 6 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-EHenTaiViewer/Pods-EHenTaiViewer-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | 14 | FOUNDATION_EXPORT double Pods_EHenTaiViewerVersionNumber; 15 | FOUNDATION_EXPORT const unsigned char Pods_EHenTaiViewerVersionString[]; 16 | 17 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-EHenTaiViewer/Pods-EHenTaiViewer.modulemap: -------------------------------------------------------------------------------- 1 | framework module Pods_EHenTaiViewer { 2 | umbrella header "Pods-EHenTaiViewer-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Pods/Target Support Files/YYCache/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0.4 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Pods/Target Support Files/YYCache/YYCache-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0.4 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Pods/Target Support Files/YYCache/YYCache-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_YYCache : NSObject 3 | @end 4 | @implementation PodsDummy_YYCache 5 | @end 6 | -------------------------------------------------------------------------------- /Pods/Target Support Files/YYCache/YYCache-prefix.pch: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | -------------------------------------------------------------------------------- /Pods/Target Support Files/YYCache/YYCache-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | #import "YYCache.h" 14 | #import "YYDiskCache.h" 15 | #import "YYKVStorage.h" 16 | #import "YYMemoryCache.h" 17 | 18 | FOUNDATION_EXPORT double YYCacheVersionNumber; 19 | FOUNDATION_EXPORT const unsigned char YYCacheVersionString[]; 20 | 21 | -------------------------------------------------------------------------------- /Pods/Target Support Files/YYCache/YYCache.modulemap: -------------------------------------------------------------------------------- 1 | framework module YYCache { 2 | umbrella header "YYCache-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Pods/Target Support Files/YYCache/YYCache.xcconfig: -------------------------------------------------------------------------------- 1 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/YYCache 2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 | OTHER_LDFLAGS = $(inherited) -l"sqlite3" -framework "CoreFoundation" -framework "QuartzCore" -framework "UIKit" 4 | PODS_BUILD_DIR = ${BUILD_DIR} 5 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 6 | PODS_ROOT = ${SRCROOT} 7 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/YYCache 8 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 9 | SKIP_INSTALL = YES 10 | -------------------------------------------------------------------------------- /Pods/Target Support Files/YYImage/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0.4 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Pods/Target Support Files/YYImage/YYImage-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0.4 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Pods/Target Support Files/YYImage/YYImage-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_YYImage : NSObject 3 | @end 4 | @implementation PodsDummy_YYImage 5 | @end 6 | -------------------------------------------------------------------------------- /Pods/Target Support Files/YYImage/YYImage-prefix.pch: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | -------------------------------------------------------------------------------- /Pods/Target Support Files/YYImage/YYImage-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | #import "YYAnimatedImageView.h" 14 | #import "YYFrameImage.h" 15 | #import "YYImage.h" 16 | #import "YYImageCoder.h" 17 | #import "YYSpriteSheetImage.h" 18 | 19 | FOUNDATION_EXPORT double YYImageVersionNumber; 20 | FOUNDATION_EXPORT const unsigned char YYImageVersionString[]; 21 | 22 | -------------------------------------------------------------------------------- /Pods/Target Support Files/YYImage/YYImage.modulemap: -------------------------------------------------------------------------------- 1 | framework module YYImage { 2 | umbrella header "YYImage-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Pods/Target Support Files/YYImage/YYImage.xcconfig: -------------------------------------------------------------------------------- 1 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/YYImage 2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 | OTHER_LDFLAGS = $(inherited) -l"z" -framework "Accelerate" -framework "AssetsLibrary" -framework "CoreFoundation" -framework "ImageIO" -framework "MobileCoreServices" -framework "QuartzCore" -framework "UIKit" 4 | PODS_BUILD_DIR = ${BUILD_DIR} 5 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 6 | PODS_ROOT = ${SRCROOT} 7 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/YYImage 8 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 9 | SKIP_INSTALL = YES 10 | -------------------------------------------------------------------------------- /Pods/Target Support Files/YYWebImage/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0.5 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Pods/Target Support Files/YYWebImage/YYWebImage-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0.5 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Pods/Target Support Files/YYWebImage/YYWebImage-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_YYWebImage : NSObject 3 | @end 4 | @implementation PodsDummy_YYWebImage 5 | @end 6 | -------------------------------------------------------------------------------- /Pods/Target Support Files/YYWebImage/YYWebImage-prefix.pch: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | -------------------------------------------------------------------------------- /Pods/Target Support Files/YYWebImage/YYWebImage-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | #import "YYImageCache.h" 14 | #import "YYWebImage.h" 15 | #import "YYWebImageManager.h" 16 | #import "YYWebImageOperation.h" 17 | #import "CALayer+YYWebImage.h" 18 | #import "MKAnnotationView+YYWebImage.h" 19 | #import "UIButton+YYWebImage.h" 20 | #import "UIImage+YYWebImage.h" 21 | #import "UIImageView+YYWebImage.h" 22 | 23 | FOUNDATION_EXPORT double YYWebImageVersionNumber; 24 | FOUNDATION_EXPORT const unsigned char YYWebImageVersionString[]; 25 | 26 | -------------------------------------------------------------------------------- /Pods/Target Support Files/YYWebImage/YYWebImage.modulemap: -------------------------------------------------------------------------------- 1 | framework module YYWebImage { 2 | umbrella header "YYWebImage-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Pods/Target Support Files/YYWebImage/YYWebImage.xcconfig: -------------------------------------------------------------------------------- 1 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/YYWebImage 2 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/YYCache" "${PODS_CONFIGURATION_BUILD_DIR}/YYImage" 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | OTHER_LDFLAGS = $(inherited) -framework "Accelerate" -framework "AssetsLibrary" -framework "CoreFoundation" -framework "ImageIO" -framework "MobileCoreServices" -framework "QuartzCore" -framework "UIKit" 5 | PODS_BUILD_DIR = ${BUILD_DIR} 6 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 7 | PODS_ROOT = ${SRCROOT} 8 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/YYWebImage 9 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 10 | SKIP_INSTALL = YES 11 | -------------------------------------------------------------------------------- /Pods/YYCache/LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 ibireme 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /Pods/YYImage/LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 ibireme 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /Pods/YYWebImage/LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 ibireme 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /docs/issue_template.md: -------------------------------------------------------------------------------- 1 | #### 机型 + 系统 2 | 例: iphone 7 plus / iOS10.2.6 3 | 4 | #### 运行网络环境 5 | 例: wifi + 有VPN 6 | 7 | #### 具体描述 8 | 例: 无法获取画廊列表 9 | 10 | #### 截图 11 | 例: ![](图片地址) 12 | --------------------------------------------------------------------------------