Browse Source

一些分类导入的暂时提交, 动态tabbar逻辑暂时提交

yanxuyao 2 years ago
parent
commit
2a50a382a2

+ 58 - 0
MiMoLive/MiMoLive.xcodeproj/project.pbxproj

@@ -68,6 +68,15 @@
 		A63DDCAA2AD17BFA00569758 /* MiMoLiveTests.m in Sources */ = {isa = PBXBuildFile; fileRef = A63DDCA92AD17BFA00569758 /* MiMoLiveTests.m */; };
 		A63DDCB42AD17BFA00569758 /* MiMoLiveUITests.m in Sources */ = {isa = PBXBuildFile; fileRef = A63DDCB32AD17BFA00569758 /* MiMoLiveUITests.m */; };
 		A63DDCB62AD17BFA00569758 /* MiMoLiveUITestsLaunchTests.m in Sources */ = {isa = PBXBuildFile; fileRef = A63DDCB52AD17BFA00569758 /* MiMoLiveUITestsLaunchTests.m */; };
+		A64A0B502ADE6DB600B0CD0A /* MOSquareListVC.m in Sources */ = {isa = PBXBuildFile; fileRef = A64A0B4F2ADE6DB600B0CD0A /* MOSquareListVC.m */; };
+		A64A0B542ADE6DE000B0CD0A /* MOExploreVC.m in Sources */ = {isa = PBXBuildFile; fileRef = A64A0B522ADE6DE000B0CD0A /* MOExploreVC.m */; };
+		A64A0B552ADE6DE000B0CD0A /* MOExploreVC.xib in Resources */ = {isa = PBXBuildFile; fileRef = A64A0B532ADE6DE000B0CD0A /* MOExploreVC.xib */; };
+		A64A0B592ADE6EAF00B0CD0A /* MOInfomationVC.m in Sources */ = {isa = PBXBuildFile; fileRef = A64A0B572ADE6EAF00B0CD0A /* MOInfomationVC.m */; };
+		A64A0B5A2ADE6EAF00B0CD0A /* MOInfomationVC.xib in Resources */ = {isa = PBXBuildFile; fileRef = A64A0B582ADE6EAF00B0CD0A /* MOInfomationVC.xib */; };
+		A64A0B5E2ADE70BE00B0CD0A /* MODynamicTabBar.m in Sources */ = {isa = PBXBuildFile; fileRef = A64A0B5D2ADE70BE00B0CD0A /* MODynamicTabBar.m */; };
+		A64A0B612ADE70DE00B0CD0A /* MOVerticalCenterTabBarButton.m in Sources */ = {isa = PBXBuildFile; fileRef = A64A0B602ADE70DE00B0CD0A /* MOVerticalCenterTabBarButton.m */; };
+		A64A0B642ADE715D00B0CD0A /* UIView+Extension.m in Sources */ = {isa = PBXBuildFile; fileRef = A64A0B632ADE715D00B0CD0A /* UIView+Extension.m */; };
+		A680E9AC2ADE73C800DDFEC3 /* UIView+JCAddition.m in Sources */ = {isa = PBXBuildFile; fileRef = A680E9AA2ADE73C800DDFEC3 /* UIView+JCAddition.m */; };
 		A68B0C762ADE5CF20017E60B /* MOSearchBar.m in Sources */ = {isa = PBXBuildFile; fileRef = A68B0C752ADE5CF20017E60B /* MOSearchBar.m */; };
 		A6D7519F2AD67D5F00553091 /* SENSEME.lic in Resources */ = {isa = PBXBuildFile; fileRef = A6D74F992AD67D5E00553091 /* SENSEME.lic */; };
 		A6D751A02AD67D5F00553091 /* M_SenseME_Verify_p_3.118.0.1.model in Resources */ = {isa = PBXBuildFile; fileRef = A6D74FA52AD67D5E00553091 /* M_SenseME_Verify_p_3.118.0.1.model */; };
