├── README.md ├── 超级无敌复活版帅气今日头条优化版无敌吊炸天.xcodeproj ├── project.pbxproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ └── xcuserdata │ │ ├── gaoshiyue.xcuserdatad │ │ └── UserInterfaceState.xcuserstate │ │ ├── keep.xcuserdatad │ │ └── UserInterfaceState.xcuserstate │ │ └── rongtong.xcuserdatad │ │ └── UserInterfaceState.xcuserstate └── xcuserdata │ ├── gaoshiyue.xcuserdatad │ ├── xcdebugger │ │ └── Breakpoints_v2.xcbkptlist │ └── xcschemes │ │ ├── xcschememanagement.plist │ │ └── 超级无敌复活版帅气今日头条优化版无敌吊炸天.xcscheme │ ├── keep.xcuserdatad │ └── xcschemes │ │ ├── xcschememanagement.plist │ │ └── 超级无敌复活版帅气今日头条优化版无敌吊炸天.xcscheme │ └── rongtong.xcuserdatad │ ├── xcdebugger │ └── Breakpoints_v2.xcbkptlist │ └── xcschemes │ ├── xcschememanagement.plist │ └── 超级无敌复活版帅气今日头条优化版无敌吊炸天.xcscheme ├── 超级无敌复活版帅气今日头条优化版无敌吊炸天 ├── AppDelegate.h ├── AppDelegate.m ├── Assets.xcassets │ ├── AppIcon.appiconset │ │ └── Contents.json │ ├── Contents.json │ ├── btn_navigation_back.imageset │ │ ├── Contents.json │ │ └── btn_navigation_back@2x.png │ └── btn_navigation_close.imageset │ │ ├── Contents.json │ │ └── btn_navigation_close@2x.png ├── Base.lproj │ ├── LaunchScreen.storyboard │ └── Main.storyboard ├── DNBeiJingViewController.h ├── DNBeiJingViewController.m ├── DNFashionVC.h ├── DNFashionVC.m ├── DNHomeViewController.h ├── DNHomeViewController.m ├── DNHorizontalSelectController │ ├── DNHorizontalSelectController.h │ ├── DNHorizontalSelectController.m │ ├── DNNavTabBarView.h │ └── DNNavTabBarView.m ├── DNRecommendVC.h ├── DNRecommendVC.m ├── DNSocietyViewController.h ├── DNSocietyViewController.m ├── DNSubscriptionViewController.h ├── DNSubscriptionViewController.m ├── DNVideoViewController.h ├── DNVideoViewController.m ├── Info.plist ├── Model │ ├── DNNavTabBarModel.h │ └── DNNavTabBarModel.m ├── Views │ ├── DNAddChannelView.h │ ├── DNAddChannelView.m │ ├── DNChannelCollectionViewCell.h │ └── DNChannelCollectionViewCell.m └── main.m ├── 超级无敌复活版帅气今日头条优化版无敌吊炸天Tests ├── Info.plist └── _____________________Tests.m └── 超级无敌复活版帅气今日头条优化版无敌吊炸天UITests ├── Info.plist └── _____________________UITests.m /README.md: -------------------------------------------------------------------------------- 1 | # BeyondJRTT 2 | 今日头条App的详细拆解分析和源码复现 3 | 4 | 暂时简单实现了一个横向滑动的控制器导航条 5 | 6 | 先来说说这个简单例子1 横向滑动导航条控制VC,思路是这样的: 7 | 8 | 利用addChildViewController方法 9 | 10 | A视图控制器(HomeViewController)来管理控制 B视图控制器 (DNHorizontalSelectController) ,B视图控制器去管理控制其他的子视图控制器(推荐、热点、北京....) 11 | 12 | B视图控制器 管理的比较多且需要滚动显示,所以在DNHorizontalSelectController加了一层mainscrollview来进行滑动各个视图控制器的视图,并利用scrollview的delegate 里的方法来进行控制协调。 13 | 14 | 根据需求来看 navigationbar上面需要有一个横条进行分类选择,并控制下面B类子控制器,且也是需要滚动。则在上面也用了一层scrollview(_tabbarScrollview)来滑动 15 | 16 | 还有就是点击navigationbar的横条 (DNNavTabBarView) 上的标签(北京\热点\推荐\社会..)来控制切换不同的视图控制器 17 | 这里很简单看代码 写了一个delegate 并进行索引来跳转 18 | 19 | 最后就是滑动视图控制器来使标签和视图协调 利用 scrollview的delegate方法 进行 四舍五入的函数 还有 记录上一次选项和这一次选项 来进行 动态改变字体比例大小的完成不错的效果。 CGAffineTransformMakeScale两个参数,代表x和y方向缩放倍数 20 | 21 | 一股脑的简单的写了个,感觉还行吧,正在继续优化,有什么建议的可以提,多谢 22 | 23 | 24 | 25 | PS:在以前,一个UIViewController的View可能有很多小的子view。这些子view很多时候被盖在最后,我们在最外层ViewController的viewDidLoad方法中,用addSubview增加了大量的子view。这些子view大多数不会一直处于界面上,只是在某些情况下才会出现,例如登陆失败的提示view,上传附件成功的提示view,网络失败的提示view等。但是虽然这些view很少出现,但是我们却常常一直把它们放在内存中。另外,当收到内存警告时,我们只能自己手工把这些view从super view中去掉。 26 | 27 | 改变 28 | 29 | 苹果新的API增加了addChildViewController方法,并且希望我们在使用addSubview时,同时调用[self addChildViewController:child]方法将sub view对应的viewController也加到当前ViewController的管理中。对于那些当前暂时不需要显示的subview,只通过addChildViewController把subViewController加进去。需要显示时再调用transitionFromViewController:toViewController:duration:options:animations:completion方法。 30 | 31 | 另外,当收到系统的Memory Warning的时候,系统也会自动把当前没有显示的subview unload掉,以节省内存。 32 | 33 | 34 | -------------------------------------------------------------------------------- /超级无敌复活版帅气今日头条优化版无敌吊炸天.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | B93A35241C743CC800D68613 /* DNHorizontalSelectController.m in Sources */ = {isa = PBXBuildFile; fileRef = B93A35231C743CC800D68613 /* DNHorizontalSelectController.m */; }; 11 | B93A35271C74479700D68613 /* DNNavTabBarView.m in Sources */ = {isa = PBXBuildFile; fileRef = B93A35261C74479700D68613 /* DNNavTabBarView.m */; }; 12 | B98B505E1C7BF20400B54572 /* DNAddChannelView.m in Sources */ = {isa = PBXBuildFile; fileRef = B98B505D1C7BF20400B54572 /* DNAddChannelView.m */; }; 13 | B9C9237E1C7410A2005D3FF4 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = B9C9237D1C7410A2005D3FF4 /* main.m */; }; 14 | B9C923811C7410A2005D3FF4 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = B9C923801C7410A2005D3FF4 /* AppDelegate.m */; }; 15 | B9C923871C7410A2005D3FF4 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = B9C923851C7410A2005D3FF4 /* Main.storyboard */; }; 16 | B9C923891C7410A2005D3FF4 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = B9C923881C7410A2005D3FF4 /* Assets.xcassets */; }; 17 | B9C9238C1C7410A2005D3FF4 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = B9C9238A1C7410A2005D3FF4 /* LaunchScreen.storyboard */; }; 18 | B9C923971C7410A2005D3FF4 /* _____________________Tests.m in Sources */ = {isa = PBXBuildFile; fileRef = B9C923961C7410A2005D3FF4 /* _____________________Tests.m */; }; 19 | B9C923A21C7410A2005D3FF4 /* _____________________UITests.m in Sources */ = {isa = PBXBuildFile; fileRef = B9C923A11C7410A2005D3FF4 /* _____________________UITests.m */; }; 20 | F51221D01C86C6A6003AE2C0 /* DNNavTabBarModel.m in Sources */ = {isa = PBXBuildFile; fileRef = F51221CF1C86C6A6003AE2C0 /* DNNavTabBarModel.m */; }; 21 | F5A51EE21C7C3F4D00A19A5E /* DNBeiJingViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = F5A51EDD1C7C3F4D00A19A5E /* DNBeiJingViewController.m */; }; 22 | F5A51EE31C7C3F4D00A19A5E /* DNFashionVC.m in Sources */ = {isa = PBXBuildFile; fileRef = F5A51EDF1C7C3F4D00A19A5E /* DNFashionVC.m */; }; 23 | F5A51EE41C7C3F4D00A19A5E /* DNHomeViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = F5A51EE11C7C3F4D00A19A5E /* DNHomeViewController.m */; }; 24 | F5A51EED1C7C3F5500A19A5E /* DNRecommendVC.m in Sources */ = {isa = PBXBuildFile; fileRef = F5A51EE61C7C3F5500A19A5E /* DNRecommendVC.m */; }; 25 | F5A51EEE1C7C3F5500A19A5E /* DNSocietyViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = F5A51EE81C7C3F5500A19A5E /* DNSocietyViewController.m */; }; 26 | F5A51EEF1C7C3F5500A19A5E /* DNSubscriptionViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = F5A51EEA1C7C3F5500A19A5E /* DNSubscriptionViewController.m */; }; 27 | F5A51EF01C7C3F5500A19A5E /* DNVideoViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = F5A51EEC1C7C3F5500A19A5E /* DNVideoViewController.m */; }; 28 | F5A51EF31C7C501700A19A5E /* DNChannelCollectionViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = F5A51EF21C7C501700A19A5E /* DNChannelCollectionViewCell.m */; }; 29 | /* End PBXBuildFile section */ 30 | 31 | /* Begin PBXContainerItemProxy section */ 32 | B9C923931C7410A2005D3FF4 /* PBXContainerItemProxy */ = { 33 | isa = PBXContainerItemProxy; 34 | containerPortal = B9C923711C7410A2005D3FF4 /* Project object */; 35 | proxyType = 1; 36 | remoteGlobalIDString = B9C923781C7410A2005D3FF4; 37 | remoteInfo = "超级无敌复活版帅气今日头条优化版无敌吊炸天"; 38 | }; 39 | B9C9239E1C7410A2005D3FF4 /* PBXContainerItemProxy */ = { 40 | isa = PBXContainerItemProxy; 41 | containerPortal = B9C923711C7410A2005D3FF4 /* Project object */; 42 | proxyType = 1; 43 | remoteGlobalIDString = B9C923781C7410A2005D3FF4; 44 | remoteInfo = "超级无敌复活版帅气今日头条优化版无敌吊炸天"; 45 | }; 46 | /* End PBXContainerItemProxy section */ 47 | 48 | /* Begin PBXFileReference section */ 49 | B93A35221C743CC800D68613 /* DNHorizontalSelectController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DNHorizontalSelectController.h; sourceTree = ""; }; 50 | B93A35231C743CC800D68613 /* DNHorizontalSelectController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DNHorizontalSelectController.m; sourceTree = ""; }; 51 | B93A35251C74479700D68613 /* DNNavTabBarView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DNNavTabBarView.h; sourceTree = ""; }; 52 | B93A35261C74479700D68613 /* DNNavTabBarView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DNNavTabBarView.m; sourceTree = ""; }; 53 | B98B505C1C7BF20400B54572 /* DNAddChannelView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DNAddChannelView.h; sourceTree = ""; }; 54 | B98B505D1C7BF20400B54572 /* DNAddChannelView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DNAddChannelView.m; sourceTree = ""; }; 55 | B9C923791C7410A2005D3FF4 /* 超级无敌复活版帅气今日头条优化版无敌吊炸天.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "超级无敌复活版帅气今日头条优化版无敌吊炸天.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 56 | B9C9237D1C7410A2005D3FF4 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 57 | B9C9237F1C7410A2005D3FF4 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 58 | B9C923801C7410A2005D3FF4 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; 59 | B9C923861C7410A2005D3FF4 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 60 | B9C923881C7410A2005D3FF4 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 61 | B9C9238B1C7410A2005D3FF4 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 62 | B9C9238D1C7410A2005D3FF4 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 63 | B9C923921C7410A2005D3FF4 /* 超级无敌复活版帅气今日头条优化版无敌吊炸天Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "超级无敌复活版帅气今日头条优化版无敌吊炸天Tests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 64 | B9C923961C7410A2005D3FF4 /* _____________________Tests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "_____________________Tests.m"; sourceTree = ""; }; 65 | B9C923981C7410A2005D3FF4 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 66 | B9C9239D1C7410A2005D3FF4 /* 超级无敌复活版帅气今日头条优化版无敌吊炸天UITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "超级无敌复活版帅气今日头条优化版无敌吊炸天UITests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 67 | B9C923A11C7410A2005D3FF4 /* _____________________UITests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "_____________________UITests.m"; sourceTree = ""; }; 68 | B9C923A31C7410A2005D3FF4 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 69 | F51221CE1C86C6A6003AE2C0 /* DNNavTabBarModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DNNavTabBarModel.h; sourceTree = ""; }; 70 | F51221CF1C86C6A6003AE2C0 /* DNNavTabBarModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DNNavTabBarModel.m; sourceTree = ""; }; 71 | F5A51EDC1C7C3F4D00A19A5E /* DNBeiJingViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DNBeiJingViewController.h; path = "超级无敌复活版帅气今日头条优化版无敌吊炸天/DNBeiJingViewController.h"; sourceTree = SOURCE_ROOT; }; 72 | F5A51EDD1C7C3F4D00A19A5E /* DNBeiJingViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = DNBeiJingViewController.m; path = "超级无敌复活版帅气今日头条优化版无敌吊炸天/DNBeiJingViewController.m"; sourceTree = SOURCE_ROOT; }; 73 | F5A51EDE1C7C3F4D00A19A5E /* DNFashionVC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DNFashionVC.h; path = "超级无敌复活版帅气今日头条优化版无敌吊炸天/DNFashionVC.h"; sourceTree = SOURCE_ROOT; }; 74 | F5A51EDF1C7C3F4D00A19A5E /* DNFashionVC.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = DNFashionVC.m; path = "超级无敌复活版帅气今日头条优化版无敌吊炸天/DNFashionVC.m"; sourceTree = SOURCE_ROOT; }; 75 | F5A51EE01C7C3F4D00A19A5E /* DNHomeViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DNHomeViewController.h; path = "超级无敌复活版帅气今日头条优化版无敌吊炸天/DNHomeViewController.h"; sourceTree = SOURCE_ROOT; }; 76 | F5A51EE11C7C3F4D00A19A5E /* DNHomeViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = DNHomeViewController.m; path = "超级无敌复活版帅气今日头条优化版无敌吊炸天/DNHomeViewController.m"; sourceTree = SOURCE_ROOT; }; 77 | F5A51EE51C7C3F5500A19A5E /* DNRecommendVC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DNRecommendVC.h; path = "超级无敌复活版帅气今日头条优化版无敌吊炸天/DNRecommendVC.h"; sourceTree = SOURCE_ROOT; }; 78 | F5A51EE61C7C3F5500A19A5E /* DNRecommendVC.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = DNRecommendVC.m; path = "超级无敌复活版帅气今日头条优化版无敌吊炸天/DNRecommendVC.m"; sourceTree = SOURCE_ROOT; }; 79 | F5A51EE71C7C3F5500A19A5E /* DNSocietyViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DNSocietyViewController.h; path = "超级无敌复活版帅气今日头条优化版无敌吊炸天/DNSocietyViewController.h"; sourceTree = SOURCE_ROOT; }; 80 | F5A51EE81C7C3F5500A19A5E /* DNSocietyViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = DNSocietyViewController.m; path = "超级无敌复活版帅气今日头条优化版无敌吊炸天/DNSocietyViewController.m"; sourceTree = SOURCE_ROOT; }; 81 | F5A51EE91C7C3F5500A19A5E /* DNSubscriptionViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DNSubscriptionViewController.h; path = "超级无敌复活版帅气今日头条优化版无敌吊炸天/DNSubscriptionViewController.h"; sourceTree = SOURCE_ROOT; }; 82 | F5A51EEA1C7C3F5500A19A5E /* DNSubscriptionViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = DNSubscriptionViewController.m; path = "超级无敌复活版帅气今日头条优化版无敌吊炸天/DNSubscriptionViewController.m"; sourceTree = SOURCE_ROOT; }; 83 | F5A51EEB1C7C3F5500A19A5E /* DNVideoViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DNVideoViewController.h; path = "超级无敌复活版帅气今日头条优化版无敌吊炸天/DNVideoViewController.h"; sourceTree = SOURCE_ROOT; }; 84 | F5A51EEC1C7C3F5500A19A5E /* DNVideoViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = DNVideoViewController.m; path = "超级无敌复活版帅气今日头条优化版无敌吊炸天/DNVideoViewController.m"; sourceTree = SOURCE_ROOT; }; 85 | F5A51EF11C7C501700A19A5E /* DNChannelCollectionViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DNChannelCollectionViewCell.h; sourceTree = ""; }; 86 | F5A51EF21C7C501700A19A5E /* DNChannelCollectionViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DNChannelCollectionViewCell.m; sourceTree = ""; }; 87 | /* End PBXFileReference section */ 88 | 89 | /* Begin PBXFrameworksBuildPhase section */ 90 | B9C923761C7410A2005D3FF4 /* Frameworks */ = { 91 | isa = PBXFrameworksBuildPhase; 92 | buildActionMask = 2147483647; 93 | files = ( 94 | ); 95 | runOnlyForDeploymentPostprocessing = 0; 96 | }; 97 | B9C9238F1C7410A2005D3FF4 /* Frameworks */ = { 98 | isa = PBXFrameworksBuildPhase; 99 | buildActionMask = 2147483647; 100 | files = ( 101 | ); 102 | runOnlyForDeploymentPostprocessing = 0; 103 | }; 104 | B9C9239A1C7410A2005D3FF4 /* Frameworks */ = { 105 | isa = PBXFrameworksBuildPhase; 106 | buildActionMask = 2147483647; 107 | files = ( 108 | ); 109 | runOnlyForDeploymentPostprocessing = 0; 110 | }; 111 | /* End PBXFrameworksBuildPhase section */ 112 | 113 | /* Begin PBXGroup section */ 114 | B937D6461C7D85790093E6C4 /* Cells */ = { 115 | isa = PBXGroup; 116 | children = ( 117 | ); 118 | path = Cells; 119 | sourceTree = ""; 120 | }; 121 | B93A35211C743CBA00D68613 /* DNHorizontalSelectController */ = { 122 | isa = PBXGroup; 123 | children = ( 124 | B93A35221C743CC800D68613 /* DNHorizontalSelectController.h */, 125 | B93A35231C743CC800D68613 /* DNHorizontalSelectController.m */, 126 | B93A35251C74479700D68613 /* DNNavTabBarView.h */, 127 | B93A35261C74479700D68613 /* DNNavTabBarView.m */, 128 | ); 129 | path = DNHorizontalSelectController; 130 | sourceTree = ""; 131 | }; 132 | B98B50581C7BF1A200B54572 /* Views */ = { 133 | isa = PBXGroup; 134 | children = ( 135 | B937D6461C7D85790093E6C4 /* Cells */, 136 | B98B505C1C7BF20400B54572 /* DNAddChannelView.h */, 137 | B98B505D1C7BF20400B54572 /* DNAddChannelView.m */, 138 | F5A51EF11C7C501700A19A5E /* DNChannelCollectionViewCell.h */, 139 | F5A51EF21C7C501700A19A5E /* DNChannelCollectionViewCell.m */, 140 | ); 141 | path = Views; 142 | sourceTree = ""; 143 | }; 144 | B9C923701C7410A2005D3FF4 = { 145 | isa = PBXGroup; 146 | children = ( 147 | B9C9237B1C7410A2005D3FF4 /* 超级无敌复活版帅气今日头条优化版无敌吊炸天 */, 148 | B9C923951C7410A2005D3FF4 /* 超级无敌复活版帅气今日头条优化版无敌吊炸天Tests */, 149 | B9C923A01C7410A2005D3FF4 /* 超级无敌复活版帅气今日头条优化版无敌吊炸天UITests */, 150 | B9C9237A1C7410A2005D3FF4 /* Products */, 151 | ); 152 | sourceTree = ""; 153 | }; 154 | B9C9237A1C7410A2005D3FF4 /* Products */ = { 155 | isa = PBXGroup; 156 | children = ( 157 | B9C923791C7410A2005D3FF4 /* 超级无敌复活版帅气今日头条优化版无敌吊炸天.app */, 158 | B9C923921C7410A2005D3FF4 /* 超级无敌复活版帅气今日头条优化版无敌吊炸天Tests.xctest */, 159 | B9C9239D1C7410A2005D3FF4 /* 超级无敌复活版帅气今日头条优化版无敌吊炸天UITests.xctest */, 160 | ); 161 | name = Products; 162 | sourceTree = ""; 163 | }; 164 | B9C9237B1C7410A2005D3FF4 /* 超级无敌复活版帅气今日头条优化版无敌吊炸天 */ = { 165 | isa = PBXGroup; 166 | children = ( 167 | B9C9237F1C7410A2005D3FF4 /* AppDelegate.h */, 168 | B9C923801C7410A2005D3FF4 /* AppDelegate.m */, 169 | B93A35211C743CBA00D68613 /* DNHorizontalSelectController */, 170 | B9D213B31C7AEFEC007E404F /* ViewControllers */, 171 | B98B50581C7BF1A200B54572 /* Views */, 172 | F51221CD1C86C655003AE2C0 /* Model */, 173 | B9C923881C7410A2005D3FF4 /* Assets.xcassets */, 174 | B9C923851C7410A2005D3FF4 /* Main.storyboard */, 175 | B9C9238A1C7410A2005D3FF4 /* LaunchScreen.storyboard */, 176 | B9C9238D1C7410A2005D3FF4 /* Info.plist */, 177 | B9C9237C1C7410A2005D3FF4 /* Supporting Files */, 178 | ); 179 | path = "超级无敌复活版帅气今日头条优化版无敌吊炸天"; 180 | sourceTree = ""; 181 | }; 182 | B9C9237C1C7410A2005D3FF4 /* Supporting Files */ = { 183 | isa = PBXGroup; 184 | children = ( 185 | B9C9237D1C7410A2005D3FF4 /* main.m */, 186 | ); 187 | name = "Supporting Files"; 188 | sourceTree = ""; 189 | }; 190 | B9C923951C7410A2005D3FF4 /* 超级无敌复活版帅气今日头条优化版无敌吊炸天Tests */ = { 191 | isa = PBXGroup; 192 | children = ( 193 | B9C923961C7410A2005D3FF4 /* _____________________Tests.m */, 194 | B9C923981C7410A2005D3FF4 /* Info.plist */, 195 | ); 196 | path = "超级无敌复活版帅气今日头条优化版无敌吊炸天Tests"; 197 | sourceTree = ""; 198 | }; 199 | B9C923A01C7410A2005D3FF4 /* 超级无敌复活版帅气今日头条优化版无敌吊炸天UITests */ = { 200 | isa = PBXGroup; 201 | children = ( 202 | B9C923A11C7410A2005D3FF4 /* _____________________UITests.m */, 203 | B9C923A31C7410A2005D3FF4 /* Info.plist */, 204 | ); 205 | path = "超级无敌复活版帅气今日头条优化版无敌吊炸天UITests"; 206 | sourceTree = ""; 207 | }; 208 | B9D213B31C7AEFEC007E404F /* ViewControllers */ = { 209 | isa = PBXGroup; 210 | children = ( 211 | F5A51EE51C7C3F5500A19A5E /* DNRecommendVC.h */, 212 | F5A51EE61C7C3F5500A19A5E /* DNRecommendVC.m */, 213 | F5A51EE71C7C3F5500A19A5E /* DNSocietyViewController.h */, 214 | F5A51EE81C7C3F5500A19A5E /* DNSocietyViewController.m */, 215 | F5A51EE91C7C3F5500A19A5E /* DNSubscriptionViewController.h */, 216 | F5A51EEA1C7C3F5500A19A5E /* DNSubscriptionViewController.m */, 217 | F5A51EEB1C7C3F5500A19A5E /* DNVideoViewController.h */, 218 | F5A51EEC1C7C3F5500A19A5E /* DNVideoViewController.m */, 219 | F5A51EDC1C7C3F4D00A19A5E /* DNBeiJingViewController.h */, 220 | F5A51EDD1C7C3F4D00A19A5E /* DNBeiJingViewController.m */, 221 | F5A51EDE1C7C3F4D00A19A5E /* DNFashionVC.h */, 222 | F5A51EDF1C7C3F4D00A19A5E /* DNFashionVC.m */, 223 | F5A51EE01C7C3F4D00A19A5E /* DNHomeViewController.h */, 224 | F5A51EE11C7C3F4D00A19A5E /* DNHomeViewController.m */, 225 | ); 226 | path = ViewControllers; 227 | sourceTree = ""; 228 | }; 229 | F51221CD1C86C655003AE2C0 /* Model */ = { 230 | isa = PBXGroup; 231 | children = ( 232 | F51221CE1C86C6A6003AE2C0 /* DNNavTabBarModel.h */, 233 | F51221CF1C86C6A6003AE2C0 /* DNNavTabBarModel.m */, 234 | ); 235 | path = Model; 236 | sourceTree = ""; 237 | }; 238 | /* End PBXGroup section */ 239 | 240 | /* Begin PBXNativeTarget section */ 241 | B9C923781C7410A2005D3FF4 /* 超级无敌复活版帅气今日头条优化版无敌吊炸天 */ = { 242 | isa = PBXNativeTarget; 243 | buildConfigurationList = B9C923A61C7410A2005D3FF4 /* Build configuration list for PBXNativeTarget "超级无敌复活版帅气今日头条优化版无敌吊炸天" */; 244 | buildPhases = ( 245 | B9C923751C7410A2005D3FF4 /* Sources */, 246 | B9C923761C7410A2005D3FF4 /* Frameworks */, 247 | B9C923771C7410A2005D3FF4 /* Resources */, 248 | ); 249 | buildRules = ( 250 | ); 251 | dependencies = ( 252 | ); 253 | name = "超级无敌复活版帅气今日头条优化版无敌吊炸天"; 254 | productName = "超级无敌复活版帅气今日头条优化版无敌吊炸天"; 255 | productReference = B9C923791C7410A2005D3FF4 /* 超级无敌复活版帅气今日头条优化版无敌吊炸天.app */; 256 | productType = "com.apple.product-type.application"; 257 | }; 258 | B9C923911C7410A2005D3FF4 /* 超级无敌复活版帅气今日头条优化版无敌吊炸天Tests */ = { 259 | isa = PBXNativeTarget; 260 | buildConfigurationList = B9C923A91C7410A2005D3FF4 /* Build configuration list for PBXNativeTarget "超级无敌复活版帅气今日头条优化版无敌吊炸天Tests" */; 261 | buildPhases = ( 262 | B9C9238E1C7410A2005D3FF4 /* Sources */, 263 | B9C9238F1C7410A2005D3FF4 /* Frameworks */, 264 | B9C923901C7410A2005D3FF4 /* Resources */, 265 | ); 266 | buildRules = ( 267 | ); 268 | dependencies = ( 269 | B9C923941C7410A2005D3FF4 /* PBXTargetDependency */, 270 | ); 271 | name = "超级无敌复活版帅气今日头条优化版无敌吊炸天Tests"; 272 | productName = "超级无敌复活版帅气今日头条优化版无敌吊炸天Tests"; 273 | productReference = B9C923921C7410A2005D3FF4 /* 超级无敌复活版帅气今日头条优化版无敌吊炸天Tests.xctest */; 274 | productType = "com.apple.product-type.bundle.unit-test"; 275 | }; 276 | B9C9239C1C7410A2005D3FF4 /* 超级无敌复活版帅气今日头条优化版无敌吊炸天UITests */ = { 277 | isa = PBXNativeTarget; 278 | buildConfigurationList = B9C923AC1C7410A2005D3FF4 /* Build configuration list for PBXNativeTarget "超级无敌复活版帅气今日头条优化版无敌吊炸天UITests" */; 279 | buildPhases = ( 280 | B9C923991C7410A2005D3FF4 /* Sources */, 281 | B9C9239A1C7410A2005D3FF4 /* Frameworks */, 282 | B9C9239B1C7410A2005D3FF4 /* Resources */, 283 | ); 284 | buildRules = ( 285 | ); 286 | dependencies = ( 287 | B9C9239F1C7410A2005D3FF4 /* PBXTargetDependency */, 288 | ); 289 | name = "超级无敌复活版帅气今日头条优化版无敌吊炸天UITests"; 290 | productName = "超级无敌复活版帅气今日头条优化版无敌吊炸天UITests"; 291 | productReference = B9C9239D1C7410A2005D3FF4 /* 超级无敌复活版帅气今日头条优化版无敌吊炸天UITests.xctest */; 292 | productType = "com.apple.product-type.bundle.ui-testing"; 293 | }; 294 | /* End PBXNativeTarget section */ 295 | 296 | /* Begin PBXProject section */ 297 | B9C923711C7410A2005D3FF4 /* Project object */ = { 298 | isa = PBXProject; 299 | attributes = { 300 | CLASSPREFIX = DN; 301 | LastUpgradeCheck = 0720; 302 | ORGANIZATIONNAME = iosqun328218600; 303 | TargetAttributes = { 304 | B9C923781C7410A2005D3FF4 = { 305 | CreatedOnToolsVersion = 7.2; 306 | }; 307 | B9C923911C7410A2005D3FF4 = { 308 | CreatedOnToolsVersion = 7.2; 309 | TestTargetID = B9C923781C7410A2005D3FF4; 310 | }; 311 | B9C9239C1C7410A2005D3FF4 = { 312 | CreatedOnToolsVersion = 7.2; 313 | TestTargetID = B9C923781C7410A2005D3FF4; 314 | }; 315 | }; 316 | }; 317 | buildConfigurationList = B9C923741C7410A2005D3FF4 /* Build configuration list for PBXProject "超级无敌复活版帅气今日头条优化版无敌吊炸天" */; 318 | compatibilityVersion = "Xcode 3.2"; 319 | developmentRegion = English; 320 | hasScannedForEncodings = 0; 321 | knownRegions = ( 322 | en, 323 | Base, 324 | ); 325 | mainGroup = B9C923701C7410A2005D3FF4; 326 | productRefGroup = B9C9237A1C7410A2005D3FF4 /* Products */; 327 | projectDirPath = ""; 328 | projectRoot = ""; 329 | targets = ( 330 | B9C923781C7410A2005D3FF4 /* 超级无敌复活版帅气今日头条优化版无敌吊炸天 */, 331 | B9C923911C7410A2005D3FF4 /* 超级无敌复活版帅气今日头条优化版无敌吊炸天Tests */, 332 | B9C9239C1C7410A2005D3FF4 /* 超级无敌复活版帅气今日头条优化版无敌吊炸天UITests */, 333 | ); 334 | }; 335 | /* End PBXProject section */ 336 | 337 | /* Begin PBXResourcesBuildPhase section */ 338 | B9C923771C7410A2005D3FF4 /* Resources */ = { 339 | isa = PBXResourcesBuildPhase; 340 | buildActionMask = 2147483647; 341 | files = ( 342 | B9C9238C1C7410A2005D3FF4 /* LaunchScreen.storyboard in Resources */, 343 | B9C923891C7410A2005D3FF4 /* Assets.xcassets in Resources */, 344 | B9C923871C7410A2005D3FF4 /* Main.storyboard in Resources */, 345 | ); 346 | runOnlyForDeploymentPostprocessing = 0; 347 | }; 348 | B9C923901C7410A2005D3FF4 /* Resources */ = { 349 | isa = PBXResourcesBuildPhase; 350 | buildActionMask = 2147483647; 351 | files = ( 352 | ); 353 | runOnlyForDeploymentPostprocessing = 0; 354 | }; 355 | B9C9239B1C7410A2005D3FF4 /* Resources */ = { 356 | isa = PBXResourcesBuildPhase; 357 | buildActionMask = 2147483647; 358 | files = ( 359 | ); 360 | runOnlyForDeploymentPostprocessing = 0; 361 | }; 362 | /* End PBXResourcesBuildPhase section */ 363 | 364 | /* Begin PBXSourcesBuildPhase section */ 365 | B9C923751C7410A2005D3FF4 /* Sources */ = { 366 | isa = PBXSourcesBuildPhase; 367 | buildActionMask = 2147483647; 368 | files = ( 369 | B98B505E1C7BF20400B54572 /* DNAddChannelView.m in Sources */, 370 | B9C923811C7410A2005D3FF4 /* AppDelegate.m in Sources */, 371 | B93A35271C74479700D68613 /* DNNavTabBarView.m in Sources */, 372 | F5A51EE31C7C3F4D00A19A5E /* DNFashionVC.m in Sources */, 373 | B93A35241C743CC800D68613 /* DNHorizontalSelectController.m in Sources */, 374 | F5A51EED1C7C3F5500A19A5E /* DNRecommendVC.m in Sources */, 375 | F5A51EE21C7C3F4D00A19A5E /* DNBeiJingViewController.m in Sources */, 376 | B9C9237E1C7410A2005D3FF4 /* main.m in Sources */, 377 | F5A51EF01C7C3F5500A19A5E /* DNVideoViewController.m in Sources */, 378 | F5A51EEE1C7C3F5500A19A5E /* DNSocietyViewController.m in Sources */, 379 | F5A51EE41C7C3F4D00A19A5E /* DNHomeViewController.m in Sources */, 380 | F5A51EF31C7C501700A19A5E /* DNChannelCollectionViewCell.m in Sources */, 381 | F5A51EEF1C7C3F5500A19A5E /* DNSubscriptionViewController.m in Sources */, 382 | F51221D01C86C6A6003AE2C0 /* DNNavTabBarModel.m in Sources */, 383 | ); 384 | runOnlyForDeploymentPostprocessing = 0; 385 | }; 386 | B9C9238E1C7410A2005D3FF4 /* Sources */ = { 387 | isa = PBXSourcesBuildPhase; 388 | buildActionMask = 2147483647; 389 | files = ( 390 | B9C923971C7410A2005D3FF4 /* _____________________Tests.m in Sources */, 391 | ); 392 | runOnlyForDeploymentPostprocessing = 0; 393 | }; 394 | B9C923991C7410A2005D3FF4 /* Sources */ = { 395 | isa = PBXSourcesBuildPhase; 396 | buildActionMask = 2147483647; 397 | files = ( 398 | B9C923A21C7410A2005D3FF4 /* _____________________UITests.m in Sources */, 399 | ); 400 | runOnlyForDeploymentPostprocessing = 0; 401 | }; 402 | /* End PBXSourcesBuildPhase section */ 403 | 404 | /* Begin PBXTargetDependency section */ 405 | B9C923941C7410A2005D3FF4 /* PBXTargetDependency */ = { 406 | isa = PBXTargetDependency; 407 | target = B9C923781C7410A2005D3FF4 /* 超级无敌复活版帅气今日头条优化版无敌吊炸天 */; 408 | targetProxy = B9C923931C7410A2005D3FF4 /* PBXContainerItemProxy */; 409 | }; 410 | B9C9239F1C7410A2005D3FF4 /* PBXTargetDependency */ = { 411 | isa = PBXTargetDependency; 412 | target = B9C923781C7410A2005D3FF4 /* 超级无敌复活版帅气今日头条优化版无敌吊炸天 */; 413 | targetProxy = B9C9239E1C7410A2005D3FF4 /* PBXContainerItemProxy */; 414 | }; 415 | /* End PBXTargetDependency section */ 416 | 417 | /* Begin PBXVariantGroup section */ 418 | B9C923851C7410A2005D3FF4 /* Main.storyboard */ = { 419 | isa = PBXVariantGroup; 420 | children = ( 421 | B9C923861C7410A2005D3FF4 /* Base */, 422 | ); 423 | name = Main.storyboard; 424 | sourceTree = ""; 425 | }; 426 | B9C9238A1C7410A2005D3FF4 /* LaunchScreen.storyboard */ = { 427 | isa = PBXVariantGroup; 428 | children = ( 429 | B9C9238B1C7410A2005D3FF4 /* Base */, 430 | ); 431 | name = LaunchScreen.storyboard; 432 | sourceTree = ""; 433 | }; 434 | /* End PBXVariantGroup section */ 435 | 436 | /* Begin XCBuildConfiguration section */ 437 | B9C923A41C7410A2005D3FF4 /* Debug */ = { 438 | isa = XCBuildConfiguration; 439 | buildSettings = { 440 | ALWAYS_SEARCH_USER_PATHS = NO; 441 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 442 | CLANG_CXX_LIBRARY = "libc++"; 443 | CLANG_ENABLE_MODULES = YES; 444 | CLANG_ENABLE_OBJC_ARC = YES; 445 | CLANG_WARN_BOOL_CONVERSION = YES; 446 | CLANG_WARN_CONSTANT_CONVERSION = YES; 447 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 448 | CLANG_WARN_EMPTY_BODY = YES; 449 | CLANG_WARN_ENUM_CONVERSION = YES; 450 | CLANG_WARN_INT_CONVERSION = YES; 451 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 452 | CLANG_WARN_UNREACHABLE_CODE = YES; 453 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 454 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 455 | COPY_PHASE_STRIP = NO; 456 | DEBUG_INFORMATION_FORMAT = dwarf; 457 | ENABLE_STRICT_OBJC_MSGSEND = YES; 458 | ENABLE_TESTABILITY = YES; 459 | GCC_C_LANGUAGE_STANDARD = gnu99; 460 | GCC_DYNAMIC_NO_PIC = NO; 461 | GCC_NO_COMMON_BLOCKS = YES; 462 | GCC_OPTIMIZATION_LEVEL = 0; 463 | GCC_PREPROCESSOR_DEFINITIONS = ( 464 | "DEBUG=1", 465 | "$(inherited)", 466 | ); 467 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 468 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 469 | GCC_WARN_UNDECLARED_SELECTOR = YES; 470 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 471 | GCC_WARN_UNUSED_FUNCTION = YES; 472 | GCC_WARN_UNUSED_VARIABLE = YES; 473 | IPHONEOS_DEPLOYMENT_TARGET = 9.2; 474 | MTL_ENABLE_DEBUG_INFO = YES; 475 | ONLY_ACTIVE_ARCH = YES; 476 | SDKROOT = iphoneos; 477 | TARGETED_DEVICE_FAMILY = "1,2"; 478 | }; 479 | name = Debug; 480 | }; 481 | B9C923A51C7410A2005D3FF4 /* Release */ = { 482 | isa = XCBuildConfiguration; 483 | buildSettings = { 484 | ALWAYS_SEARCH_USER_PATHS = NO; 485 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 486 | CLANG_CXX_LIBRARY = "libc++"; 487 | CLANG_ENABLE_MODULES = YES; 488 | CLANG_ENABLE_OBJC_ARC = YES; 489 | CLANG_WARN_BOOL_CONVERSION = YES; 490 | CLANG_WARN_CONSTANT_CONVERSION = YES; 491 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 492 | CLANG_WARN_EMPTY_BODY = YES; 493 | CLANG_WARN_ENUM_CONVERSION = YES; 494 | CLANG_WARN_INT_CONVERSION = YES; 495 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 496 | CLANG_WARN_UNREACHABLE_CODE = YES; 497 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 498 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 499 | COPY_PHASE_STRIP = NO; 500 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 501 | ENABLE_NS_ASSERTIONS = NO; 502 | ENABLE_STRICT_OBJC_MSGSEND = YES; 503 | GCC_C_LANGUAGE_STANDARD = gnu99; 504 | GCC_NO_COMMON_BLOCKS = YES; 505 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 506 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 507 | GCC_WARN_UNDECLARED_SELECTOR = YES; 508 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 509 | GCC_WARN_UNUSED_FUNCTION = YES; 510 | GCC_WARN_UNUSED_VARIABLE = YES; 511 | IPHONEOS_DEPLOYMENT_TARGET = 9.2; 512 | MTL_ENABLE_DEBUG_INFO = NO; 513 | SDKROOT = iphoneos; 514 | TARGETED_DEVICE_FAMILY = "1,2"; 515 | VALIDATE_PRODUCT = YES; 516 | }; 517 | name = Release; 518 | }; 519 | B9C923A71C7410A2005D3FF4 /* Debug */ = { 520 | isa = XCBuildConfiguration; 521 | buildSettings = { 522 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 523 | INFOPLIST_FILE = "超级无敌复活版帅气今日头条优化版无敌吊炸天/Info.plist"; 524 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 525 | PRODUCT_BUNDLE_IDENTIFIER = "jsmile.---------------------"; 526 | PRODUCT_NAME = "$(TARGET_NAME)"; 527 | }; 528 | name = Debug; 529 | }; 530 | B9C923A81C7410A2005D3FF4 /* Release */ = { 531 | isa = XCBuildConfiguration; 532 | buildSettings = { 533 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 534 | INFOPLIST_FILE = "超级无敌复活版帅气今日头条优化版无敌吊炸天/Info.plist"; 535 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 536 | PRODUCT_BUNDLE_IDENTIFIER = "jsmile.---------------------"; 537 | PRODUCT_NAME = "$(TARGET_NAME)"; 538 | }; 539 | name = Release; 540 | }; 541 | B9C923AA1C7410A2005D3FF4 /* Debug */ = { 542 | isa = XCBuildConfiguration; 543 | buildSettings = { 544 | BUNDLE_LOADER = "$(TEST_HOST)"; 545 | INFOPLIST_FILE = "超级无敌复活版帅气今日头条优化版无敌吊炸天Tests/Info.plist"; 546 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 547 | PRODUCT_BUNDLE_IDENTIFIER = "jsmile.---------------------Tests"; 548 | PRODUCT_NAME = "$(TARGET_NAME)"; 549 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/超级无敌复活版帅气今日头条优化版无敌吊炸天.app/超级无敌复活版帅气今日头条优化版无敌吊炸天"; 550 | }; 551 | name = Debug; 552 | }; 553 | B9C923AB1C7410A2005D3FF4 /* Release */ = { 554 | isa = XCBuildConfiguration; 555 | buildSettings = { 556 | BUNDLE_LOADER = "$(TEST_HOST)"; 557 | INFOPLIST_FILE = "超级无敌复活版帅气今日头条优化版无敌吊炸天Tests/Info.plist"; 558 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 559 | PRODUCT_BUNDLE_IDENTIFIER = "jsmile.---------------------Tests"; 560 | PRODUCT_NAME = "$(TARGET_NAME)"; 561 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/超级无敌复活版帅气今日头条优化版无敌吊炸天.app/超级无敌复活版帅气今日头条优化版无敌吊炸天"; 562 | }; 563 | name = Release; 564 | }; 565 | B9C923AD1C7410A2005D3FF4 /* Debug */ = { 566 | isa = XCBuildConfiguration; 567 | buildSettings = { 568 | INFOPLIST_FILE = "超级无敌复活版帅气今日头条优化版无敌吊炸天UITests/Info.plist"; 569 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 570 | PRODUCT_BUNDLE_IDENTIFIER = "jsmile.---------------------UITests"; 571 | PRODUCT_NAME = "$(TARGET_NAME)"; 572 | TEST_TARGET_NAME = "超级无敌复活版帅气今日头条优化版无敌吊炸天"; 573 | USES_XCTRUNNER = YES; 574 | }; 575 | name = Debug; 576 | }; 577 | B9C923AE1C7410A2005D3FF4 /* Release */ = { 578 | isa = XCBuildConfiguration; 579 | buildSettings = { 580 | INFOPLIST_FILE = "超级无敌复活版帅气今日头条优化版无敌吊炸天UITests/Info.plist"; 581 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 582 | PRODUCT_BUNDLE_IDENTIFIER = "jsmile.---------------------UITests"; 583 | PRODUCT_NAME = "$(TARGET_NAME)"; 584 | TEST_TARGET_NAME = "超级无敌复活版帅气今日头条优化版无敌吊炸天"; 585 | USES_XCTRUNNER = YES; 586 | }; 587 | name = Release; 588 | }; 589 | /* End XCBuildConfiguration section */ 590 | 591 | /* Begin XCConfigurationList section */ 592 | B9C923741C7410A2005D3FF4 /* Build configuration list for PBXProject "超级无敌复活版帅气今日头条优化版无敌吊炸天" */ = { 593 | isa = XCConfigurationList; 594 | buildConfigurations = ( 595 | B9C923A41C7410A2005D3FF4 /* Debug */, 596 | B9C923A51C7410A2005D3FF4 /* Release */, 597 | ); 598 | defaultConfigurationIsVisible = 0; 599 | defaultConfigurationName = Release; 600 | }; 601 | B9C923A61C7410A2005D3FF4 /* Build configuration list for PBXNativeTarget "超级无敌复活版帅气今日头条优化版无敌吊炸天" */ = { 602 | isa = XCConfigurationList; 603 | buildConfigurations = ( 604 | B9C923A71C7410A2005D3FF4 /* Debug */, 605 | B9C923A81C7410A2005D3FF4 /* Release */, 606 | ); 607 | defaultConfigurationIsVisible = 0; 608 | defaultConfigurationName = Release; 609 | }; 610 | B9C923A91C7410A2005D3FF4 /* Build configuration list for PBXNativeTarget "超级无敌复活版帅气今日头条优化版无敌吊炸天Tests" */ = { 611 | isa = XCConfigurationList; 612 | buildConfigurations = ( 613 | B9C923AA1C7410A2005D3FF4 /* Debug */, 614 | B9C923AB1C7410A2005D3FF4 /* Release */, 615 | ); 616 | defaultConfigurationIsVisible = 0; 617 | defaultConfigurationName = Release; 618 | }; 619 | B9C923AC1C7410A2005D3FF4 /* Build configuration list for PBXNativeTarget "超级无敌复活版帅气今日头条优化版无敌吊炸天UITests" */ = { 620 | isa = XCConfigurationList; 621 | buildConfigurations = ( 622 | B9C923AD1C7410A2005D3FF4 /* Debug */, 623 | B9C923AE1C7410A2005D3FF4 /* Release */, 624 | ); 625 | defaultConfigurationIsVisible = 0; 626 | defaultConfigurationName = Release; 627 | }; 628 | /* End XCConfigurationList section */ 629 | }; 630 | rootObject = B9C923711C7410A2005D3FF4 /* Project object */; 631 | } 632 | -------------------------------------------------------------------------------- /超级无敌复活版帅气今日头条优化版无敌吊炸天.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /超级无敌复活版帅气今日头条优化版无敌吊炸天.xcodeproj/project.xcworkspace/xcuserdata/gaoshiyue.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiecoding/BeyondJRTT/5bd4f1024a3d8e109f58e2f62d8bdb3675c98e45/超级无敌复活版帅气今日头条优化版无敌吊炸天.xcodeproj/project.xcworkspace/xcuserdata/gaoshiyue.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /超级无敌复活版帅气今日头条优化版无敌吊炸天.xcodeproj/project.xcworkspace/xcuserdata/keep.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiecoding/BeyondJRTT/5bd4f1024a3d8e109f58e2f62d8bdb3675c98e45/超级无敌复活版帅气今日头条优化版无敌吊炸天.xcodeproj/project.xcworkspace/xcuserdata/keep.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /超级无敌复活版帅气今日头条优化版无敌吊炸天.xcodeproj/project.xcworkspace/xcuserdata/rongtong.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiecoding/BeyondJRTT/5bd4f1024a3d8e109f58e2f62d8bdb3675c98e45/超级无敌复活版帅气今日头条优化版无敌吊炸天.xcodeproj/project.xcworkspace/xcuserdata/rongtong.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /超级无敌复活版帅气今日头条优化版无敌吊炸天.xcodeproj/xcuserdata/gaoshiyue.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 8 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /超级无敌复活版帅气今日头条优化版无敌吊炸天.xcodeproj/xcuserdata/gaoshiyue.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | 超级无敌复活版帅气今日头条优化版无敌吊炸天.xcscheme 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | SuppressBuildableAutocreation 14 | 15 | B9C923781C7410A2005D3FF4 16 | 17 | primary 18 | 19 | 20 | B9C923911C7410A2005D3FF4 21 | 22 | primary 23 | 24 | 25 | B9C9239C1C7410A2005D3FF4 26 | 27 | primary 28 | 29 | 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /超级无敌复活版帅气今日头条优化版无敌吊炸天.xcodeproj/xcuserdata/gaoshiyue.xcuserdatad/xcschemes/超级无敌复活版帅气今日头条优化版无敌吊炸天.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 33 | 39 | 40 | 41 | 43 | 49 | 50 | 51 | 52 | 53 | 59 | 60 | 61 | 62 | 63 | 64 | 74 | 76 | 82 | 83 | 84 | 85 | 86 | 87 | 93 | 95 | 101 | 102 | 103 | 104 | 106 | 107 | 110 | 111 | 112 | -------------------------------------------------------------------------------- /超级无敌复活版帅气今日头条优化版无敌吊炸天.xcodeproj/xcuserdata/keep.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | 超级无敌复活版帅气今日头条优化版无敌吊炸天.xcscheme 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | SuppressBuildableAutocreation 14 | 15 | B9C923781C7410A2005D3FF4 16 | 17 | primary 18 | 19 | 20 | B9C923911C7410A2005D3FF4 21 | 22 | primary 23 | 24 | 25 | B9C9239C1C7410A2005D3FF4 26 | 27 | primary 28 | 29 | 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /超级无敌复活版帅气今日头条优化版无敌吊炸天.xcodeproj/xcuserdata/keep.xcuserdatad/xcschemes/超级无敌复活版帅气今日头条优化版无敌吊炸天.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 33 | 39 | 40 | 41 | 43 | 49 | 50 | 51 | 52 | 53 | 59 | 60 | 61 | 62 | 63 | 64 | 74 | 76 | 82 | 83 | 84 | 85 | 86 | 87 | 93 | 95 | 101 | 102 | 103 | 104 | 106 | 107 | 110 | 111 | 112 | -------------------------------------------------------------------------------- /超级无敌复活版帅气今日头条优化版无敌吊炸天.xcodeproj/xcuserdata/rongtong.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 8 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /超级无敌复活版帅气今日头条优化版无敌吊炸天.xcodeproj/xcuserdata/rongtong.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | 超级无敌复活版帅气今日头条优化版无敌吊炸天.xcscheme 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | SuppressBuildableAutocreation 14 | 15 | B9C923781C7410A2005D3FF4 16 | 17 | primary 18 | 19 | 20 | B9C923911C7410A2005D3FF4 21 | 22 | primary 23 | 24 | 25 | B9C9239C1C7410A2005D3FF4 26 | 27 | primary 28 | 29 | 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /超级无敌复活版帅气今日头条优化版无敌吊炸天.xcodeproj/xcuserdata/rongtong.xcuserdatad/xcschemes/超级无敌复活版帅气今日头条优化版无敌吊炸天.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 33 | 39 | 40 | 41 | 43 | 49 | 50 | 51 | 52 | 53 | 59 | 60 | 61 | 62 | 63 | 64 | 74 | 76 | 82 | 83 | 84 | 85 | 86 | 87 | 93 | 95 | 101 | 102 | 103 | 104 | 106 | 107 | 110 | 111 | 112 | -------------------------------------------------------------------------------- /超级无敌复活版帅气今日头条优化版无敌吊炸天/AppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.h 3 | // 超级无敌复活版帅气今日头条优化版无敌吊炸天 4 | // 5 | // Created by rongtong on 16/2/17. 6 | // Copyright © 2016年 iosqun328218600. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface AppDelegate : UIResponder 12 | 13 | @property (strong, nonatomic) UIWindow *window; 14 | 15 | 16 | @end 17 | 18 | -------------------------------------------------------------------------------- /超级无敌复活版帅气今日头条优化版无敌吊炸天/AppDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.m 3 | // 超级无敌复活版帅气今日头条优化版无敌吊炸天 4 | // 5 | // Created by rongtong on 16/2/17. 6 | // Copyright © 2016年 iosqun328218600. All rights reserved. 7 | // 8 | 9 | #import "AppDelegate.h" 10 | #import "DNHomeViewController.h" 11 | @interface AppDelegate () 12 | 13 | @end 14 | 15 | @implementation AppDelegate 16 | 17 | 18 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 19 | 20 | 21 | DNHomeViewController *homeVC = [[DNHomeViewController alloc] init]; 22 | 23 | UITabBarController *dNTabbarController = [[UITabBarController alloc] init]; 24 | UINavigationController *nav = [[UINavigationController alloc] init]; 25 | 26 | nav.viewControllers = @[homeVC]; 27 | dNTabbarController.viewControllers = @[nav]; 28 | 29 | self.window.rootViewController = dNTabbarController; 30 | 31 | 32 | return YES; 33 | } 34 | 35 | - (void)applicationWillResignActive:(UIApplication *)application { 36 | // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. 37 | // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. 38 | } 39 | 40 | - (void)applicationDidEnterBackground:(UIApplication *)application { 41 | // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 42 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 43 | } 44 | 45 | - (void)applicationWillEnterForeground:(UIApplication *)application { 46 | // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. 47 | } 48 | 49 | - (void)applicationDidBecomeActive:(UIApplication *)application { 50 | // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. 51 | } 52 | 53 | - (void)applicationWillTerminate:(UIApplication *)application { 54 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 55 | } 56 | 57 | @end 58 | -------------------------------------------------------------------------------- /超级无敌复活版帅气今日头条优化版无敌吊炸天/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "29x29", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "29x29", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "40x40", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "40x40", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "60x60", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "60x60", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "idiom" : "ipad", 35 | "size" : "29x29", 36 | "scale" : "1x" 37 | }, 38 | { 39 | "idiom" : "ipad", 40 | "size" : "29x29", 41 | "scale" : "2x" 42 | }, 43 | { 44 | "idiom" : "ipad", 45 | "size" : "40x40", 46 | "scale" : "1x" 47 | }, 48 | { 49 | "idiom" : "ipad", 50 | "size" : "40x40", 51 | "scale" : "2x" 52 | }, 53 | { 54 | "idiom" : "ipad", 55 | "size" : "76x76", 56 | "scale" : "1x" 57 | }, 58 | { 59 | "idiom" : "ipad", 60 | "size" : "76x76", 61 | "scale" : "2x" 62 | }, 63 | { 64 | "idiom" : "ipad", 65 | "size" : "83.5x83.5", 66 | "scale" : "2x" 67 | } 68 | ], 69 | "info" : { 70 | "version" : 1, 71 | "author" : "xcode" 72 | } 73 | } -------------------------------------------------------------------------------- /超级无敌复活版帅气今日头条优化版无敌吊炸天/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /超级无敌复活版帅气今日头条优化版无敌吊炸天/Assets.xcassets/btn_navigation_back.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "btn_navigation_back@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 | } -------------------------------------------------------------------------------- /超级无敌复活版帅气今日头条优化版无敌吊炸天/Assets.xcassets/btn_navigation_back.imageset/btn_navigation_back@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiecoding/BeyondJRTT/5bd4f1024a3d8e109f58e2f62d8bdb3675c98e45/超级无敌复活版帅气今日头条优化版无敌吊炸天/Assets.xcassets/btn_navigation_back.imageset/btn_navigation_back@2x.png -------------------------------------------------------------------------------- /超级无敌复活版帅气今日头条优化版无敌吊炸天/Assets.xcassets/btn_navigation_close.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "btn_navigation_close@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 | } -------------------------------------------------------------------------------- /超级无敌复活版帅气今日头条优化版无敌吊炸天/Assets.xcassets/btn_navigation_close.imageset/btn_navigation_close@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiecoding/BeyondJRTT/5bd4f1024a3d8e109f58e2f62d8bdb3675c98e45/超级无敌复活版帅气今日头条优化版无敌吊炸天/Assets.xcassets/btn_navigation_close.imageset/btn_navigation_close@2x.png -------------------------------------------------------------------------------- /超级无敌复活版帅气今日头条优化版无敌吊炸天/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /超级无敌复活版帅气今日头条优化版无敌吊炸天/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /超级无敌复活版帅气今日头条优化版无敌吊炸天/DNBeiJingViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // DNBeiJingViewController.h 3 | // 超级无敌复活版帅气今日头条优化版无敌吊炸天 4 | // 5 | // Created by rongtong on 16/2/18. 6 | // Copyright © 2016年 iosqun328218600. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface DNBeiJingViewController : UIViewController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /超级无敌复活版帅气今日头条优化版无敌吊炸天/DNBeiJingViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // DNBeiJingViewController.m 3 | // 超级无敌复活版帅气今日头条优化版无敌吊炸天 4 | // 5 | // Created by rongtong on 16/2/18. 6 | // Copyright © 2016年 iosqun328218600. All rights reserved. 7 | // 8 | 9 | #import "DNBeiJingViewController.h" 10 | 11 | @interface DNBeiJingViewController () 12 | 13 | @end 14 | 15 | @implementation DNBeiJingViewController 16 | 17 | - (void)viewDidLoad { 18 | [super viewDidLoad]; 19 | // Do any additional setup after loading the view. 20 | 21 | self.view.backgroundColor= [UIColor greenColor]; 22 | } 23 | 24 | - (void)didReceiveMemoryWarning { 25 | [super didReceiveMemoryWarning]; 26 | // Dispose of any resources that can be recreated. 27 | } 28 | 29 | /* 30 | #pragma mark - Navigation 31 | 32 | // In a storyboard-based application, you will often want to do a little preparation before navigation 33 | - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 34 | // Get the new view controller using [segue destinationViewController]. 35 | // Pass the selected object to the new view controller. 36 | } 37 | */ 38 | 39 | @end 40 | -------------------------------------------------------------------------------- /超级无敌复活版帅气今日头条优化版无敌吊炸天/DNFashionVC.h: -------------------------------------------------------------------------------- 1 | // 2 | // DNFashionVC.h 3 | // 超级无敌复活版帅气今日头条优化版无敌吊炸天 4 | // 5 | // Created by rongtong on 16/2/17. 6 | // Copyright © 2016年 iosqun328218600. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface DNFashionVC : UIViewController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /超级无敌复活版帅气今日头条优化版无敌吊炸天/DNFashionVC.m: -------------------------------------------------------------------------------- 1 | // 2 | // DNFashionVC.m 3 | // 超级无敌复活版帅气今日头条优化版无敌吊炸天 4 | // 5 | // Created by rongtong on 16/2/17. 6 | // Copyright © 2016年 iosqun328218600. All rights reserved. 7 | // 8 | 9 | #import "DNFashionVC.h" 10 | 11 | @interface DNFashionVC () 12 | 13 | @end 14 | 15 | @implementation DNFashionVC 16 | 17 | - (void)viewDidLoad { 18 | [super viewDidLoad]; 19 | // Do any additional setup after loading the view. 20 | 21 | self.view.backgroundColor = [UIColor purpleColor]; 22 | } 23 | 24 | - (void)didReceiveMemoryWarning { 25 | [super didReceiveMemoryWarning]; 26 | // Dispose of any resources that can be recreated. 27 | } 28 | 29 | /* 30 | #pragma mark - Navigation 31 | 32 | // In a storyboard-based application, you will often want to do a little preparation before navigation 33 | - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 34 | // Get the new view controller using [segue destinationViewController]. 35 | // Pass the selected object to the new view controller. 36 | } 37 | */ 38 | 39 | @end 40 | -------------------------------------------------------------------------------- /超级无敌复活版帅气今日头条优化版无敌吊炸天/DNHomeViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // DNHomeViewController.h 3 | // 超级无敌复活版帅气今日头条优化版无敌吊炸天 4 | // 5 | // Created by rongtong on 16/2/17. 6 | // Copyright © 2016年 iosqun328218600. All rights reserved. 7 | // 8 | 9 | #import 10 | @interface DNHomeViewController : UIViewController 11 | 12 | @end 13 | -------------------------------------------------------------------------------- /超级无敌复活版帅气今日头条优化版无敌吊炸天/DNHomeViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // DNHomeViewController.m 3 | // 超级无敌复活版帅气今日头条优化版无敌吊炸天 4 | // 5 | // Created by rongtong on 16/2/17. 6 | // Copyright © 2016年 iosqun328218600. All rights reserved. 7 | // 8 | 9 | #import "DNHomeViewController.h" 10 | #import "DNHorizontalSelectController.h" 11 | #import "DNRecommendVC.h" 12 | #import "DNFashionVC.h" 13 | #import "DNBeiJingViewController.h" 14 | #import "DNVideoViewController.h" 15 | #import "DNSocietyViewController.h" 16 | #import "DNSubscriptionViewController.h" 17 | #import "DNNavTabBarModel.h" 18 | @interface DNHomeViewController () 19 | 20 | @property(nonatomic,strong) NSMutableArray *tabBarModelArrMy; 21 | 22 | @property(nonatomic,weak) DNHorizontalSelectController *horizontalController; 23 | 24 | @end 25 | 26 | @implementation DNHomeViewController 27 | 28 | 29 | 30 | - (void)viewDidLoad { 31 | [super viewDidLoad]; 32 | // Do any additional setup after loading the view. 33 | self.view.backgroundColor = [UIColor orangeColor]; 34 | 35 | NSArray *controllClassNames = @[@"DNRecommendVC",@"DNFashionVC",@"DNBeiJingViewController",@"DNVideoViewController",@"DNSocietyViewController",@"DNSubscriptionViewController"]; 36 | 37 | 38 | NSArray *tabBarTitles = @[@"推荐",@"热点",@"北京",@"视频",@"社会",@"订阅"]; 39 | 40 | 41 | NSMutableArray *tabBarArray = [NSMutableArray array]; 42 | for (int i = 0; i < controllClassNames.count; i++) { 43 | DNNavTabBarModel *model = [[DNNavTabBarModel alloc]init]; 44 | model.controllerName = controllClassNames[i]; 45 | model.titleName = tabBarTitles[i]; 46 | [tabBarArray addObject:model]; 47 | } 48 | 49 | self.tabBarModelArrMy = tabBarArray; 50 | 51 | [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(upDateTitlesWith:) name:@"relodDateTitles" object:nil]; 52 | 53 | 54 | // [self developmentControllClassNames:controllClassNames tabBarTitles:tabBarTitles]; 55 | 56 | 57 | } 58 | 59 | 60 | -(void)setTabBarModelArrMy:(NSMutableArray *)tabBarModelArrMy{ 61 | _tabBarModelArrMy = [tabBarModelArrMy copy]; 62 | 63 | NSMutableArray *vcObjects = [[NSMutableArray alloc] initWithCapacity:_tabBarModelArrMy.count]; 64 | 65 | for(int i = 0; i < [_tabBarModelArrMy count]; i++){ 66 | DNNavTabBarModel *vcModel = [_tabBarModelArrMy objectAtIndex:i]; 67 | UIViewController *viewVCCtrl = [NSClassFromString(vcModel.controllerName) new]; 68 | viewVCCtrl.title = vcModel.titleName; 69 | [vcObjects addObject:viewVCCtrl]; 70 | } 71 | 72 | DNHorizontalSelectController *horizontalController = [[DNHorizontalSelectController alloc] init]; 73 | 74 | horizontalController.subViewControllers = vcObjects; 75 | 76 | [horizontalController addParentController:self]; 77 | 78 | self.horizontalController = horizontalController; 79 | 80 | } 81 | 82 | //// 改 83 | //- (void)developmentControllClassNames:(NSArray *)controllClassNames tabBarTitles:(NSArray *)arrTitles 84 | //{ 85 | // NSMutableArray *vcObjects = [[NSMutableArray alloc] initWithCapacity:controllClassNames.count]; 86 | // 87 | // for(int i = 0; i < [controllClassNames count]; i++){ 88 | // UIViewController *viewVCCtrl = [NSClassFromString([controllClassNames objectAtIndex:i]) new]; 89 | // viewVCCtrl.title = [arrTitles objectAtIndex:i]; 90 | // [vcObjects addObject:viewVCCtrl]; 91 | // } 92 | // 93 | // DNHorizontalSelectController *horizontalController = [[DNHorizontalSelectController alloc] init]; 94 | // 95 | // horizontalController.subViewControllers =vcObjects; 96 | // 97 | // [horizontalController addParentController:self]; 98 | // 99 | //} 100 | // 101 | 102 | -(void)upDateTitlesWith:(NSNotification *)notification{ 103 | 104 | 105 | NSArray *titles = notification.object; 106 | 107 | NSLog(@"%@",titles); 108 | 109 | NSMutableArray *titlesArray = [NSMutableArray array]; 110 | 111 | for (int i = 0; i < titles.count; i++) { 112 | 113 | NSString *str = titles[i]; 114 | for (DNNavTabBarModel *vcModel in self.tabBarModelArrMy) { 115 | if ([vcModel.titleName isEqualToString:str]) { 116 | 117 | [titlesArray addObject:vcModel]; 118 | break; 119 | } 120 | } 121 | } 122 | 123 | self.tabBarModelArrMy = titlesArray; 124 | 125 | NSMutableArray *vcObjects = [[NSMutableArray alloc] initWithCapacity:self.tabBarModelArrMy.count]; 126 | 127 | 128 | 129 | for(int i = 0; i < [self.tabBarModelArrMy count]; i++){ 130 | DNNavTabBarModel *vcModel = [self.tabBarModelArrMy objectAtIndex:i]; 131 | UIViewController *viewVCCtrl = [NSClassFromString(vcModel.controllerName) new]; 132 | viewVCCtrl.title = vcModel.titleName; 133 | [vcObjects addObject:viewVCCtrl]; 134 | } 135 | 136 | self.horizontalController.subViewControllers = @[]; 137 | 138 | self.horizontalController.subViewControllers = vcObjects; 139 | 140 | [self.horizontalController addParentController:self]; 141 | 142 | } 143 | 144 | - (void)didReceiveMemoryWarning { 145 | [super didReceiveMemoryWarning]; 146 | // Dispose of any resources that can be recreated. 147 | } 148 | 149 | 150 | @end 151 | -------------------------------------------------------------------------------- /超级无敌复活版帅气今日头条优化版无敌吊炸天/DNHorizontalSelectController/DNHorizontalSelectController.h: -------------------------------------------------------------------------------- 1 | // 2 | // DNHorizontalSelectController.h 3 | // 超级无敌复活版帅气今日头条优化版无敌吊炸天 4 | // 5 | // Created by rongtong on 16/2/17. 6 | // Copyright © 2016年 iosqun328218600. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "DNNavTabBarView.h" 11 | @interface DNHorizontalSelectController : UIViewController 12 | 13 | //B类管理的子控制器 14 | @property (strong,nonatomic)NSArray *subViewControllers; 15 | 16 | //添加父母层级 17 | - (void)addParentController:(UIViewController *)viewController; 18 | 19 | @end 20 | -------------------------------------------------------------------------------- /超级无敌复活版帅气今日头条优化版无敌吊炸天/DNHorizontalSelectController/DNHorizontalSelectController.m: -------------------------------------------------------------------------------- 1 | // 2 | // DNHorizontalSelectController.m 3 | // 超级无敌复活版帅气今日头条优化版无敌吊炸天 4 | // 5 | // Created by rongtong on 16/2/17. 6 | // Copyright © 2016年 iosqun328218600. All rights reserved. 7 | // 8 | 9 | #import "DNHorizontalSelectController.h" 10 | #import "DNFashionVC.h" 11 | #import "DNAddChannelView.h" 12 | @interface DNHorizontalSelectController () 13 | { 14 | NSMutableArray *_channelTitles; 15 | } 16 | //导航栏的类似tabbar的View 17 | @property (strong,nonatomic)DNNavTabBarView *navTabbarView; 18 | 19 | //B类 控制器上添加 滚动的mainView 20 | @property (nonatomic, strong) UIScrollView *mainScrollView; 21 | 22 | @end 23 | 24 | @implementation DNHorizontalSelectController 25 | 26 | - (void)viewDidLoad { 27 | [super viewDidLoad]; 28 | // Do any additional setup after loading the view. 29 | 30 | self.view.backgroundColor = [UIColor cyanColor]; 31 | 32 | _navTabbarView = [[DNNavTabBarView alloc] initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, 44)]; 33 | // _navTabbarView.backgroundColor = [UIColor blueColor]; 34 | _navTabbarView.delegate = self; 35 | 36 | [self.navigationController.navigationBar addSubview:_navTabbarView]; 37 | 38 | UIButton *addImageButton = [UIButton buttonWithType:UIButtonTypeCustom]; 39 | addImageButton.frame = CGRectMake(self.view.frame.size.width - 40, 0, 44, 44); 40 | [addImageButton setBackgroundImage:[UIImage imageNamed:@"btn_navigation_close"] forState:UIControlStateNormal]; 41 | [addImageButton addTarget:self action:@selector(addButtonClick:) forControlEvents:UIControlEventTouchUpInside]; 42 | [self.navigationController.navigationBar addSubview:addImageButton]; 43 | 44 | 45 | self.navigationController.navigationBar.barTintColor = [UIColor colorWithRed:200/255.0f green:40/255.0f blue:47/255.0f alpha:1]; 46 | 47 | [[UINavigationBar appearance] setBackgroundImage:[[UIImage alloc] init] forBarMetrics:UIBarMetricsDefault]; 48 | 49 | [[UINavigationBar appearance] setShadowImage:[[UIImage alloc] init]]; 50 | 51 | _mainScrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)]; 52 | _mainScrollView.delegate = self; 53 | 54 | // _mainScrollView.backgroundColor = [UIColor yellowColor]; 55 | _mainScrollView.contentSize = CGSizeMake(self.view.frame.size.width *_subViewControllers.count, self.view.frame.size.height); 56 | _mainScrollView.showsHorizontalScrollIndicator = NO; 57 | _mainScrollView.bounces = NO; 58 | _mainScrollView.pagingEnabled = YES; 59 | [self.view addSubview:_mainScrollView]; 60 | 61 | 62 | [self subViewControllersManage]; 63 | 64 | _navTabbarView.previouslySelect =round(_mainScrollView.contentOffset.x / self.view.frame.size.width); 65 | //如果不写这句话 下面block里就会出现 :capturing 'self' strongly in this block is like 在ARC下不用__block 而是用 __weak 为了避免出现循环引用 66 | /* 67 | 为什么用循环引用没有报错,没报错 因为现在是arc啊 runloop里有autoreleasepool啊 68 | */ 69 | __weak DNHorizontalSelectController * weakSelf = self; 70 | _navTabbarView.updateTabBarSelectBlock = ^(NSInteger index) 71 | { 72 | index = index%1000; 73 | 74 | weakSelf.mainScrollView.contentOffset = CGPointMake(self.view.frame.size.width*index, 0); 75 | }; 76 | 77 | } 78 | 79 | - (void)addButtonClick:(UIButton *)button 80 | { 81 | DNAddChannelView *addChannelView = [[DNAddChannelView alloc] initWithFrame:self.view.frame]; 82 | addChannelView.myChannelTitles = _channelTitles; 83 | [addChannelView show]; 84 | } 85 | 86 | - (void)scrollViewDidScroll:(UIScrollView *)scrollView 87 | { 88 | _navTabbarView.selectIndex = round(scrollView.contentOffset.x / self.view.frame.size.width); 89 | [_navTabbarView scrollviewSelectButton]; 90 | 91 | _navTabbarView.previouslySelect = _navTabbarView.selectIndex; 92 | } 93 | 94 | - (void)subViewControllersManage 95 | { 96 | 97 | _channelTitles = [[NSMutableArray alloc] initWithCapacity:_subViewControllers.count]; 98 | 99 | for (int index = 0; index < _subViewControllers.count; index++) { 100 | UIViewController *viewController = (UIViewController *)_subViewControllers[index]; 101 | viewController.view.frame =CGRectMake(self.view.frame.size.width * index, 0,[UIScreen mainScreen].bounds.size.width, _mainScrollView.frame.size.height); 102 | [_mainScrollView addSubview:viewController.view]; 103 | [self addChildViewController:viewController]; 104 | 105 | NSString *titleStr = [_subViewControllers[index] title]; 106 | [_channelTitles addObject:titleStr]; 107 | } 108 | 109 | [_navTabbarView addTabbarButtonAndButtonTitles:@[] controllClassNames:@[]]; 110 | 111 | [_navTabbarView addTabbarButtonAndButtonTitles:_channelTitles controllClassNames:_subViewControllers]; 112 | 113 | 114 | } 115 | 116 | 117 | 118 | - (void)navTabBarView:(DNNavTabBarView *)navTabBarView didSelectIndex:(NSInteger )index 119 | { 120 | index = index%1000; 121 | 122 | _mainScrollView.contentOffset = CGPointMake(self.view.frame.size.width*index, 0); 123 | } 124 | // 125 | 126 | - (void)addParentController:(UIViewController *)viewController 127 | { 128 | [viewController addChildViewController:self]; 129 | [viewController.view addSubview:self.view]; 130 | } 131 | 132 | - (void)didReceiveMemoryWarning { 133 | [super didReceiveMemoryWarning]; 134 | // Dispose of any resources that can be recreated. 135 | } 136 | 137 | @end 138 | -------------------------------------------------------------------------------- /超级无敌复活版帅气今日头条优化版无敌吊炸天/DNHorizontalSelectController/DNNavTabBarView.h: -------------------------------------------------------------------------------- 1 | // 2 | // DNNavTabBarView.h 3 | // 超级无敌复活版帅气今日头条优化版无敌吊炸天 4 | // 5 | // Created by rongtong on 16/2/17. 6 | // Copyright © 2016年 iosqun328218600. All rights reserved. 7 | // 8 | 9 | #import 10 | @class DNNavTabBarView; 11 | @protocol NavTabBarViewSelectDelegate 12 | /* block和delegate对比,生命周期的还是用delegate比较好 block用不好 问题比较多 block用好了是神器..用不好就是利器.. 13 | 代理是有必须实现和选择实现 block做不到这个功能 这也是tableview 必须用代理的原因 14 | */ 15 | @required 16 | 17 | - (void)navTabBarView:(DNNavTabBarView *)navTabBarView didSelectIndex:(NSInteger )index; 18 | 19 | @end 20 | 21 | 22 | @interface DNNavTabBarView : UIView 23 | 24 | //@property(nonatomic) NSUInteger selectedIndex; 25 | 26 | //nullable : 标示当前属性可能为空,让外界使用时注意 27 | 28 | @property (nonatomic,weak) id delegate; 29 | //block 30 | typedef void (^NavTabBarSelectBlock)(NSInteger index); 31 | /* 32 | 我将block声明为copy的原因是在代码块里面我可能会使用一些本地变量。而block一开始是放在栈上的,只有copy后才会放到堆上。 33 | */ 34 | @property (nonatomic, copy) NavTabBarSelectBlock updateTabBarSelectBlock; 35 | 36 | //@property (nonatomic,strong)NSMutableArray *titles; 37 | 38 | @property (nonatomic)NSInteger selectIndex; 39 | 40 | @property (nonatomic)NSInteger previouslySelect; 41 | 42 | - (void)addTabbarButtonAndButtonTitles:(NSArray *)titles controllClassNames:(NSArray *)controllClassNames; 43 | 44 | //@property (nonatomic,strong) NSArray *titles; 45 | 46 | - (instancetype)initWithTitle:(nullable NSString *)title image:(nullable UIImage *)image tag:(NSInteger)tag; 47 | 48 | - (void)scrollviewSelectButton; 49 | @end 50 | -------------------------------------------------------------------------------- /超级无敌复活版帅气今日头条优化版无敌吊炸天/DNHorizontalSelectController/DNNavTabBarView.m: -------------------------------------------------------------------------------- 1 | // 2 | // DNNavTabBarView.m 3 | // 超级无敌复活版帅气今日头条优化版无敌吊炸天 4 | // 5 | // Created by rongtong on 16/2/17. 6 | // Copyright © 2016年 iosqun328218600. All rights reserved. 7 | // 8 | 9 | #import "DNNavTabBarView.h" 10 | #import "DNNavTabBarModel.h" 11 | 12 | 13 | @interface DNNavTabBarView () 14 | 15 | @property(nonatomic,assign) CGFloat scrollCurrentMinX; 16 | 17 | @property(nonatomic,assign) CGFloat scrollCurrentMaxX; 18 | 19 | @property (nonatomic,strong) UIScrollView *tabbarScrollview; 20 | 21 | @end 22 | 23 | @implementation DNNavTabBarView 24 | 25 | /* 26 | // Only override drawRect: if you perform custom drawing. 27 | // An empty implementation adversely affects performance during animation. 28 | */ 29 | - (instancetype)initWithFrame:(CGRect)frame 30 | { 31 | if(self = [super initWithFrame:frame]) 32 | { 33 | _selectIndex = 0; 34 | 35 | [self addView]; 36 | } 37 | return self; 38 | } 39 | - (void)addView 40 | { 41 | _tabbarScrollview = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, self.frame.size.width - 34, self.frame.size.height)]; 42 | _scrollCurrentMinX = 0; 43 | 44 | 45 | 46 | _scrollCurrentMaxX = self.frame.size.width - 34; 47 | 48 | // _tabbarScrollview.backgroundColor = [UIColor darkGrayColor]; 49 | 50 | _tabbarScrollview.showsHorizontalScrollIndicator= YES; 51 | 52 | _tabbarScrollview.contentSize = CGSizeMake(self.frame.size.width *2, self.frame.size.height); 53 | 54 | [self addSubview:_tabbarScrollview]; 55 | 56 | 57 | } 58 | // 59 | //-(void)setTitles:(NSArray *)titles{ 60 | // 61 | // _titles = titles; 62 | // 63 | // int buttonX = 10; 64 | // for (int i = 0; i _scrollCurrentMaxX) { 149 | 150 | }else{ 151 | 152 | if (_previouslySelect > _selectIndex) { 153 | // 上一个点大于当前点 当前 x 于 最小值比 154 | CGFloat currentBtnX = _selectIndex * 60; 155 | 156 | if (_scrollCurrentMinX > currentBtnX) { 157 | CGPoint position = CGPointMake(currentBtnX - 10, 0); 158 | [_tabbarScrollview setContentOffset:position animated:YES]; 159 | // - 160 | 161 | CGFloat Dvalue = _scrollCurrentMinX - currentBtnX; 162 | 163 | _scrollCurrentMinX -= Dvalue; 164 | 165 | _scrollCurrentMaxX -= Dvalue; 166 | 167 | } 168 | 169 | }else if (_previouslySelect < _selectIndex){ 170 | // 上一个点小于当前点 当前 x 于 最大值比 171 | CGFloat currentBtnX = ((_selectIndex +1) * 60) ; 172 | if (_scrollCurrentMaxX < currentBtnX) { 173 | 174 | NSLog(@"%f",CGRectGetMaxX(selectBtn.frame)); 175 | 176 | CGPoint position = CGPointMake((currentBtnX - _scrollCurrentMaxX) +10, 0); 177 | [_tabbarScrollview setContentOffset:position animated:YES]; 178 | 179 | CGFloat value = currentBtnX -_scrollCurrentMaxX ; 180 | 181 | _scrollCurrentMinX += value; 182 | 183 | _scrollCurrentMaxX += value; 184 | 185 | } 186 | } 187 | 188 | } 189 | 190 | } 191 | 192 | 193 | @end 194 | -------------------------------------------------------------------------------- /超级无敌复活版帅气今日头条优化版无敌吊炸天/DNRecommendVC.h: -------------------------------------------------------------------------------- 1 | // 2 | // DNRecommendVC.h 3 | // 超级无敌复活版帅气今日头条优化版无敌吊炸天 4 | // 5 | // Created by rongtong on 16/2/17. 6 | // Copyright © 2016年 iosqun328218600. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface DNRecommendVC : UIViewController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /超级无敌复活版帅气今日头条优化版无敌吊炸天/DNRecommendVC.m: -------------------------------------------------------------------------------- 1 | // 2 | // DNRecommendVC.m 3 | // 超级无敌复活版帅气今日头条优化版无敌吊炸天 4 | // 5 | // Created by rongtong on 16/2/17. 6 | // Copyright © 2016年 iosqun328218600. All rights reserved. 7 | // 8 | 9 | #import "DNRecommendVC.h" 10 | 11 | @interface DNRecommendVC () 12 | 13 | @end 14 | 15 | @implementation DNRecommendVC 16 | 17 | - (void)viewDidLoad { 18 | [super viewDidLoad]; 19 | // Do any additional setup after loading the view. 20 | 21 | UITableView *_tableview = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width,self.view.frame.size.height)]; 22 | _tableview.delegate =self; 23 | _tableview.dataSource= self; 24 | [self.view addSubview:_tableview]; 25 | } 26 | 27 | 28 | 29 | - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 30 | { 31 | return 1; 32 | } 33 | 34 | - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 35 | { 36 | //使用static会将字符串放到静态区,程序运行过程中,只会初始化一次,作为cell的重用标识一般使用static修饰,确保能是cell进行重用 37 | 38 | static NSString *cellIdentifier = @"cellIdentifier"; 39 | UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; 40 | 41 | if(!cell) 42 | { 43 | cell = [[UITableViewCell alloc] init]; 44 | } 45 | 46 | return cell; 47 | 48 | } 49 | 50 | - (void)didReceiveMemoryWarning { 51 | [super didReceiveMemoryWarning]; 52 | // Dispose of any resources that can be recreated. 53 | } 54 | 55 | /* 56 | #pragma mark - Navigation 57 | 58 | // In a storyboard-based application, you will often want to do a little preparation before navigation 59 | - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 60 | // Get the new view controller using [segue destinationViewController]. 61 | // Pass the selected object to the new view controller. 62 | } 63 | */ 64 | 65 | @end 66 | -------------------------------------------------------------------------------- /超级无敌复活版帅气今日头条优化版无敌吊炸天/DNSocietyViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // DNSocietyViewController.h 3 | // 超级无敌复活版帅气今日头条优化版无敌吊炸天 4 | // 5 | // Created by rongtong on 16/2/18. 6 | // Copyright © 2016年 iosqun328218600. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface DNSocietyViewController : UIViewController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /超级无敌复活版帅气今日头条优化版无敌吊炸天/DNSocietyViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // DNSocietyViewController.m 3 | // 超级无敌复活版帅气今日头条优化版无敌吊炸天 4 | // 5 | // Created by rongtong on 16/2/18. 6 | // Copyright © 2016年 iosqun328218600. All rights reserved. 7 | // 8 | 9 | #import "DNSocietyViewController.h" 10 | 11 | @interface DNSocietyViewController () 12 | 13 | @end 14 | 15 | @implementation DNSocietyViewController 16 | 17 | - (void)viewDidLoad { 18 | [super viewDidLoad]; 19 | // Do any additional setup after loading the view. 20 | } 21 | 22 | - (void)didReceiveMemoryWarning { 23 | [super didReceiveMemoryWarning]; 24 | // Dispose of any resources that can be recreated. 25 | } 26 | 27 | /* 28 | #pragma mark - Navigation 29 | 30 | // In a storyboard-based application, you will often want to do a little preparation before navigation 31 | - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 32 | // Get the new view controller using [segue destinationViewController]. 33 | // Pass the selected object to the new view controller. 34 | } 35 | */ 36 | 37 | @end 38 | -------------------------------------------------------------------------------- /超级无敌复活版帅气今日头条优化版无敌吊炸天/DNSubscriptionViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // DNSubscriptionViewController.h 3 | // 超级无敌复活版帅气今日头条优化版无敌吊炸天 4 | // 5 | // Created by rongtong on 16/2/18. 6 | // Copyright © 2016年 iosqun328218600. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface DNSubscriptionViewController : UIViewController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /超级无敌复活版帅气今日头条优化版无敌吊炸天/DNSubscriptionViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // DNSubscriptionViewController.m 3 | // 超级无敌复活版帅气今日头条优化版无敌吊炸天 4 | // 5 | // Created by rongtong on 16/2/18. 6 | // Copyright © 2016年 iosqun328218600. All rights reserved. 7 | // 8 | 9 | #import "DNSubscriptionViewController.h" 10 | 11 | @interface DNSubscriptionViewController () 12 | 13 | @end 14 | 15 | @implementation DNSubscriptionViewController 16 | 17 | - (void)viewDidLoad { 18 | [super viewDidLoad]; 19 | // Do any additional setup after loading the view. 20 | self.view.backgroundColor = [UIColor blackColor]; 21 | } 22 | 23 | - (void)didReceiveMemoryWarning { 24 | [super didReceiveMemoryWarning]; 25 | // Dispose of any resources that can be recreated. 26 | } 27 | 28 | /* 29 | #pragma mark - Navigation 30 | 31 | // In a storyboard-based application, you will often want to do a little preparation before navigation 32 | - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 33 | // Get the new view controller using [segue destinationViewController]. 34 | // Pass the selected object to the new view controller. 35 | } 36 | */ 37 | 38 | @end 39 | -------------------------------------------------------------------------------- /超级无敌复活版帅气今日头条优化版无敌吊炸天/DNVideoViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // DNVideoViewController.h 3 | // 超级无敌复活版帅气今日头条优化版无敌吊炸天 4 | // 5 | // Created by rongtong on 16/2/18. 6 | // Copyright © 2016年 iosqun328218600. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface DNVideoViewController : UIViewController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /超级无敌复活版帅气今日头条优化版无敌吊炸天/DNVideoViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // DNVideoViewController.m 3 | // 超级无敌复活版帅气今日头条优化版无敌吊炸天 4 | // 5 | // Created by rongtong on 16/2/18. 6 | // Copyright © 2016年 iosqun328218600. All rights reserved. 7 | // 8 | 9 | #import "DNVideoViewController.h" 10 | 11 | @interface DNVideoViewController () 12 | 13 | @end 14 | 15 | @implementation DNVideoViewController 16 | 17 | - (void)viewDidLoad { 18 | [super viewDidLoad]; 19 | // Do any additional setup after loading the view. 20 | self.view.backgroundColor = [UIColor redColor]; 21 | } 22 | 23 | - (void)didReceiveMemoryWarning { 24 | [super didReceiveMemoryWarning]; 25 | // Dispose of any resources that can be recreated. 26 | } 27 | 28 | /* 29 | #pragma mark - Navigation 30 | 31 | // In a storyboard-based application, you will often want to do a little preparation before navigation 32 | - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 33 | // Get the new view controller using [segue destinationViewController]. 34 | // Pass the selected object to the new view controller. 35 | } 36 | */ 37 | 38 | @end 39 | -------------------------------------------------------------------------------- /超级无敌复活版帅气今日头条优化版无敌吊炸天/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 | APPL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | LSRequiresIPhoneOS 24 | 25 | UILaunchStoryboardName 26 | LaunchScreen 27 | UIMainStoryboardFile 28 | Main 29 | UIRequiredDeviceCapabilities 30 | 31 | armv7 32 | 33 | UISupportedInterfaceOrientations 34 | 35 | UIInterfaceOrientationPortrait 36 | UIInterfaceOrientationLandscapeLeft 37 | UIInterfaceOrientationLandscapeRight 38 | 39 | UISupportedInterfaceOrientations~ipad 40 | 41 | UIInterfaceOrientationPortrait 42 | UIInterfaceOrientationPortraitUpsideDown 43 | UIInterfaceOrientationLandscapeLeft 44 | UIInterfaceOrientationLandscapeRight 45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /超级无敌复活版帅气今日头条优化版无敌吊炸天/Model/DNNavTabBarModel.h: -------------------------------------------------------------------------------- 1 | // 2 | // DNNavTabBarModel.h 3 | // 超级无敌复活版帅气今日头条优化版无敌吊炸天 4 | // 5 | // Created by 高世月 on 16/3/2. 6 | // Copyright © 2016年 iosqun328218600. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface DNNavTabBarModel : NSObject 12 | 13 | @property(nonatomic,copy) NSString *controllerName; 14 | 15 | @property(nonatomic,copy) NSString *titleName; 16 | 17 | @end 18 | -------------------------------------------------------------------------------- /超级无敌复活版帅气今日头条优化版无敌吊炸天/Model/DNNavTabBarModel.m: -------------------------------------------------------------------------------- 1 | 2 | // 3 | // DNNavTabBarModel.m 4 | // 超级无敌复活版帅气今日头条优化版无敌吊炸天 5 | // 6 | // Created by 高世月 on 16/3/2. 7 | // Copyright © 2016年 iosqun328218600. All rights reserved. 8 | // 9 | 10 | #import "DNNavTabBarModel.h" 11 | 12 | @implementation DNNavTabBarModel 13 | 14 | @end 15 | -------------------------------------------------------------------------------- /超级无敌复活版帅气今日头条优化版无敌吊炸天/Views/DNAddChannelView.h: -------------------------------------------------------------------------------- 1 | // 2 | // DNAddChannelView.h 3 | // 超级无敌复活版帅气今日头条优化版无敌吊炸天 4 | // 5 | // Created by rongtong on 16/2/23. 6 | // Copyright © 2016年 iosqun328218600. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface DNAddChannelView : UIView 12 | { 13 | int deleteShowAlphe; 14 | } 15 | 16 | @property (nonatomic,strong)NSArray *myChannelTitles; 17 | 18 | - (void)show; 19 | 20 | @end 21 | -------------------------------------------------------------------------------- /超级无敌复活版帅气今日头条优化版无敌吊炸天/Views/DNAddChannelView.m: -------------------------------------------------------------------------------- 1 | // 2 | // DNAddChannelView.m 3 | // 超级无敌复活版帅气今日头条优化版无敌吊炸天 4 | // 5 | // Created by rongtong on 16/2/23. 6 | // Copyright © 2016年 iosqun328218600. All rights reserved. 7 | // 8 | /* 9 | @OC-初生牛犊心得 10 | 1.我做cell的删除动画思路: 在点击cell的删除方法后告诉View进行位移动画(刚开始位移动画是view.center 直接跳转) 11 | */ 12 | 13 | #import "DNAddChannelView.h" 14 | #import "DNChannelCollectionViewCell.h" 15 | 16 | @interface DNAddChannelView () 17 | 18 | @property (nonatomic,strong)UIScrollView *bottomScrollview; 19 | 20 | @property (nonatomic,strong)UICollectionView *myChannelcollectionView; 21 | 22 | @end 23 | 24 | @implementation DNAddChannelView 25 | 26 | - (void)show 27 | { 28 | 29 | UIWindow *appWindow = [[UIApplication sharedApplication] keyWindow]; 30 | 31 | [appWindow addSubview:self]; 32 | 33 | self.alpha = 0; 34 | 35 | [UIView animateWithDuration:0.2 animations:^{ 36 | self.alpha = 1; 37 | }]; 38 | 39 | } 40 | - (instancetype)initWithFrame:(CGRect)frame 41 | { 42 | if(self = [super initWithFrame:frame]) 43 | { 44 | self.backgroundColor = [UIColor colorWithRed:241/255.0f green:242/255.0f blue:244/255.0f alpha:1]; 45 | UIButton *crossImageButton = [UIButton buttonWithType:UIButtonTypeCustom]; 46 | crossImageButton.frame = CGRectMake(self.frame.size.width - 40,20, 44, 44); 47 | [crossImageButton setBackgroundImage:[UIImage imageNamed:@"btn_navigation_back"] forState:UIControlStateNormal]; 48 | [crossImageButton addTarget:self action:@selector(crossButtonClick:) forControlEvents:UIControlEventTouchUpInside]; 49 | [self addSubview:crossImageButton]; 50 | 51 | 52 | [self addMyChannelCollectionView]; 53 | 54 | [self addCommendCollectionView]; 55 | } 56 | return self; 57 | } 58 | - (void)addCommendCollectionView 59 | { 60 | UIView *commendBottomView = [[UIView alloc] initWithFrame:CGRectMake(0,_myChannelcollectionView.frame.size.height, self.frame.size.width,self.frame.size.height - _myChannelcollectionView.frame.size.height)]; 61 | // commendBottomView.backgroundColor = [UIColor greenColor]; 62 | [_bottomScrollview addSubview:commendBottomView]; 63 | 64 | UILabel *commendLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 10, 80, 20)]; 65 | commendLabel.text =@"频道推荐"; 66 | [commendBottomView addSubview:commendLabel]; 67 | 68 | } 69 | 70 | - (void)addMyChannelCollectionView 71 | { 72 | _bottomScrollview = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 64,self.frame.size.width, self.frame.size.height)]; 73 | _bottomScrollview.contentSize = CGSizeMake(self.frame.size.width, 800); 74 | // bottomScrollview.backgroundColor = [UIColor orangeColor]; 75 | [self addSubview:_bottomScrollview]; 76 | //初始化布局类(UICollectionViewLayout的子类) 77 | UICollectionViewFlowLayout *fl = [[UICollectionViewFlowLayout alloc]init]; 78 | 79 | _myChannelcollectionView = [[UICollectionView alloc] initWithFrame:CGRectMake(0,30, self.frame.size.width, 150) collectionViewLayout:fl]; 80 | 81 | _myChannelcollectionView.delegate = self; 82 | 83 | _myChannelcollectionView.dataSource = self; 84 | 85 | _myChannelcollectionView.backgroundColor = [UIColor clearColor]; 86 | 87 | [_myChannelcollectionView registerClass:[DNChannelCollectionViewCell class] forCellWithReuseIdentifier:@"DNTestMyChannelCollectionViewCell"]; 88 | 89 | // [_myChannelcollectionView registerNib:[UINib nibWithNibName:@"DNTestMyChannelCollectionViewCell" bundle:nil] forCellWithReuseIdentifier:@"cell"]; 90 | 91 | 92 | [_bottomScrollview addSubview:_myChannelcollectionView]; 93 | 94 | UILabel *myChannelLabel = [[UILabel alloc] initWithFrame:CGRectMake(10,10, 80, 20)]; 95 | 96 | myChannelLabel.text = @"我的频道"; 97 | 98 | [_bottomScrollview addSubview:myChannelLabel]; 99 | 100 | UIButton *editButton = [UIButton buttonWithType:UIButtonTypeCustom]; 101 | editButton.frame = CGRectMake(self.frame.size.width - 50, 0,40, 30); 102 | [editButton setTitle:@"编辑" forState:UIControlStateNormal]; 103 | editButton.titleLabel.font = [UIFont systemFontOfSize:14.0f]; 104 | [editButton setTitleColor:[UIColor redColor] forState:UIControlStateNormal]; 105 | [editButton addTarget:self action:@selector(editButtonAction:) forControlEvents:UIControlEventTouchUpInside]; 106 | [_bottomScrollview addSubview:editButton]; 107 | 108 | } 109 | 110 | - (void)editButtonAction:(UIButton *)button 111 | { 112 | if([[button currentTitle]isEqualToString:@"完成"]){ 113 | [button setTitle:@"编辑" forState:UIControlStateNormal]; 114 | deleteShowAlphe = 0; 115 | [_myChannelcollectionView reloadData]; 116 | } 117 | else{ 118 | [button setTitle:@"完成" forState:UIControlStateNormal]; 119 | deleteShowAlphe = 1; 120 | [_myChannelcollectionView reloadData]; 121 | } 122 | } 123 | 124 | - (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section 125 | { 126 | 127 | return _myChannelTitles.count - section *4; 128 | } 129 | 130 | 131 | - (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView 132 | { 133 | return 1; 134 | } 135 | 136 | - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 137 | { 138 | static NSString *indentifier = @"DNTestMyChannelCollectionViewCell"; 139 | 140 | DNChannelCollectionViewCell *cell = (DNChannelCollectionViewCell *)[collectionView dequeueReusableCellWithReuseIdentifier:indentifier forIndexPath:indexPath]; 141 | 142 | cell.titleLabel.text = [_myChannelTitles objectAtIndex:indexPath.row]; 143 | cell.backgroundColor =[UIColor whiteColor]; 144 | cell.deleteButton.alpha = deleteShowAlphe; 145 | cell.hidden = NO; 146 | cell.userInteractionEnabled = YES; 147 | cell.delegate = self; 148 | 149 | return cell; 150 | 151 | } 152 | 153 | - (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath 154 | { 155 | return CGSizeMake(70, 30); 156 | } 157 | 158 | -(UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout insetForSectionAtIndex:(NSInteger)section 159 | { 160 | return UIEdgeInsetsMake(15, 15, 5, 15);//分别为上、左、下、右 161 | } 162 | 163 | - (void)crossButtonClick:(UIButton *)button 164 | { 165 | [UIView animateWithDuration:1.2 animations:^{ 166 | self.alpha = 0; 167 | }]; 168 | [self removeFromSuperview]; 169 | } 170 | 171 | 172 | -(void)deleteCellWith:(DNChannelCollectionViewCell *)cell{ 173 | 174 | // cell 隐藏 175 | cell.hidden = YES; 176 | // 获取当前的cell的index 177 | NSIndexPath *index = [_myChannelcollectionView indexPathForCell:cell]; 178 | 179 | // 判断是否是最后一个cell 180 | if (index.row == self.myChannelTitles.count) { 181 | NSMutableArray *mutabArr = [NSMutableArray arrayWithArray:_myChannelTitles]; 182 | 183 | 184 | for (int i = 0; i < mutabArr.count; i++) { 185 | 186 | NSString *str = mutabArr[i]; 187 | 188 | if ([str isEqualToString:cell.titleLabel.text]) { 189 | [mutabArr removeObjectAtIndex:i]; 190 | break; 191 | } 192 | 193 | } 194 | 195 | _myChannelTitles = mutabArr; 196 | 197 | 198 | [[NSNotificationCenter defaultCenter] postNotificationName:@"relodDateTitles" object:mutabArr]; 199 | 200 | cell.hidden = NO; 201 | [_myChannelcollectionView reloadData]; 202 | 203 | }else{ 204 | 205 | // 获取没个cell的point 206 | NSMutableArray *currentArrayPoint = [NSMutableArray array]; 207 | 208 | for (NSInteger i = 0; i < self.myChannelTitles.count; i++) { 209 | 210 | NSUInteger currentInteger[] = {0, i}; 211 | NSIndexPath *currentIndex = [[NSIndexPath alloc] initWithIndexes:currentInteger length:2]; 212 | //找到对应的cell 213 | 214 | DNChannelCollectionViewCell *currentCell = (DNChannelCollectionViewCell *)[_myChannelcollectionView cellForItemAtIndexPath:currentIndex]; 215 | // currentCell.userInteractionEnabled = NO; 216 | 217 | // CGPoint viewpoint = [currentCell convertPoint:currentCell.center toView:self]; 218 | 219 | NSDictionary *dict = @{@"x":[NSString stringWithFormat:@"%f",currentCell.center.x],@"y":[NSString stringWithFormat:@"%f",currentCell.center.y]}; 220 | 221 | [currentArrayPoint addObject:dict]; 222 | } 223 | 224 | // 在选择后的cell进行位移. 225 | for (NSInteger i = index.row; i < self.myChannelTitles.count; i++) { 226 | 227 | NSUInteger movingInteger[] = {0, i + 1}; 228 | NSIndexPath *movingIndex = [[NSIndexPath alloc] initWithIndexes:movingInteger length:2]; 229 | //找到对应的cell 230 | 231 | DNChannelCollectionViewCell *movingCell = (DNChannelCollectionViewCell *)[_myChannelcollectionView cellForItemAtIndexPath:movingIndex]; 232 | 233 | NSDictionary *dict = currentArrayPoint[i]; 234 | 235 | NSLog(@"%@",movingCell.titleLabel.text); 236 | 237 | CGPoint point = CGPointMake([dict[@"x"] integerValue], [dict[@"y"] integerValue]); 238 | 239 | CABasicAnimation *anima=[CABasicAnimation animation]; 240 | 241 | //1.1告诉系统要执行什么样的动画 242 | anima.keyPath=@"position"; 243 | //设置通过动画,将layer从哪儿移动到哪儿 244 | anima.fromValue=[NSValue valueWithCGPoint:movingCell.center]; 245 | anima.toValue=[NSValue valueWithCGPoint:point]; 246 | 247 | //1.2设置动画执行完毕之后不删除动画 248 | anima.removedOnCompletion=NO; 249 | anima.duration = 0.5; 250 | //1.3设置保存动画的最新状态 251 | anima.fillMode=kCAFillModeForwards; 252 | anima.delegate=self; 253 | 254 | 255 | //2.添加核心动画到layer 256 | [movingCell.layer addAnimation:anima forKey:nil]; 257 | 258 | 259 | if (i + 1 == self.myChannelTitles.count) { 260 | 261 | NSMutableArray *mutabArr = [NSMutableArray arrayWithArray:_myChannelTitles]; 262 | 263 | 264 | for (int i = 0; i < mutabArr.count; i++) { 265 | 266 | NSString *str = mutabArr[i]; 267 | 268 | if ([str isEqualToString:cell.titleLabel.text]) { 269 | [mutabArr removeObjectAtIndex:i]; 270 | break; 271 | } 272 | 273 | } 274 | 275 | _myChannelTitles = [NSArray arrayWithArray:mutabArr]; 276 | [[NSNotificationCenter defaultCenter] postNotificationName:@"relodDateTitles" object:mutabArr]; 277 | 278 | } 279 | 280 | } 281 | } 282 | 283 | 284 | } 285 | 286 | -(void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag{ 287 | 288 | [_myChannelcollectionView reloadData]; 289 | 290 | } 291 | 292 | 293 | @end 294 | -------------------------------------------------------------------------------- /超级无敌复活版帅气今日头条优化版无敌吊炸天/Views/DNChannelCollectionViewCell.h: -------------------------------------------------------------------------------- 1 | // 2 | // DNTestMyChannelCollectionViewCell.h 3 | // 超级无敌复活版帅气今日头条优化版无敌吊炸天 4 | // 5 | // Created by 高世月 on 16/2/23. 6 | // Copyright © 2016年 iosqun328218600. All rights reserved. 7 | // 8 | 9 | #import 10 | @class DNChannelCollectionViewCell; 11 | 12 | @protocol DNChannelCollectionViewCellDelegate 13 | @required 14 | // 当点击cell的时候把自己闯过去进行为移动画 15 | -(void)deleteCellWith:(DNChannelCollectionViewCell *)cell; 16 | @end 17 | 18 | @interface DNChannelCollectionViewCell : UICollectionViewCell 19 | 20 | @property (weak, nonatomic) UILabel *titleLabel; 21 | @property (weak, nonatomic) UIButton *deleteButton; 22 | @property (weak, nonatomic) iddelegate; 23 | 24 | @end 25 | -------------------------------------------------------------------------------- /超级无敌复活版帅气今日头条优化版无敌吊炸天/Views/DNChannelCollectionViewCell.m: -------------------------------------------------------------------------------- 1 | // 2 | // DNTestMyChannelCollectionViewCell.m 3 | // 超级无敌复活版帅气今日头条优化版无敌吊炸天 4 | // 5 | // Created by 高世月 on 16/2/23. 6 | // Copyright © 2016年 iosqun328218600. All rights reserved. 7 | // 8 | 9 | #import "DNChannelCollectionViewCell.h" 10 | 11 | @implementation DNChannelCollectionViewCell 12 | //这样写创建不会重复创建和开辟内存.. 13 | -(UILabel *)titleLabel{ 14 | 15 | if (!_titleLabel) { 16 | 17 | UILabel *tomp = [[UILabel alloc]init]; 18 | [self addSubview:tomp]; 19 | _titleLabel = tomp; 20 | } 21 | return _titleLabel; 22 | } 23 | 24 | -(UIButton *)deleteButton{ 25 | 26 | if (!_deleteButton) { 27 | 28 | UIButton *tomp = [[UIButton alloc]init]; 29 | [self addSubview:tomp]; 30 | _deleteButton = tomp; 31 | } 32 | return _deleteButton; 33 | } 34 | 35 | 36 | -(void)layoutSubviews{ 37 | 38 | [super layoutSubviews]; 39 | 40 | self.titleLabel.frame = CGRectMake(19, 4, 52, 21); 41 | 42 | self.deleteButton.frame = CGRectMake(50,-5, 25, 25); 43 | [self.deleteButton setImage:[UIImage imageNamed:@"btn_navigation_back"] forState:UIControlStateNormal]; 44 | [self.deleteButton addTarget:self action:@selector(deleteCell) forControlEvents:UIControlEventTouchUpInside]; 45 | 46 | 47 | } 48 | 49 | 50 | -(void)deleteCell{ 51 | 52 | if ([self.delegate respondsToSelector:@selector(deleteCellWith:)]) { 53 | [self.delegate deleteCellWith:self]; 54 | } 55 | 56 | } 57 | 58 | @end 59 | -------------------------------------------------------------------------------- /超级无敌复活版帅气今日头条优化版无敌吊炸天/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // 超级无敌复活版帅气今日头条优化版无敌吊炸天 4 | // 5 | // Created by rongtong on 16/2/17. 6 | // Copyright © 2016年 iosqun328218600. 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 | -------------------------------------------------------------------------------- /超级无敌复活版帅气今日头条优化版无敌吊炸天Tests/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 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | 24 | 25 | -------------------------------------------------------------------------------- /超级无敌复活版帅气今日头条优化版无敌吊炸天Tests/_____________________Tests.m: -------------------------------------------------------------------------------- 1 | // 2 | // _____________________Tests.m 3 | // 超级无敌复活版帅气今日头条优化版无敌吊炸天Tests 4 | // 5 | // Created by rongtong on 16/2/17. 6 | // Copyright © 2016年 iosqun328218600. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface _____________________Tests : XCTestCase 12 | 13 | @end 14 | 15 | @implementation _____________________Tests 16 | 17 | - (void)setUp { 18 | [super setUp]; 19 | // Put setup code here. This method is called before the invocation of each test method in the class. 20 | } 21 | 22 | - (void)tearDown { 23 | // Put teardown code here. This method is called after the invocation of each test method in the class. 24 | [super tearDown]; 25 | } 26 | 27 | - (void)testExample { 28 | // This is an example of a functional test case. 29 | // Use XCTAssert and related functions to verify your tests produce the correct results. 30 | 31 | NSLog(@"自定义测试testExample"); 32 | 33 | int a = 3; 34 | 35 | XCTAssertTrue(a== 0,@"a不等于0"); 36 | } 37 | 38 | - (void)testDIY 39 | { 40 | 41 | 42 | 43 | } 44 | 45 | - (void)testPerformanceExample { 46 | // This is an example of a performance test case. 47 | [self measureBlock:^{ 48 | // Put the code you want to measure the time of here. 49 | }]; 50 | } 51 | 52 | @end 53 | -------------------------------------------------------------------------------- /超级无敌复活版帅气今日头条优化版无敌吊炸天UITests/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 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | 24 | 25 | -------------------------------------------------------------------------------- /超级无敌复活版帅气今日头条优化版无敌吊炸天UITests/_____________________UITests.m: -------------------------------------------------------------------------------- 1 | // 2 | // _____________________UITests.m 3 | // 超级无敌复活版帅气今日头条优化版无敌吊炸天UITests 4 | // 5 | // Created by rongtong on 16/2/17. 6 | // Copyright © 2016年 iosqun328218600. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface _____________________UITests : XCTestCase 12 | 13 | @end 14 | 15 | @implementation _____________________UITests 16 | 17 | - (void)setUp { 18 | [super setUp]; 19 | 20 | // Put setup code here. This method is called before the invocation of each test method in the class. 21 | 22 | // In UI tests it is usually best to stop immediately when a failure occurs. 23 | self.continueAfterFailure = NO; 24 | // UI tests must launch the application that they test. Doing this in setup will make sure it happens for each test method. 25 | [[[XCUIApplication alloc] init] launch]; 26 | 27 | // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this. 28 | } 29 | 30 | - (void)tearDown { 31 | // Put teardown code here. This method is called after the invocation of each test method in the class. 32 | [super tearDown]; 33 | } 34 | 35 | - (void)testExample { 36 | // Use recording to get started writing UI tests. 37 | // Use XCTAssert and related functions to verify your tests produce the correct results. 38 | 39 | 40 | 41 | } 42 | 43 | @end 44 | --------------------------------------------------------------------------------