Browse Source

Refactor for example group method.
Add a customized collection view layout entrance

Frank 2 years ago
parent
commit
e8a5c77417

+ 7 - 3
Examples/MJRefreshExample/MJRefreshExample.xcodeproj/project.pbxproj

@@ -8,6 +8,7 @@
 
 /* Begin PBXBuildFile section */
 		0133FBBF2693FA8E00E98F66 /* CustomLanguages.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 0133FBBE2693FA8E00E98F66 /* CustomLanguages.bundle */; };
+		013557022AB7F252001BB573 /* MJPinHeaderCollectionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 013557012AB7F252001BB573 /* MJPinHeaderCollectionViewController.swift */; };
 		018C0838274787B6002D968E /* MJRefresh.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 018C083427478732002D968E /* MJRefresh.framework */; };
 		018C0839274787B6002D968E /* MJRefresh.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 018C083427478732002D968E /* MJRefresh.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
 		0193FF132692E99500B52B11 /* I18NExampleViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0193FF122692E99500B52B11 /* I18NExampleViewController.swift */; };
@@ -78,6 +79,7 @@
 		0133FBBC2693F81700E98F66 /* uk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = uk; path = uk.lproj/MJRefresh_i18n.strings; sourceTree = "<group>"; };
 		0133FBBD2693F81F00E98F66 /* ko */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ko; path = ko.lproj/MJRefresh_i18n.strings; sourceTree = "<group>"; };
 		0133FBBE2693FA8E00E98F66 /* CustomLanguages.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = CustomLanguages.bundle; sourceTree = "<group>"; };
+		013557012AB7F252001BB573 /* MJPinHeaderCollectionViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MJPinHeaderCollectionViewController.swift; sourceTree = "<group>"; };
 		018C082F27478732002D968E /* MJRefresh.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = MJRefresh.xcodeproj; path = ../../MJRefresh.xcodeproj; sourceTree = "<group>"; };
 		0193FF122692E99500B52B11 /* I18NExampleViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = I18NExampleViewController.swift; sourceTree = "<group>"; };
 		0193FF172692F8EB00B52B11 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/MJRefresh_i18n.strings; sourceTree = "<group>"; };
@@ -181,7 +183,6 @@
 			isa = PBXGroup;
 			children = (
 				01A5EB2A25EF62B80091554E /* MJWKWebViewController.swift */,
-				01A5EB2925EF62B80091554E /* MJRefreshExample-Bridging-Header.h */,
 			);
 			path = SwiftExample;
 			sourceTree = "<group>";
@@ -245,6 +246,7 @@
 			children = (
 				2D9BEAFF1BB15F4A00AED473 /* MJCollectionViewController.h */,
 				2D9BEB001BB15F4A00AED473 /* MJCollectionViewController.m */,
+				013557012AB7F252001BB573 /* MJPinHeaderCollectionViewController.swift */,
 				6B8FB1A7250E610D00AF64B7 /* MJHorizontalCollectionViewController.h */,
 				6B8FB1A8250E610D00AF64B7 /* MJHorizontalCollectionViewController.m */,
 				2D9BEB011BB15F4A00AED473 /* MJTableViewController.h */,
@@ -283,6 +285,7 @@
 			isa = PBXGroup;
 			children = (
 				2DA7F94E1AA6B51C005627AB /* Classes */,
+				01A5EB2925EF62B80091554E /* MJRefreshExample-Bridging-Header.h */,
 				2DA7F9281AA6B4C4005627AB /* Supporting Files */,
 			);
 			path = MJRefreshExample;
@@ -476,6 +479,7 @@
 				2D9BEB091BB15F4A00AED473 /* UIViewController+Example.m in Sources */,
 				6B8FB1A9250E610D00AF64B7 /* MJHorizontalCollectionViewController.m in Sources */,
 				2D9BEB111BB15F4A00AED473 /* MJExampleViewController.m in Sources */,
+				013557022AB7F252001BB573 /* MJPinHeaderCollectionViewController.swift in Sources */,
 				2D9BEB0C1BB15F4A00AED473 /* MJChiBaoZiHeader.m in Sources */,
 				2D9BEB191BB15F4A00AED473 /* MJTestViewController.m in Sources */,
 				2D9BEB151BB15F4A00AED473 /* MJTempViewController.m in Sources */,
@@ -655,7 +659,7 @@
 				);
 				PRODUCT_BUNDLE_IDENTIFIER = com.mj.MJRefresh;
 				PRODUCT_NAME = "$(TARGET_NAME)";
-				SWIFT_OBJC_BRIDGING_HEADER = "MJRefreshExample/Classes/SwiftExample/MJRefreshExample-Bridging-Header.h";
+				SWIFT_OBJC_BRIDGING_HEADER = "MJRefreshExample/MJRefreshExample-Bridging-Header.h";
 				SWIFT_OPTIMIZATION_LEVEL = "-Onone";
 				SWIFT_VERSION = 5.0;
 			};