@@ -231,6 +240,22 @@
 		A63DDCAF2AD17BFA00569758 /* MiMoLiveUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = MiMoLiveUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
 		A63DDCB32AD17BFA00569758 /* MiMoLiveUITests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MiMoLiveUITests.m; sourceTree = "<group>"; };
 		A63DDCB52AD17BFA00569758 /* MiMoLiveUITestsLaunchTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MiMoLiveUITestsLaunchTests.m; sourceTree = "<group>"; };
+		A64A0B4E2ADE6DB600B0CD0A /* MOSquareListVC.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MOSquareListVC.h; sourceTree = "<group>"; };
+		A64A0B4F2ADE6DB600B0CD0A /* MOSquareListVC.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MOSquareListVC.m; sourceTree = "<group>"; };
+		A64A0B512ADE6DE000B0CD0A /* MOExploreVC.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MOExploreVC.h; sourceTree = "<group>"; };
+		A64A0B522ADE6DE000B0CD0A /* MOExploreVC.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MOExploreVC.m; sourceTree = "<group>"; };
+		A64A0B532ADE6DE000B0CD0A /* MOExploreVC.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MOExploreVC.xib; sourceTree = "<group>"; };
+		A64A0B562ADE6EAF00B0CD0A /* MOInfomationVC.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MOInfomationVC.h; sourceTree = "<group>"; };
+		A64A0B572ADE6EAF00B0CD0A /* MOInfomationVC.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MOInfomationVC.m; sourceTree = "<group>"; };
+		A64A0B582ADE6EAF00B0CD0A /* MOInfomationVC.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MOInfomationVC.xib; sourceTree = "<group>"; };
+		A64A0B5C2ADE70BE00B0CD0A /* MODynamicTabBar.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MODynamicTabBar.h; sourceTree = "<group>"; };
+		A64A0B5D2ADE70BE00B0CD0A /* MODynamicTabBar.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MODynamicTabBar.m; sourceTree = "<group>"; };
+		A64A0B5F2ADE70DE00B0CD0A /* MOVerticalCenterTabBarButton.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MOVerticalCenterTabBarButton.h; sourceTree = "<group>"; };
+		A64A0B602ADE70DE00B0CD0A /* MOVerticalCenterTabBarButton.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MOVerticalCenterTabBarButton.m; sourceTree = "<group>"; };
+		A64A0B622ADE715C00B0CD0A /* UIView+Extension.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIView+Extension.h"; sourceTree = "<group>"; };
+		A64A0B632ADE715D00B0CD0A /* UIView+Extension.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIView+Extension.m"; sourceTree = "<group>"; };
+		A680E9AA2ADE73C800DDFEC3 /* UIView+JCAddition.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIView+JCAddition.m"; sourceTree = "<group>"; };
+		A680E9AB2ADE73C800DDFEC3 /* UIView+JCAddition.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIView+JCAddition.h"; sourceTree = "<group>"; };
 		A68B0C742ADE5CF20017E60B /* MOSearchBar.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MOSearchBar.h; sourceTree = "<group>"; };
 		A68B0C752ADE5CF20017E60B /* MOSearchBar.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MOSearchBar.m; sourceTree = "<group>"; };
 		A6D74F992AD67D5E00553091 /* SENSEME.lic */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = SENSEME.lic; sourceTree = "<group>"; };
@@ -476,6 +501,7 @@
 		A62477DB2AD52F2A000C2E10 /* Main */ = {
 			isa = PBXGroup;
 			children = (
+				A64A0B5B2ADE700B00B0CD0A /* View */,
 				A62477DC2AD52F43000C2E10 /* Controller */,
 			);
 			path = Main;
@@ -515,6 +541,10 @@
 				A62478032AD55523000C2E10 /* UITableViewCell+POAccessory.m */,
 				A60CAEBF2ADD6318007F73C7 /* UIViewController+CustomNavigationBarItem.h */,
 				A60CAEC02ADD6318007F73C7 /* UIViewController+CustomNavigationBarItem.m */,
+				A64A0B622ADE715C00B0CD0A /* UIView+Extension.h */,
+				A64A0B632ADE715D00B0CD0A /* UIView+Extension.m */,
+				A680E9AB2ADE73C800DDFEC3 /* UIView+JCAddition.h */,
+				A680E9AA2ADE73C800DDFEC3 /* UIView+JCAddition.m */,
 			);
 			path = Category;
 			sourceTree = "<group>";
