MDetailFramework控件
1018 | 前言
1019 | MDetailFramework,为实现淘宝中的商品详情页面中, 商品的基本信息、图文详情、评论、商家推荐的效果;
1020 | 简介
1021 |
1022 | - 1、此包提供商品详情的展示,支持全屏、导航2种模式;
1023 | - 2、支持图片左滑到一定距离时,侧滑展示图文详情、评论,其中图片详情、评论可通过Delegate配置;
1024 | - 3、支持视图上拉到一定距离时,上移展示图文详情、评论,其中图片详情、评论可通过Delegate配置;
1025 | - 4、banner图片支持点击,全屏展示,且全屏展示模式下,亦支持左滑\点击缩小;
1026 | - 5、当Section个数为一个时,不显示SectionBar
1027 | - 6、testDetail,提供了四种展示展示方式,UITableView\UITableView(无sectionbar)\UIScrollView\UIWebView;
1028 |
1029 | 依赖
1030 |
1031 | - 1、此项目依赖MFullScreenFramework
1032 |
1033 | 举例
1034 | - (DetailView *) detailView {
1035 | if (!_detailView) {
1036 | _detailView = [[DetailView alloc] initWithFrame:CGRectMake(0, 64, self.view.bounds.size.width, self.view.bounds.size.height-64)];
1037 | _detailView.delegate = self;
1038 | _detailView.startYPosition = 0.0f;
1039 | _detailView.topScrollViewTopInset = 300.0f;
1040 | _detailView.topScrollPageView.delegate = self;
1041 | }
1042 | return _detailView;
1043 | }
1044 |
1045 | - (UIWebView *) topWebView {
1046 | if (!_topWebView) {
1047 | _topWebView = [[UIWebView alloc] initWithFrame:_detailView.bounds];
1048 | _topWebView.scrollView.showsVerticalScrollIndicator = NO;
1049 | _topWebView.backgroundColor = [UIColor whiteColor];
1050 | [_topWebView setOpaque:NO];
1051 | }
1052 | return _topWebView;
1053 | }
1054 |
1055 | - (MFullScreenControl *) control {
1056 | if(!_control) {
1057 | _control = self.detailView.fullScreencontrol;
1058 | _control.screenPageView.delegate = self;
1059 | }
1060 | return _control;
1061 | }
1062 |
1063 |
1064 | #pragma mark UIScrollPageControlViewDelegate
1065 |
1066 | - (NSUInteger) numberOfView:(UIScrollPageControlView *) control {
1067 | return 4;
1068 | }
1069 |
1070 | - (UIView *) configBannerItemOfControl:(UIScrollPageControlView *) control at:(NSUInteger) index {
1071 | UIImageView *cellItem = (UIImageView *)[control dequeueReusableViewWithIdentifier:@"reuse"];
1072 | if (!cellItem) {
1073 | cellItem = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, _detailView.topScrollViewTopInset)];
1074 | cellItem.userInteractionEnabled = YES;
1075 | cellItem.backgroundColor = [UIColor colorWithWhite:0.7f alpha:0.4f];
1076 | cellItem.reuseIdentifier = @"reuse";
1077 | [cellItem addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(imageViewDidTaped:)]];
1078 | }
1079 | UIImage *image = [UIImage imageNamed:[NSString stringWithFormat:@"pic_%d",(int)(index+1) %4]];
1080 | image = [image imageScaledToSizeEx:CGSizeMake(cellItem.frame.size.width * 2, cellItem.frame.size.height * 2)];
1081 | cellItem.image = image;
1082 | return cellItem;
1083 | }
1084 |
1085 | - (UIView *) configFullItemOfControl:(UIScrollPageControlView *) control at:(NSUInteger) index {
1086 | UIImageView *cellItem = (UIImageView *)[control dequeueReusableViewWithIdentifier:@"reuseFull"];
1087 | if (!cellItem) {
1088 | cellItem = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, _detailView.topScrollViewTopInset)];
1089 | cellItem.userInteractionEnabled = YES;
1090 | cellItem.backgroundColor = [UIColor colorWithWhite:0.7f alpha:0.4f];
1091 | cellItem.reuseIdentifier = @"reuseFull";
1092 | [cellItem addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(imageViewDidTaped:)]];
1093 | }
1094 | UIImage *image = [UIImage imageNamed:[NSString stringWithFormat:@"pic_%d",(int)(index+1) %4]];
1095 | image = [image imageScaledToSizeEx:CGSizeMake(cellItem.frame.size.width * 2, cellItem.frame.size.height * 2)];
1096 | // cellItem.image = image;
1097 | return cellItem;
1098 | }
1099 |
1100 | - (UIView *) configItemOfControl:(UIScrollPageControlView *) control at:(NSUInteger) index {
1101 | if (control == _control.screenPageView) {
1102 | return [self configFullItemOfControl:_control.screenPageView at:index];
1103 | }
1104 | return [self configBannerItemOfControl:control at:index];
1105 | }
1106 |
1107 | - (void) imageViewDidTaped:(UIGestureRecognizer *) recognizer {
1108 | if (self.control.isAppear) {
1109 | [self.detailView hideFullScreenOnView:recognizer.view];
1110 | return;
1111 | }
1112 | [self.detailView showFullScreenOnView:recognizer.view];
1113 | }
1114 |
1115 | #pragma mark DetailViewSectionDelegate
1116 |
1117 | - (UIView *) viewAtTop {
1118 | return self.topWebView;
1119 | }
1120 |
1121 | - (NSUInteger ) numberOfSections {
1122 | // __totalNumber = (1 == __totalNumber) ? 2 : 1;
1123 | return __totalNumber;
1124 | }
1125 |
1126 | - (NSString *) titleOfSectionAt:(NSUInteger )index {
1127 | return titles[index];
1128 | }
1129 |
1130 | - (UIView *) viewOfSectionAt:(NSUInteger ) index {
1131 | UIWebView *webview = [[UIWebView alloc] initWithFrame:CGRectZero];
1132 | return webview;
1133 | }
1134 |
1135 | - (void) didChangeToSection:(NSUInteger) index view:(UIView *) view {
1136 | NSString *url = urls[index];
1137 | UIWebView *webView = (UIWebView *) view;
1138 | if (!webView.request) {
1139 | [webView stopLoading];
1140 | [webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:url]]];
1141 | }
1142 | }
1143 |
1144 | - (void) floatViewIsGoingTo:(BOOL) appear {
1145 | NSLog(@"floatViewIsGoingTo = %d", appear);
1146 | }
1147 |
1148 |
1149 |
1150 | 效果图展示
1151 | 为更好的展示效果,请耐心等待
1152 | 
--------------------------------------------------------------------------------
/MDetailFramework/MDetailFramework.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 46;
7 | objects = {
8 |
9 | /* Begin PBXAggregateTarget section */
10 | 6272E1FF1CBEB6BF00D15853 /* DetailAggregate */ = {
11 | isa = PBXAggregateTarget;
12 | buildConfigurationList = 6272E2001CBEB6BF00D15853 /* Build configuration list for PBXAggregateTarget "DetailAggregate" */;
13 | buildPhases = (
14 | 6272E2031CBEB6C300D15853 /* ShellScript */,
15 | );
16 | dependencies = (
17 | );
18 | name = DetailAggregate;
19 | productName = DetailAggregate;
20 | };
21 | /* End PBXAggregateTarget section */
22 |
23 | /* Begin PBXBuildFile section */
24 | 626ED5DA1E8BAEF00056B833 /* MFullScreenFramework.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6272E22E1CBEB70000D15853 /* MFullScreenFramework.framework */; };
25 | 6272E1F81CBEB6A500D15853 /* MDetailFramework.h in Headers */ = {isa = PBXBuildFile; fileRef = 6272E1F71CBEB6A500D15853 /* MDetailFramework.h */; settings = {ATTRIBUTES = (Public, ); }; };
26 | 6272E20C1CBEB6DA00D15853 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 6272E20B1CBEB6DA00D15853 /* main.m */; };
27 | 6272E20F1CBEB6DA00D15853 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 6272E20E1CBEB6DA00D15853 /* AppDelegate.m */; };
28 | 6272E2151CBEB6DA00D15853 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 6272E2131CBEB6DA00D15853 /* Main.storyboard */; };
29 | 6272E2171CBEB6DA00D15853 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 6272E2161CBEB6DA00D15853 /* Assets.xcassets */; };
30 | 6272E21A1CBEB6DA00D15853 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 6272E2181CBEB6DA00D15853 /* LaunchScreen.storyboard */; };
31 | 6272E2251CBEB6DA00D15853 /* testDetailTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 6272E2241CBEB6DA00D15853 /* testDetailTests.m */; };
32 | 6272E22D1CBEB6E000D15853 /* MDetailFramework.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6272E1F41CBEB6A500D15853 /* MDetailFramework.framework */; };
33 | 6272E22F1CBEB70000D15853 /* MFullScreenFramework.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6272E22E1CBEB70000D15853 /* MFullScreenFramework.framework */; };
34 | 6272E23A1CBEB72D00D15853 /* DetailPictureView.h in Headers */ = {isa = PBXBuildFile; fileRef = 6272E2321CBEB72D00D15853 /* DetailPictureView.h */; settings = {ATTRIBUTES = (Public, ); }; };
35 | 6272E23B1CBEB72D00D15853 /* DetailPictureView.m in Sources */ = {isa = PBXBuildFile; fileRef = 6272E2331CBEB72D00D15853 /* DetailPictureView.m */; };
36 | 6272E23C1CBEB72D00D15853 /* DetailRefreshView.h in Headers */ = {isa = PBXBuildFile; fileRef = 6272E2341CBEB72D00D15853 /* DetailRefreshView.h */; settings = {ATTRIBUTES = (Public, ); }; };
37 | 6272E23D1CBEB72D00D15853 /* DetailRefreshView.m in Sources */ = {isa = PBXBuildFile; fileRef = 6272E2351CBEB72D00D15853 /* DetailRefreshView.m */; };
38 | 6272E23E1CBEB72D00D15853 /* DetailTipView.h in Headers */ = {isa = PBXBuildFile; fileRef = 6272E2361CBEB72D00D15853 /* DetailTipView.h */; settings = {ATTRIBUTES = (Public, ); }; };
39 | 6272E23F1CBEB72D00D15853 /* DetailTipView.m in Sources */ = {isa = PBXBuildFile; fileRef = 6272E2371CBEB72D00D15853 /* DetailTipView.m */; };
40 | 6272E2401CBEB72D00D15853 /* DetailView.h in Headers */ = {isa = PBXBuildFile; fileRef = 6272E2381CBEB72D00D15853 /* DetailView.h */; settings = {ATTRIBUTES = (Public, ); }; };
41 | 6272E2411CBEB72D00D15853 /* DetailView.m in Sources */ = {isa = PBXBuildFile; fileRef = 6272E2391CBEB72D00D15853 /* DetailView.m */; };
42 | 6272E2421CBEB76F00D15853 /* MDetailFramework.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6272E1F41CBEB6A500D15853 /* MDetailFramework.framework */; };
43 | 6272E24F1CBEB7E000D15853 /* DetailScrollViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 6272E2441CBEB7E000D15853 /* DetailScrollViewController.m */; };
44 | 6272E2501CBEB7E000D15853 /* DetailTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 6272E2461CBEB7E000D15853 /* DetailTableViewController.m */; };
45 | 6272E2511CBEB7E000D15853 /* DetailWapViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 6272E2481CBEB7E000D15853 /* DetailWapViewController.m */; };
46 | 6272E2521CBEB7E000D15853 /* RootTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 6272E24A1CBEB7E000D15853 /* RootTableViewController.m */; };
47 | 6272E2531CBEB7E000D15853 /* SingleOneSectionTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 6272E24C1CBEB7E000D15853 /* SingleOneSectionTableViewController.m */; };
48 | 6272E2541CBEB7E000D15853 /* UIImage+extend.m in Sources */ = {isa = PBXBuildFile; fileRef = 6272E24E1CBEB7E000D15853 /* UIImage+extend.m */; };
49 | 6277EEC01D0FB4A900A386A5 /* Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 6277EEBF1D0FB4A900A386A5 /* Info.plist */; };
50 | 6277EEC81D0FB64B00A386A5 /* Detail.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 6277EEC71D0FB64B00A386A5 /* Detail.bundle */; };
51 | 6277EEC91D0FB64B00A386A5 /* Detail.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 6277EEC71D0FB64B00A386A5 /* Detail.bundle */; };
52 | 6277EECE1D0FC98800A386A5 /* DetailLocalizable.h in Headers */ = {isa = PBXBuildFile; fileRef = 6277EECC1D0FC98800A386A5 /* DetailLocalizable.h */; };
53 | 6277EECF1D0FC98800A386A5 /* DetailLocalizable.m in Sources */ = {isa = PBXBuildFile; fileRef = 6277EECD1D0FC98800A386A5 /* DetailLocalizable.m */; };
54 | /* End PBXBuildFile section */
55 |
56 | /* Begin PBXContainerItemProxy section */
57 | 6272E2211CBEB6DA00D15853 /* PBXContainerItemProxy */ = {
58 | isa = PBXContainerItemProxy;
59 | containerPortal = 6272E1EB1CBEB6A500D15853 /* Project object */;
60 | proxyType = 1;
61 | remoteGlobalIDString = 6272E2071CBEB6DA00D15853;
62 | remoteInfo = testDetail;
63 | };
64 | /* End PBXContainerItemProxy section */
65 |
66 | /* Begin PBXFileReference section */
67 | 626ED5D71E8BA3250056B833 /* MFullScreenFramework.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MFullScreenFramework.framework; path = "../../../../../Library/Developer/Xcode/DerivedData/Dallas-bfvukggundgcexadogozzcxgjwze/Build/Products/Debug-iphonesimulator/MFullScreenFramework.framework"; sourceTree = "