@@ -676,7 +680,7 @@
 				);
 				PRODUCT_BUNDLE_IDENTIFIER = com.mj.MJRefresh;
 				PRODUCT_NAME = "$(TARGET_NAME)";
-				SWIFT_OBJC_BRIDGING_HEADER = "MJRefreshExample/Classes/SwiftExample/MJRefreshExample-Bridging-Header.h";
+				SWIFT_OBJC_BRIDGING_HEADER = "MJRefreshExample/MJRefreshExample-Bridging-Header.h";
 				SWIFT_VERSION = 5.0;
 			};
 			name = Release;

+ 1 - 1
Examples/MJRefreshExample/MJRefreshExample/Classes/First/MJExample.h

@@ -12,5 +12,5 @@
 @property (copy, nonatomic) NSString *header;
 @property (strong, nonatomic) NSArray *titles;
 @property (strong, nonatomic) NSArray *methods;
-@property (assign, nonatomic) Class vcClass;
+@property (strong, nonatomic) NSArray<Class> *vcClasses;
 @end

+ 19 - 17
Examples/MJRefreshExample/MJRefreshExample/Classes/First/MJExampleViewController.m

@@ -34,41 +34,35 @@ - (NSArray *)examples
     if (!_examples) {
         MJExample *exam0 = [[MJExample alloc] init];
         exam0.header = MJExample00;
-        exam0.vcClass = [MJTableViewController class];
+        exam0.vcClasses = @[[MJTableViewController class]];
         exam0.titles = @[@"默认", @"动画图片", @"隐藏时间", @"隐藏状态和时间", @"自定义文字", @"自定义刷新控件"];
         exam0.methods = @[@"example01", @"example02", @"example03", @"example04", @"example05", @"example06"];
         
         MJExample *exam1 = [[MJExample alloc] init];
         exam1.header = MJExample10;
-        exam1.vcClass = [MJTableViewController class];
+        exam1.vcClasses = @[[MJTableViewController class]];
         exam1.titles = @[@"默认", @"动画图片", @"隐藏刷新状态的文字", @"全部加载完毕", @"禁止自动加载", @"自定义文字", @"加载后隐藏", @"自动回弹的上拉01", @"自动回弹的上拉02", @"自定义刷新控件(自动刷新)", @"自定义刷新控件(自动回弹)"];
         exam1.methods = @[@"example11", @"example12", @"example13", @"example14", @"example15", @"example16", @"example17", @"example18", @"example19", @"example20", @"example21"];
         
         MJExample *exam2 = [[MJExample alloc] init];
         exam2.header = MJExample20;
-        exam2.vcClass = [MJCollectionViewController class];
-        exam2.titles = @[@"上下拉刷新"];
-        exam2.methods = @[@"example21"];
+        exam2.vcClasses = @[MJCollectionViewController.class, MJPinHeaderCollectionViewController.class, MJHorizontalCollectionViewController.class];
+        exam2.titles = @[@"上下拉刷新", @"上下拉刷新-PinHeader", @"左拉刷新"];
+        exam2.methods = @[@"example31", @"example31", @"example42"];
         
         MJExample *exam3 = [[MJExample alloc] init];
         exam3.header = MJExample30;
-        exam3.vcClass = [MJWebViewViewController class];
+        exam3.vcClasses = @[[MJWebViewViewController class]];
         exam3.titles = @[@"下拉刷新"];
-        exam3.methods = @[@"example31"];
+        exam3.methods = @[@"example40"];
         
         MJExample *exam4 = [[MJExample alloc] init];
         exam4.header = MJExample40;
-        exam4.vcClass = [MJWKWebViewController class];
+        exam4.vcClasses = @[[MJWKWebViewController class]];
         exam4.titles = @[@"下拉刷新"];
         exam4.methods = @[@"example41"];
         
-        MJExample *exam5 = [[MJExample alloc] init];
-        exam5.header = MJExample20;
-        exam5.vcClass = [MJHorizontalCollectionViewController class];
-        exam5.titles = @[@"左拉刷新"];
-        exam5.methods = @[@"example42"];
-        
-        self.examples = @[exam0, exam1, exam2, exam3, exam4, exam5];
+        self.examples = @[exam0, exam1, exam2, exam3, exam4];
     }
     return _examples;
 }
@@ -120,7 +114,11 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N
     MJExample *exam = self.examples[indexPath.section];
     cell.textLabel.text = exam.titles[indexPath.row];
     
-    cell.detailTextLabel.text = [NSString stringWithFormat:@"%@ - %@", exam.vcClass, exam.methods[indexPath.row]];
+    NSInteger classRow = indexPath.row;
+    if (classRow > exam.vcClasses.count - 1) {
+        classRow = exam.vcClasses.count - 1;
+    }
+    cell.detailTextLabel.text = [NSString stringWithFormat:@"%@ - %@", exam.vcClasses[classRow], exam.methods[indexPath.row]];
     
     return cell;
 }