@@ -541,6 +571,8 @@
 		A62477ED2AD535A0000C2E10 /* Square */ = {
 			isa = PBXGroup;
 			children = (
+				A64A0B4E2ADE6DB600B0CD0A /* MOSquareListVC.h */,
+				A64A0B4F2ADE6DB600B0CD0A /* MOSquareListVC.m */,
 			);
 			path = Square;
 			sourceTree = "<group>";
@@ -548,6 +580,9 @@
 		A62477EE2AD535E5000C2E10 /* Explore */ = {
 			isa = PBXGroup;
 			children = (
+				A64A0B512ADE6DE000B0CD0A /* MOExploreVC.h */,
+				A64A0B522ADE6DE000B0CD0A /* MOExploreVC.m */,
+				A64A0B532ADE6DE000B0CD0A /* MOExploreVC.xib */,
 			);
 			path = Explore;
 			sourceTree = "<group>";
@@ -555,6 +590,9 @@
 		A62477EF2AD535F1000C2E10 /* Infomation */ = {
 			isa = PBXGroup;
 			children = (
+				A64A0B562ADE6EAF00B0CD0A /* MOInfomationVC.h */,
+				A64A0B572ADE6EAF00B0CD0A /* MOInfomationVC.m */,
+				A64A0B582ADE6EAF00B0CD0A /* MOInfomationVC.xib */,
 			);
 			path = Infomation;
 			sourceTree = "<group>";
@@ -701,6 +739,17 @@
 			path = MiMoLiveUITests;
 			sourceTree = "<group>";
 		};
+		A64A0B5B2ADE700B00B0CD0A /* View */ = {
+			isa = PBXGroup;
+			children = (
+				A64A0B5C2ADE70BE00B0CD0A /* MODynamicTabBar.h */,
+				A64A0B5D2ADE70BE00B0CD0A /* MODynamicTabBar.m */,
+				A64A0B5F2ADE70DE00B0CD0A /* MOVerticalCenterTabBarButton.h */,
+				A64A0B602ADE70DE00B0CD0A /* MOVerticalCenterTabBarButton.m */,
+			);
+			path = View;
+			sourceTree = "<group>";
+		};
 		A6D74F972AD67D5E00553091 /* st_mobile_sdk */ = {
 			isa = PBXGroup;
 			children = (
@@ -990,6 +1039,8 @@
 				A6D7519F2AD67D5F00553091 /* SENSEME.lic in Resources */,
 				A6320EE42ADBFE4400F2F846 /* MBProgressHUD+JDragon.bundle in Resources */,
 				A60A0F5E2AD434C800421EA4 /* MOAnchorRecommendVC.xib in Resources */,
+				A64A0B5A2ADE6EAF00B0CD0A /* MOInfomationVC.xib in Resources */,
+				A64A0B552ADE6DE000B0CD0A /* MOExploreVC.xib in Resources */,
 				A60A0F582AD424CB00421EA4 /* MOFirstInfoSetVC.xib in Resources */,
 				A63DDC9A2AD17BF900569758 /* Assets.xcassets in Resources */,
 				A63DDC982AD17BF900569758 /* Main.storyboard in Resources */,
@@ -1087,10 +1138,12 @@
 				A6320EE52ADBFE4400F2F846 /* MBProgressHUD+JDragon.m in Sources */,
 				A6320EEC2ADC189300F2F846 /* MODataCache.m in Sources */,
 				A63DDC952AD17BF900569758 /* ViewController.m in Sources */,
+				A680E9AC2ADE73C800DDFEC3 /* UIView+JCAddition.m in Sources */,
 				A62478022AD553EC000C2E10 /* POBaseStyleTableViewCell.m in Sources */,
 				A6D753992AD68F2800553091 /* BundleUtil.m in Sources */,
 				A6D753872AD688DC00553091 /* EffectsAnimal.m in Sources */,
 				A60CAEB12ADD4FE5007F73C7 /* MOSelectPartitionVC.m in Sources */,
+				A64A0B542ADE6DE000B0CD0A /* MOExploreVC.m in Sources */,
 				A62478082AD55D05000C2E10 /* MOImageBaseTableViewCell.m in Sources */,
 				A60CAEBE2ADD5C11007F73C7 /* UITableView+SCIndexView.m in Sources */,
 				A60CAEBD2ADD5C11007F73C7 /* SCIndexView.m in Sources */,
@@ -1099,7 +1152,10 @@
 				A62477DF2AD52F66000C2E10 /* MOMainTabController.m in Sources */,
 				A60CAEC12ADD6318007F73C7 /* UIViewController+CustomNavigationBarItem.m in Sources */,
 				A6320ED52ADBC29300F2F846 /* MOLoginChooseVC.m in Sources */,
+				A64A0B612ADE70DE00B0CD0A /* MOVerticalCenterTabBarButton.m in Sources */,
+				A64A0B592ADE6EAF00B0CD0A /* MOInfomationVC.m in Sources */,
 				A601BADD2AD7E7340021CF03 /* MOMineEditHeadImgCell.m in Sources */,
+				A64A0B5E2ADE70BE00B0CD0A /* MODynamicTabBar.m in Sources */,
 				A60A0F472AD3E59800421EA4 /* POLanguageVC.m in Sources */,
 				A6D753852AD688DC00553091 /* Effects.m in Sources */,
 				A6D7538E2AD688DC00553091 /* EffectsCommonObject.m in Sources */,
@@ -1109,6 +1165,7 @@
 				A601BAEC2AD8001B0021CF03 /* MONetAPIClient.m in Sources */,
 				A6D7538C2AD688DC00553091 /* EffectsLicense.m in Sources */,
 				A63DDCA02AD17BF900569758 /* main.m in Sources */,
+				A64A0B502ADE6DB600B0CD0A /* MOSquareListVC.m in Sources */,
 				A60A0F572AD424CB00421EA4 /* MOFirstInfoSetVC.m in Sources */,
 				A601BAE82AD7FA850021CF03 /* MOHttpManager.m in Sources */,
 				A6D753882AD688DC00553091 /* EffectsProcess.m in Sources */,
@@ -1116,6 +1173,7 @@
 				A601BACE2AD7C7F60021CF03 /* MoFile.swift in Sources */,
 				A60CAEBC2ADD5C11007F73C7 /* SCIndexViewConfiguration.m in Sources */,
 				A6320EDA2ADBCEE200F2F846 /* MOPwdAndSMSLoginVC.m in Sources */,
+				A64A0B642ADE715D00B0CD0A /* UIView+Extension.m in Sources */,
 				A6D753A72AD6B88300553091 /* MOMineTopUpCellTableViewCell.m in Sources */,
 				A60A0F502AD3FBF000421EA4 /* MOTools.m in Sources */,
 				A6320EE92ADC14C400F2F846 /* MODataManager.m in Sources */,

BIN
MiMoLive/MiMoLive.xcworkspace/xcuserdata/yanxuyao.xcuserdatad/UserInterfaceState.xcuserstate


+ 16 - 0
MiMoLive/MiMoLive/Classes/Explore/MOExploreVC.h

@@ -0,0 +1,16 @@
+//
+//  MOExploreVC.h
+//  MiMoLive
+//
+//  Created by 闫旭垚 on 2023/10/17.
+//
+
+#import <UIKit/UIKit.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface MOExploreVC : UIViewController
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 23 - 0
MiMoLive/MiMoLive/Classes/Explore/MOExploreVC.m

@@ -0,0 +1,23 @@
+//
+//  MOExploreVC.m
+//  MiMoLive
+//
+//  Created by 闫旭垚 on 2023/10/17.
+//
+
+#import "MOExploreVC.h"
+
+@interface MOExploreVC ()
+
+@end
+
+@implementation MOExploreVC
+
+- (void)viewDidLoad {
+    [super viewDidLoad];
+    // Do any additional setup after loading the view from its nib.
+}
+
+
+
+@end

+ 22 - 0
MiMoLive/MiMoLive/Classes/Explore/MOExploreVC.xib

@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="13142" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
+    <dependencies>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="12042"/>
+        <capability name="Safe area layout guides" minToolsVersion="9.0"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="MOExploreVC">
+            <connections>
+                <outlet property="view" destination="i5M-Pr-FkT" id="sfx-zR-JGt"/>
+            </connections>
+        </placeholder>
+        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+        <view clearsContextBeforeDrawing="NO" contentMode="scaleToFill" id="i5M-Pr-FkT">
+            <rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
+            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+            <color key="backgroundColor" systemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
+            <viewLayoutGuide key="safeArea" id="Q5M-cg-NOt"/>
+        </view>
+    </objects>
+</document>

+ 16 - 0
MiMoLive/MiMoLive/Classes/Infomation/MOInfomationVC.h

@@ -0,0 +1,16 @@
+//
+//  MOInfomationVC.h
+//  MiMoLive
+//
+//  Created by 闫旭垚 on 2023/10/17.
+//
+
+#import <UIKit/UIKit.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface MOInfomationVC : UIViewController
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 22 - 0
MiMoLive/MiMoLive/Classes/Infomation/MOInfomationVC.m

@@ -0,0 +1,22 @@
+//
+//  MOInfomationVC.m
+//  MiMoLive
+//
+//  Created by 闫旭垚 on 2023/10/17.
+//
+
+#import "MOInfomationVC.h"
+
+@interface MOInfomationVC ()
+
+@end
+
+@implementation MOInfomationVC
+
+- (void)viewDidLoad {
+    [super viewDidLoad];
+    // Do any additional setup after loading the view from its nib.
+}
+
+
+@end

+ 22 - 0
MiMoLive/MiMoLive/Classes/Infomation/MOInfomationVC.xib

@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="13142" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
+    <dependencies>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="12042"/>
+        <capability name="Safe area layout guides" minToolsVersion="9.0"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="MOInfomationVC">
+            <connections>
+                <outlet property="view" destination="i5M-Pr-FkT" id="sfx-zR-JGt"/>
+            </connections>
+        </placeholder>
+        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+        <view clearsContextBeforeDrawing="NO" contentMode="scaleToFill" id="i5M-Pr-FkT">
+            <rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
+            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+            <color key="backgroundColor" systemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
+            <viewLayoutGuide key="safeArea" id="Q5M-cg-NOt"/>
+        </view>
+    </objects>
+</document>

+ 4 - 0
MiMoLive/MiMoLive/Classes/Main/Controller/MOMainTabController.m

@@ -6,6 +6,10 @@
 //
 
 #import "MOMainTabController.h"
+#import "MOExploreVC.h"
+#import "MOSquareListVC.h"
+#import "MOInfomationVC.h"
+#import "MOMineVC.h"
 
 static MOMainTabController *_sharedSingleton = nil;
 static dispatch_once_t onceToken;

+ 16 - 0
MiMoLive/MiMoLive/Classes/Main/View/MODynamicTabBar.h

@@ -0,0 +1,16 @@
+//
+//  MODynamicTabBar.h
+//  MiMoLive
+//
+//  Created by 闫旭垚 on 2023/10/17.
+//
+
+#import <UIKit/UIKit.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface MODynamicTabBar : UITabBar
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 14 - 0
MiMoLive/MiMoLive/Classes/Main/View/MODynamicTabBar.m

@@ -0,0 +1,14 @@
+//
+//  MODynamicTabBar.m
+//  MiMoLive
+//
+//  Created by 闫旭垚 on 2023/10/17.
+//
+
+#import "MODynamicTabBar.h"
+
+@implementation MODynamicTabBar
+
+
+
+@end

+ 33 - 0
MiMoLive/MiMoLive/Classes/Main/View/MOVerticalCenterTabBarButton.h

@@ -0,0 +1,33 @@
+//
+//  MOVerticalCenterTabBarButton.h
+//  MiMoLive
+//
+//  Created by 闫旭垚 on 2023/10/17.
+//
+
+#import <UIKit/UIKit.h>
+
+/** 刷新控件的状态 */
+typedef NS_ENUM(NSInteger, POTabbarBtnType)
+{
+    /** 常态 (图片和文字) */
+    MOTabbarBtnTypeNormal = 1,
+    /** 只有图片 */
+    MOTabbarBtnTypeOnlyImage,
+    /** 只有文字 */
+    MOTabbarBtnTypeOnlyText
+};
+
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface MOVerticalCenterTabBarButton : UIButton
+
+/** 根据按钮的状态去调整按钮样式 */
+@property (nonatomic, assign) POTabbarBtnType btnType;
+/** 图片的宽度 和 高度 (宽高一样) */
+@property (nonatomic, assign) CGFloat imageWidth;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 74 - 0
MiMoLive/MiMoLive/Classes/Main/View/MOVerticalCenterTabBarButton.m

@@ -0,0 +1,74 @@
+//
+//  MOVerticalCenterTabBarButton.m
+//  MiMoLive
+//
+//  Created by 闫旭垚 on 2023/10/17.
+//
+
+#import "MOVerticalCenterTabBarButton.h"
+
+@implementation MOVerticalCenterTabBarButton
+
+// button上的图片和文字垂直排列,水平居中
+-(void)layoutSubviews
+{
+    [super layoutSubviews];
+    
+    // 图片居中
+    self.imageView.width = self.imageWidth;
+    self.imageView.height = self.imageWidth;
+    CGPoint center = self.imageView.center;
+    center.x = self.frame.size.width / 2;
+    if (KIsiPhoneX)
+    {
+        //iPhoneX以上机型, 按钮图标向下修正4px
+        center.y = self.imageView.frame.size.height/2 + 9;
+    }
+    else
+    {
+        center.y = self.imageView.frame.size.height/2 + 5;
+    }
+    self.imageView.center = center;
+    
+    // 文字居中
+    CGRect newFrame = [self titleLabel].frame;
+    newFrame.origin.x = 0;
+    if (self.btnType == MOTabbarBtnTypeOnlyText)
+    {
+        //只有文字, 比较偏居中
+        newFrame.origin.y = self.imageView.frame.size.height / 2 + 5;//5为修正值, 正居中的话, 视觉效果有点偏上
+    }
+    else
+    {
+        newFrame.origin.y = CGRectGetMaxY(self.imageView.frame) + 2;
+    }
+    newFrame.size.height = 16.0;
+    newFrame.size.width = 80.0;
+    self.titleLabel.frame = newFrame;
+    self.titleLabel.centerX = self.imageView.centerX;
+    self.titleLabel.textAlignment = NSTextAlignmentCenter;
+}
+
+- (CGFloat)imageWidth
+{
+    if (self.btnType == MOTabbarBtnTypeOnlyImage)
+    {
+        return 34.0;
+    }
+    else if (self.btnType == MOTabbarBtnTypeOnlyText)
+    {
+        return 22.0;
+    }
+    else
+    {
+        return 22.0;
+    }
+}
+
+- (void)setBtnType:(POTabbarBtnType)btnType
+{
+    _btnType = btnType;
+}
+
+
+@end

+ 16 - 0
MiMoLive/MiMoLive/Classes/Square/MOSquareListVC.h

@@ -0,0 +1,16 @@
+//
+//  MOSquareListVC.h
+//  MiMoLive
+//
+//  Created by 闫旭垚 on 2023/10/17.
+//
+
+#import <UIKit/UIKit.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface MOSquareListVC : UIViewController
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 31 - 0
MiMoLive/MiMoLive/Classes/Square/MOSquareListVC.m

@@ -0,0 +1,31 @@
+//
+//  MOSquareListVC.m
+//  MiMoLive
+//
+//  Created by 闫旭垚 on 2023/10/17.
+//
+
+#import "MOSquareListVC.h"
+
+@interface MOSquareListVC ()
+
+@end
+
+@implementation MOSquareListVC
+
+- (void)viewDidLoad {
+    [super viewDidLoad];
+    // Do any additional setup after loading the view.
+}
+
+/*
+#pragma mark - Navigation
+
+// In a storyboard-based application, you will often want to do a little preparation before navigation
+- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
+    // Get the new view controller using [segue destinationViewController].
+    // Pass the selected object to the new view controller.
+}
+*/
+
+@end

+ 3 - 0
MiMoLive/MiMoLive/Classes/Welcome/MOFirstInfoSetVC.m

@@ -36,6 +36,9 @@
     self.skipBtn.layer.cornerRadius = 22.0 / 2.0;
     self.skipBtn.layer.masksToBounds = YES;
     
+    self.headBtn.layer.cornerRadius = 118.0 / 2.0;
+    self.headBtn.layer.masksToBounds = YES;
+    
     [self.manBtn setImage:[UIImage imageNamed:@"icon_man_select"] forState:UIControlStateSelected];
     [self.womanBtn setImage:[UIImage imageNamed:@"icon_woman_no_select"] forState:UIControlStateNormal];
     

+ 18 - 0
MiMoLive/MiMoLive/Global/Category/UIView+Extension.h

@@ -0,0 +1,18 @@
+//
+//  UIView+Extension.h
+//  MJRefreshExample
+//
+//  Created by MJ Lee on 14-5-28.
+//  Copyright (c) 2014年 itcast. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+@interface UIView (Extension)
+@property (assign, nonatomic) CGFloat x;
+@property (assign, nonatomic) CGFloat y;
+@property (assign, nonatomic) CGFloat width;
+@property (assign, nonatomic) CGFloat height;
+@property (assign, nonatomic) CGSize size;
+@property (assign, nonatomic) CGPoint origin;
+@end

+ 83 - 0
MiMoLive/MiMoLive/Global/Category/UIView+Extension.m

@@ -0,0 +1,83 @@
+//
+//  UIView+Extension.m
+//  MJRefreshExample
+//
+//  Created by MJ Lee on 14-5-28.
+//  Copyright (c) 2014年 itcast. All rights reserved.
+//
+
+#import "UIView+Extension.h"
+
+@implementation UIView (Extension)
+- (void)setX:(CGFloat)x
+{
+    CGRect frame = self.frame;
+    frame.origin.x = x;
+    self.frame = frame;
+}
+
+- (CGFloat)x
+{
+    return self.frame.origin.x;
+}
+
+- (void)setY:(CGFloat)y
+{
+    CGRect frame = self.frame;
+    frame.origin.y = y;
+    self.frame = frame;
+}
+
+- (CGFloat)y
+{
+    return self.frame.origin.y;
+}
+
+- (void)setWidth:(CGFloat)width
+{
+    CGRect frame = self.frame;
+    frame.size.width = width;
+    self.frame = frame;
+}
+
+- (CGFloat)width
+{
+    return self.frame.size.width;
+}
+
+- (void)setHeight:(CGFloat)height
+{
+    CGRect frame = self.frame;
+    frame.size.height = height;
+    self.frame = frame;
+}
+
+- (CGFloat)height
+{
+    return self.frame.size.height;
+}
+
+- (void)setSize:(CGSize)size
+{
+    CGRect frame = self.frame;
+    frame.size = size;
+    self.frame = frame;
+}
+
+- (CGSize)size
+{
+    return self.frame.size;
+}
+
+- (void)setOrigin:(CGPoint)origin
+{
+    CGRect frame = self.frame;
+    frame.origin = origin;
+    self.frame = frame;
+}
+
+- (CGPoint)origin
+{
+    return self.frame.origin;
+}
+@end

+ 128 - 0
MiMoLive/MiMoLive/Global/Category/UIView+JCAddition.h

@@ -0,0 +1,128 @@
+//
+//  UIView+JCAddition.h
+//  JCVideoRecordDemo
+//
+//  Created by zhengjiacheng on 2017/9/28.
+//  Copyright © 2017年 onecloud.ltd. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+@interface UIView (JCAddition)
+/**
+ * Shortcut for frame.origin.x.
+ *
+ * Sets frame.origin.x = left
+ */
+@property(nonatomic) CGFloat left;
+
+/**
+ * Shortcut for frame.origin.y
+ *
+ * Sets frame.origin.y = top
+ */
+@property(nonatomic) CGFloat top;
+
+/**
+ * Shortcut for frame.origin.x + frame.size.width
+ *
+ * Sets frame.origin.x = right - frame.size.width
+ */
+@property(nonatomic) CGFloat right;
+
+/**
+ * Shortcut for frame.origin.y + frame.size.height
+ *
+ * Sets frame.origin.y = bottom - frame.size.height
+ */
+@property(nonatomic) CGFloat bottom;
+
+/**
+ * Shortcut for frame.size.width
+ *
+ * Sets frame.size.width = width
+ */
+@property(nonatomic) CGFloat width;
+
+/**
+ * Shortcut for frame.size.height
+ *
+ * Sets frame.size.height = height
+ */
+@property(nonatomic) CGFloat height;
+
+/**
+ * Shortcut for center.x
+ *
+ * Sets center.x = centerX
+ */
+@property(nonatomic) CGFloat centerX;
+
+/**
+ * Shortcut for center.y
+ *
+ * Sets center.y = centerY
+ */
+@property(nonatomic) CGFloat centerY;
+
+/**
+ * Return the x coordinate on the screen.
+ */
+@property(nonatomic, readonly) CGFloat ttScreenX;
+
+/**
+ * Return the y coordinate on the screen.
+ */
+@property(nonatomic, readonly) CGFloat ttScreenY;
+
+/**
+ * Return the x coordinate on the screen, taking into account scroll views.
+ */
+@property(nonatomic, readonly) CGFloat screenViewX;
+
+/**
+ * Return the y coordinate on the screen, taking into account scroll views.
+ */
+@property(nonatomic, readonly) CGFloat screenViewY;
+
+/**
+ * Return the view frame on the screen, taking into account scroll views.
+ */
+@property(nonatomic, readonly) CGRect screenFrame;
+
+/**
+ * Shortcut for frame.origin
+ */
+@property(nonatomic) CGPoint origin;
+
+/**
+ * Shortcut for frame.size
+ */
+@property(nonatomic) CGSize size;
+
+/**
+ * Finds the first descendant view (including this view) that is a member of a particular class.
+ */
+- (UIView *)descendantOrSelfWithClass:(Class)cls;
+
+/**
+ * Finds the first ancestor view (including this view) that is a member of a particular class.
+ */
+- (UIView *)ancestorOrSelfWithClass:(Class)cls;
+
+/**
+ * Removes all subviews.
+ */
+- (void)removeAllSubviews;
+
+/**
+ * Calculates the offset of this view from another view in screen coordinates.
+ *
+ * otherView should be a parent view of this view.
+ */
+- (CGPoint)offsetFromView:(UIView *)otherView;
+
+// Frame Origin
+@property (nonatomic) CGFloat x;
+@property (nonatomic) CGFloat y;
+@end

+ 276 - 0
MiMoLive/MiMoLive/Global/Category/UIView+JCAddition.m

@@ -0,0 +1,276 @@
+//
+//  UIView+JCAddition.m
+//  JCVideoRecordDemo
+//
+//  Created by zhengjiacheng on 2017/9/28.
+//  Copyright © 2017年 onecloud.ltd. All rights reserved.
+//
+
+#import "UIView+JCAddition.h"
+
+@implementation UIView (JCAddition)
+///////////////////////////////////////////////////////////////////////////////////////////////////
+- (CGFloat)left {
+    return self.frame.origin.x;
+}
+
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+- (void)setLeft:(CGFloat)x {
+    CGRect frame = self.frame;
+    frame.origin.x = x;
+    self.frame = frame;
+}
+
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+- (CGFloat)top {
+    return self.frame.origin.y;
+}
+
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+- (void)setTop:(CGFloat)y {
+    CGRect frame = self.frame;
+    frame.origin.y = y;
+    self.frame = frame;
+}
+
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+- (CGFloat)right {
+    return self.frame.origin.x + self.frame.size.width;
+}
+
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+- (void)setRight:(CGFloat)right {
+    CGRect frame = self.frame;
+    frame.origin.x = right - frame.size.width;
+    self.frame = frame;
+}
+
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+- (CGFloat)bottom {
+    return self.frame.origin.y + self.frame.size.height;
+}
+
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+- (void)setBottom:(CGFloat)bottom {
+    CGRect frame = self.frame;
+    frame.origin.y = bottom - frame.size.height;
+    self.frame = frame;
+}
+
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+- (CGFloat)centerX {
+    return self.center.x;
+}
+
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+- (void)setCenterX:(CGFloat)centerX {
+    self.center = CGPointMake(centerX, self.center.y);
+}
+
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+- (CGFloat)centerY {
+    return self.center.y;
+}
+
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+- (void)setCenterY:(CGFloat)centerY {
+    self.center = CGPointMake(self.center.x, centerY);
+}
+
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+- (CGFloat)width {
+    return self.frame.size.width;
+}
+
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+- (void)setWidth:(CGFloat)width {
+    CGRect frame = self.frame;
+    frame.size.width = width;
+    self.frame = frame;
+}
+
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+- (CGFloat)height {
+    return self.frame.size.height;
+}
+
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+- (void)setHeight:(CGFloat)height {
+    CGRect frame = self.frame;
+    frame.size.height = height;
+    self.frame = frame;
+}
+
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+- (CGFloat)ttScreenX {
+    CGFloat x = 0.0f;
+    for (UIView* view = self; view; view = view.superview) {
+        x += view.left;
+    }
+    return x;
+}
+
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+- (CGFloat)ttScreenY {
+    CGFloat y = 0.0f;
+    for (UIView* view = self; view; view = view.superview) {
+        y += view.top;
+    }
+    return y;
+}
+
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+- (CGFloat)screenViewX {
+    CGFloat x = 0.0f;
+    for (UIView* view = self; view; view = view.superview) {
+        x += view.left;
+        
+        if ([view isKindOfClass:[UIScrollView class]]) {
+            UIScrollView* scrollView = (UIScrollView*)view;
+            x -= scrollView.contentOffset.x;
+        }
+    }
+    
+    return x;
+}
+
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+- (CGFloat)screenViewY {
+    CGFloat y = 0;
+    for (UIView* view = self; view; view = view.superview) {
+        y += view.top;
+        
+        if ([view isKindOfClass:[UIScrollView class]]) {
+            UIScrollView* scrollView = (UIScrollView*)view;
+            y -= scrollView.contentOffset.y;
+        }
+    }
+    return y;
+}
+
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+- (CGRect)screenFrame {
+    return CGRectMake(self.screenViewX, self.screenViewY, self.width, self.height);
+}
+
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+- (CGPoint)origin {
+    return self.frame.origin;
+}
+
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+- (void)setOrigin:(CGPoint)origin {
+    CGRect frame = self.frame;
+    frame.origin = origin;
+    self.frame = frame;
+}
+
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+- (CGSize)size {
+    return self.frame.size;
+}
+
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+- (void)setSize:(CGSize)size {
+    CGRect frame = self.frame;
+    frame.size = size;
+    self.frame = frame;
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+- (UIView*)descendantOrSelfWithClass:(Class)cls {
+    if ([self isKindOfClass:cls])
+        return self;
+    
+    for (UIView* child in self.subviews) {
+        UIView* it = [child descendantOrSelfWithClass:cls];
+        if (it)
+            return it;
+    }
+    
+    return nil;
+}
+
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+- (UIView*)ancestorOrSelfWithClass:(Class)cls {
+    if ([self isKindOfClass:cls]) {
+        return self;
+        
+    } else if (self.superview) {
+        return [self.superview ancestorOrSelfWithClass:cls];
+        
+    } else {
+        return nil;
+    }
+}
+
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+- (void)removeAllSubviews {
+    while (self.subviews.count) {
+        UIView* child = self.subviews.lastObject;
+        [child removeFromSuperview];
+    }
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+- (CGPoint)offsetFromView:(UIView*)otherView {
+    CGFloat x = 0.0f, y = 0.0f;
+    for (UIView* view = self; view && view != otherView; view = view.superview) {
+        x += view.left;
+        y += view.top;
+    }
+    return CGPointMake(x, y);
+}
+
+#pragma mark Frame Origin
+
+- (CGFloat)x
+{
+    return self.frame.origin.x;
+}
+
+- (void)setX:(CGFloat)newX
+{
+    CGRect newFrame = self.frame;
+    newFrame.origin.x = newX;
+    self.frame = newFrame;
+}
+
+- (CGFloat)y
+{
+    return self.frame.origin.y;
+}
+
+- (void)setY:(CGFloat)newY
+{
+    CGRect newFrame = self.frame;
+    newFrame.origin.y = newY;
+    self.frame = newFrame;
+}
+@end

+ 2 - 0
MiMoLive/MiMoLive/MiMOPch.pch

@@ -24,6 +24,8 @@
 
 #import "UITableViewCell+POAccessory.h"
 #import "UIViewController+CustomNavigationBarItem.h"
+#import "UIView+Extension.h"
+#import "UIView+JCAddition.h"
 
 #import "MOHttpManager.h"
 #import "MODataCache.h"