@@ -134,7 +132,11 @@ - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInte
 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
 {
     MJExample *exam = self.examples[indexPath.section];
-    UIViewController *vc = [[exam.vcClass alloc] init];
+    NSInteger classRow = indexPath.row;
+    if (classRow > exam.vcClasses.count - 1) {
+        classRow = exam.vcClasses.count - 1;
+    }
+    UIViewController *vc = [[exam.vcClasses[classRow] alloc] init];
     vc.title = exam.titles[indexPath.row];
     [vc setValue:exam.methods[indexPath.row] forKeyPath:@"method"];
     [self.navigationController pushViewController:vc animated:YES];

+ 2 - 0
Examples/MJRefreshExample/MJRefreshExample/Classes/Second/MJCollectionViewController.h

@@ -10,4 +10,6 @@
 
 @interface MJCollectionViewController : UICollectionViewController
 
+- (void)example31;
+
 @end

+ 10 - 1
Examples/MJRefreshExample/MJRefreshExample/Classes/Second/MJCollectionViewController.m

@@ -26,7 +26,7 @@ @interface MJCollectionViewController()
 @implementation MJCollectionViewController
 #pragma mark - 示例
 #pragma mark UICollectionView 上下拉刷新
-- (void)example21
+- (void)example31
 {
     __weak __typeof(self) weakSelf = self;
     
@@ -99,6 +99,7 @@ - (id)init
     layout.sectionInset = UIEdgeInsetsMake(20, 20, 20, 20);
     layout.minimumInteritemSpacing = 20;
     layout.minimumLineSpacing = 20;
+    layout.headerReferenceSize = CGSizeMake(100, 30);
     return [self initWithCollectionViewLayout:layout];
 }
 
@@ -112,6 +113,7 @@ - (void)viewDidLoad
                                  );
     
     [self.collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:MJCollectionViewCellIdentifier];
+    [self.collectionView registerClass:[UICollectionReusableView class] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"header"];
 }
 
 #pragma mark - collection数据源代理
@@ -129,6 +131,13 @@ - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cell
     return cell;
 }
 
+- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath {
+    UICollectionReusableView *view = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"header" forIndexPath:indexPath];
+    view.backgroundColor = UIColor.systemPurpleColor;
+    
+    return view;
+}
+
 - (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
 {
     MJTestViewController *test = [[MJTestViewController alloc] init];

+ 39 - 0
Examples/MJRefreshExample/MJRefreshExample/Classes/Second/MJPinHeaderCollectionViewController.swift

@@ -0,0 +1,39 @@
+//
+//  MJPinHeaderCollectionViewController.swift
+//  MJRefreshExample
+//
+//  Created by Frank on 2023/9/18.
+//  Copyright © 2023 小码哥. All rights reserved.
+//
+
+import UIKit
+
+@objcMembers
+class MJPinHeaderCollectionViewController: MJCollectionViewController {
+    
+    convenience init() {
+        let pinHeaderLayout = PinHeaderFlowLayout()
+        pinHeaderLayout.itemSize = CGSizeMake(80, 80)
+        pinHeaderLayout.sectionInset = UIEdgeInsets(top: 20, left: 20, bottom: 20, right: 20)
+        pinHeaderLayout.minimumInteritemSpacing = 20
+        pinHeaderLayout.minimumLineSpacing = 20
+        pinHeaderLayout.headerReferenceSize = CGSize(width: 100, height: 30)
+        
+        self.init(collectionViewLayout: pinHeaderLayout)
+    }
+
+    override func viewDidLoad() {
+        super.viewDidLoad()
+    }
+}
+
+@objcMembers
+class PinHeaderFlowLayout: UICollectionViewFlowLayout {
+    override func layoutAttributesForSupplementaryView(ofKind elementKind: String, at indexPath: IndexPath) -> UICollectionViewLayoutAttributes? {
+        let attributes = UICollectionViewLayoutAttributes(forSupplementaryViewOfKind: UICollectionView.elementKindSectionHeader, with: indexPath)
+        // TODO: Implementation of PinHeader
+        
+        return attributes
+    }
+
+}

+ 1 - 1
Examples/MJRefreshExample/MJRefreshExample/Classes/Second/MJWebViewViewController.m

@@ -18,7 +18,7 @@ @interface MJWebViewViewController () <UIWebViewDelegate>
 
 @implementation MJWebViewViewController
 #pragma mark - 示例
-- (void)example31
+- (void)example40
 {
     __weak UIWebView *webView = self.webView;
     webView.delegate = self;

+ 1 - 0
Examples/MJRefreshExample/MJRefreshExample/Classes/SwiftExample/MJRefreshExample-Bridging-Header.h → Examples/MJRefreshExample/MJRefreshExample/MJRefreshExample-Bridging-Header.h

@@ -3,3 +3,4 @@
 //
 
 #import "MJChiBaoZiHeader.h"
+#import "MJCollectionViewController.h"