From e7530873696a74db8aa37d404cc2af8b3d8cf6e7 Mon Sep 17 00:00:00 2001 From: lihuilin Date: Mon, 8 Dec 2025 14:42:10 +0800 Subject: [PATCH] ajkshdfajsfhd --- {HC => App/HC}/AppDelegate.h | 0 {HC => App/HC}/AppDelegate.m | 0 .../AccentColor.colorset/Contents.json | 0 .../AppIcon.appiconset/10241024.jpg | Bin 0 -> 222695 bytes .../AppIcon.appiconset/Contents.json | 1 + {HC => App/HC}/Assets.xcassets/Contents.json | 0 .../Assets.xcassets/banner1.imageset/Contents.json | 0 .../Assets.xcassets/banner1.imageset/banner1.jpg | Bin .../Assets.xcassets/banner2.imageset/Contents.json | 0 .../Assets.xcassets/banner2.imageset/banner2.jpg | Bin .../Assets.xcassets/email.imageset/Contents.json | 0 .../HC}/Assets.xcassets/email.imageset/email.jpg | Bin .../HC}/Assets.xcassets/hqz.imageset/Contents.json | 0 .../HC}/Assets.xcassets/hqz.imageset/hqz.jpg | Bin .../Assets.xcassets/image.imageset/Contents.json | 0 .../logo.imageset/20251117-225344.jpg | Bin .../Assets.xcassets/logo.imageset/Contents.json | 0 {HC => App/HC}/Assets.xcassets/logo.jpg | Bin .../singapore_flag.imageset/Contents.json | 0 .../singapore_flag.imageset/singapore_flag.jpg | Bin {HC => App/HC}/Base.lproj/LaunchScreen.storyboard | 0 {HC => App/HC}/Base.lproj/Main.storyboard | 0 {HC => App/HC}/CNViewController.h | 0 {HC => App/HC}/CNViewController.m | 0 {HC => App/HC}/ChartViewController.h | 0 App/HC/ChartViewController.m | 977 +++++++++++++++++++++ {HC => App/HC}/CommonTabBar.h | 0 {HC => App/HC}/CommonTabBar.m | 0 {HC => App/HC}/CountryModel.h | 0 {HC => App/HC}/CountryModel.m | 0 {HC => App/HC}/HC.xcdatamodeld/.xccurrentversion | 0 .../HC}/HC.xcdatamodeld/HC.xcdatamodel/contents | 0 {HC => App/HC}/HomeViewController.h | 0 {HC => App/HC}/HomeViewController.m | 0 {HC => App/HC}/Info.plist | 0 {HC => App/HC}/MLXYViewController.h | 0 App/HC/MLXYViewController.m | 585 ++++++++++++ {HC => App/HC}/MyViewController.h | 0 {HC => App/HC}/MyViewController.m | 0 {HC => App/HC}/QuotationViewController.h | 0 {HC => App/HC}/QuotationViewController.m | 11 +- {HC => App/HC}/SceneDelegate.h | 0 {HC => App/HC}/SceneDelegate.m | 14 +- App/HC/StockInfoCardView.h | 29 + App/HC/StockInfoCardView.m | 156 ++++ {HC => App/HC}/StockKLineModel.h | 18 +- {HC => App/HC}/StockKLineModel.m | 0 {HC => App/HC}/ViewController.h | 0 {HC => App/HC}/ViewController.m | 0 {HC => App/HC}/main.m | 0 HC.xcodeproj/project.pbxproj | 28 +- .../IDEFindNavigatorScopes.plist | 5 + HC/ChartViewController.m | 592 ------------- HC/MLXYViewController.m | 442 ---------- 54 files changed, 1796 insertions(+), 1062 deletions(-) rename {HC => App/HC}/AppDelegate.h (100%) rename {HC => App/HC}/AppDelegate.m (100%) rename {HC => App/HC}/Assets.xcassets/AccentColor.colorset/Contents.json (100%) create mode 100644 App/HC/Assets.xcassets/AppIcon.appiconset/10241024.jpg rename {HC => App/HC}/Assets.xcassets/AppIcon.appiconset/Contents.json (94%) rename {HC => App/HC}/Assets.xcassets/Contents.json (100%) rename {HC => App/HC}/Assets.xcassets/banner1.imageset/Contents.json (100%) rename {HC => App/HC}/Assets.xcassets/banner1.imageset/banner1.jpg (100%) rename {HC => App/HC}/Assets.xcassets/banner2.imageset/Contents.json (100%) rename {HC => App/HC}/Assets.xcassets/banner2.imageset/banner2.jpg (100%) rename {HC => App/HC}/Assets.xcassets/email.imageset/Contents.json (100%) rename {HC => App/HC}/Assets.xcassets/email.imageset/email.jpg (100%) rename {HC => App/HC}/Assets.xcassets/hqz.imageset/Contents.json (100%) rename {HC => App/HC}/Assets.xcassets/hqz.imageset/hqz.jpg (100%) rename {HC => App/HC}/Assets.xcassets/image.imageset/Contents.json (100%) rename {HC => App/HC}/Assets.xcassets/logo.imageset/20251117-225344.jpg (100%) rename {HC => App/HC}/Assets.xcassets/logo.imageset/Contents.json (100%) rename {HC => App/HC}/Assets.xcassets/logo.jpg (100%) rename {HC => App/HC}/Assets.xcassets/singapore_flag.imageset/Contents.json (100%) rename {HC => App/HC}/Assets.xcassets/singapore_flag.imageset/singapore_flag.jpg (100%) rename {HC => App/HC}/Base.lproj/LaunchScreen.storyboard (100%) rename {HC => App/HC}/Base.lproj/Main.storyboard (100%) rename {HC => App/HC}/CNViewController.h (100%) rename {HC => App/HC}/CNViewController.m (100%) rename {HC => App/HC}/ChartViewController.h (100%) create mode 100644 App/HC/ChartViewController.m rename {HC => App/HC}/CommonTabBar.h (100%) rename {HC => App/HC}/CommonTabBar.m (100%) rename {HC => App/HC}/CountryModel.h (100%) rename {HC => App/HC}/CountryModel.m (100%) rename {HC => App/HC}/HC.xcdatamodeld/.xccurrentversion (100%) rename {HC => App/HC}/HC.xcdatamodeld/HC.xcdatamodel/contents (100%) rename {HC => App/HC}/HomeViewController.h (100%) rename {HC => App/HC}/HomeViewController.m (100%) rename {HC => App/HC}/Info.plist (100%) rename {HC => App/HC}/MLXYViewController.h (100%) create mode 100644 App/HC/MLXYViewController.m rename {HC => App/HC}/MyViewController.h (100%) rename {HC => App/HC}/MyViewController.m (100%) rename {HC => App/HC}/QuotationViewController.h (100%) rename {HC => App/HC}/QuotationViewController.m (95%) rename {HC => App/HC}/SceneDelegate.h (100%) rename {HC => App/HC}/SceneDelegate.m (81%) create mode 100644 App/HC/StockInfoCardView.h create mode 100644 App/HC/StockInfoCardView.m rename {HC => App/HC}/StockKLineModel.h (60%) rename {HC => App/HC}/StockKLineModel.m (100%) rename {HC => App/HC}/ViewController.h (100%) rename {HC => App/HC}/ViewController.m (100%) rename {HC => App/HC}/main.m (100%) create mode 100644 HC.xcodeproj/project.xcworkspace/xcuserdata/huilinli.xcuserdatad/IDEFindNavigatorScopes.plist delete mode 100644 HC/ChartViewController.m delete mode 100644 HC/MLXYViewController.m diff --git a/HC/AppDelegate.h b/App/HC/AppDelegate.h similarity index 100% rename from HC/AppDelegate.h rename to App/HC/AppDelegate.h diff --git a/HC/AppDelegate.m b/App/HC/AppDelegate.m similarity index 100% rename from HC/AppDelegate.m rename to App/HC/AppDelegate.m diff --git a/HC/Assets.xcassets/AccentColor.colorset/Contents.json b/App/HC/Assets.xcassets/AccentColor.colorset/Contents.json similarity index 100% rename from HC/Assets.xcassets/AccentColor.colorset/Contents.json rename to App/HC/Assets.xcassets/AccentColor.colorset/Contents.json diff --git a/App/HC/Assets.xcassets/AppIcon.appiconset/10241024.jpg b/App/HC/Assets.xcassets/AppIcon.appiconset/10241024.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5c33dda491ace162158311c26db22ab8dc141a75 GIT binary patch literal 222695 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

*vE=hpl%_Idyf`;y-Gdg-mm2*CHlmB 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 z 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 T?;C7v%Z`y2OzW<;nm_;9pYeVi literal 0 HcmV?d00001 diff --git a/HC/Assets.xcassets/AppIcon.appiconset/Contents.json b/App/HC/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 94% rename from HC/Assets.xcassets/AppIcon.appiconset/Contents.json rename to App/HC/Assets.xcassets/AppIcon.appiconset/Contents.json index 2305880..601341d 100644 --- a/HC/Assets.xcassets/AppIcon.appiconset/Contents.json +++ b/App/HC/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -1,6 +1,7 @@ { "images" : [ { + "filename" : "10241024.jpg", "idiom" : "universal", "platform" : "ios", "size" : "1024x1024" diff --git a/HC/Assets.xcassets/Contents.json b/App/HC/Assets.xcassets/Contents.json similarity index 100% rename from HC/Assets.xcassets/Contents.json rename to App/HC/Assets.xcassets/Contents.json diff --git a/HC/Assets.xcassets/banner1.imageset/Contents.json b/App/HC/Assets.xcassets/banner1.imageset/Contents.json similarity index 100% rename from HC/Assets.xcassets/banner1.imageset/Contents.json rename to App/HC/Assets.xcassets/banner1.imageset/Contents.json diff --git a/HC/Assets.xcassets/banner1.imageset/banner1.jpg b/App/HC/Assets.xcassets/banner1.imageset/banner1.jpg similarity index 100% rename from HC/Assets.xcassets/banner1.imageset/banner1.jpg rename to App/HC/Assets.xcassets/banner1.imageset/banner1.jpg diff --git a/HC/Assets.xcassets/banner2.imageset/Contents.json b/App/HC/Assets.xcassets/banner2.imageset/Contents.json similarity index 100% rename from HC/Assets.xcassets/banner2.imageset/Contents.json rename to App/HC/Assets.xcassets/banner2.imageset/Contents.json diff --git a/HC/Assets.xcassets/banner2.imageset/banner2.jpg b/App/HC/Assets.xcassets/banner2.imageset/banner2.jpg similarity index 100% rename from HC/Assets.xcassets/banner2.imageset/banner2.jpg rename to App/HC/Assets.xcassets/banner2.imageset/banner2.jpg diff --git a/HC/Assets.xcassets/email.imageset/Contents.json b/App/HC/Assets.xcassets/email.imageset/Contents.json similarity index 100% rename from HC/Assets.xcassets/email.imageset/Contents.json rename to App/HC/Assets.xcassets/email.imageset/Contents.json diff --git a/HC/Assets.xcassets/email.imageset/email.jpg b/App/HC/Assets.xcassets/email.imageset/email.jpg similarity index 100% rename from HC/Assets.xcassets/email.imageset/email.jpg rename to App/HC/Assets.xcassets/email.imageset/email.jpg diff --git a/HC/Assets.xcassets/hqz.imageset/Contents.json b/App/HC/Assets.xcassets/hqz.imageset/Contents.json similarity index 100% rename from HC/Assets.xcassets/hqz.imageset/Contents.json rename to App/HC/Assets.xcassets/hqz.imageset/Contents.json diff --git a/HC/Assets.xcassets/hqz.imageset/hqz.jpg b/App/HC/Assets.xcassets/hqz.imageset/hqz.jpg similarity index 100% rename from HC/Assets.xcassets/hqz.imageset/hqz.jpg rename to App/HC/Assets.xcassets/hqz.imageset/hqz.jpg diff --git a/HC/Assets.xcassets/image.imageset/Contents.json b/App/HC/Assets.xcassets/image.imageset/Contents.json similarity index 100% rename from HC/Assets.xcassets/image.imageset/Contents.json rename to App/HC/Assets.xcassets/image.imageset/Contents.json diff --git a/HC/Assets.xcassets/logo.imageset/20251117-225344.jpg b/App/HC/Assets.xcassets/logo.imageset/20251117-225344.jpg similarity index 100% rename from HC/Assets.xcassets/logo.imageset/20251117-225344.jpg rename to App/HC/Assets.xcassets/logo.imageset/20251117-225344.jpg diff --git a/HC/Assets.xcassets/logo.imageset/Contents.json b/App/HC/Assets.xcassets/logo.imageset/Contents.json similarity index 100% rename from HC/Assets.xcassets/logo.imageset/Contents.json rename to App/HC/Assets.xcassets/logo.imageset/Contents.json diff --git a/HC/Assets.xcassets/logo.jpg b/App/HC/Assets.xcassets/logo.jpg similarity index 100% rename from HC/Assets.xcassets/logo.jpg rename to App/HC/Assets.xcassets/logo.jpg diff --git a/HC/Assets.xcassets/singapore_flag.imageset/Contents.json b/App/HC/Assets.xcassets/singapore_flag.imageset/Contents.json similarity index 100% rename from HC/Assets.xcassets/singapore_flag.imageset/Contents.json rename to App/HC/Assets.xcassets/singapore_flag.imageset/Contents.json diff --git a/HC/Assets.xcassets/singapore_flag.imageset/singapore_flag.jpg b/App/HC/Assets.xcassets/singapore_flag.imageset/singapore_flag.jpg similarity index 100% rename from HC/Assets.xcassets/singapore_flag.imageset/singapore_flag.jpg rename to App/HC/Assets.xcassets/singapore_flag.imageset/singapore_flag.jpg diff --git a/HC/Base.lproj/LaunchScreen.storyboard b/App/HC/Base.lproj/LaunchScreen.storyboard similarity index 100% rename from HC/Base.lproj/LaunchScreen.storyboard rename to App/HC/Base.lproj/LaunchScreen.storyboard diff --git a/HC/Base.lproj/Main.storyboard b/App/HC/Base.lproj/Main.storyboard similarity index 100% rename from HC/Base.lproj/Main.storyboard rename to App/HC/Base.lproj/Main.storyboard diff --git a/HC/CNViewController.h b/App/HC/CNViewController.h similarity index 100% rename from HC/CNViewController.h rename to App/HC/CNViewController.h diff --git a/HC/CNViewController.m b/App/HC/CNViewController.m similarity index 100% rename from HC/CNViewController.m rename to App/HC/CNViewController.m diff --git a/HC/ChartViewController.h b/App/HC/ChartViewController.h similarity index 100% rename from HC/ChartViewController.h rename to App/HC/ChartViewController.h diff --git a/App/HC/ChartViewController.m b/App/HC/ChartViewController.m new file mode 100644 index 0000000..a881cc1 --- /dev/null +++ b/App/HC/ChartViewController.m @@ -0,0 +1,977 @@ +// +// ChartViewController.m +// HC +// +// Created by huilinLi on 2025/11/27. +// + +#import "ChartViewController.h" +#import "StockKLineModel.h" +#import "StockInfoCardView.h" + +static CGFloat kLineUnitWidth = 5.0; // 单位宽度 +static CGFloat kPriceLabelAreaWidth = 35.0; +static CGFloat kPriceLabelPadding = 10.0; +static CGFloat kKLineHeight = 300.0; +static CGFloat kContainerHeight = 120.0; + +@interface ChartViewController () + +@property (nonatomic, strong) StockInfoCardView *cardContainer; +@property (nonatomic, strong) UIView *kSelectContainer; +@property (nonatomic, strong) UIView *kLineContainer; +@property (nonatomic, strong) UIView *macdContainer; +@property (nonatomic, strong) UIView *kdjContainer; +@property (nonatomic, strong) UIView *otherContainer; +@property (nonatomic, strong) UIScrollView *kLineScrollView; +@property (nonatomic, strong) NSArray *kLineData; +@property (nonatomic, assign) NSInteger visibleKLineCount; +@property (nonatomic, strong) NSArray *priceLabels; +@property (nonatomic, strong) UILabel *startDateLabel; +@property (nonatomic, strong) UILabel *endDateLabel; +@property (nonatomic, strong) UILabel *maLegendLabel; // MA5 +@property (nonatomic, strong) UILabel *macdLegendLabel; // DIF DEA +@property (nonatomic, strong) UILabel *kdjLegendLabel; // K D +@property (nonatomic, strong) UILabel *highPriceMarkLabel; +@property (nonatomic, strong) UILabel *lowPriceMarkLabel; +@property (nonatomic, assign) CGFloat currentMaxPrice; +@property (nonatomic, assign) CGFloat currentMinPrice; +@property (nonatomic, assign) CGFloat macdMaxValue; +@property (nonatomic, assign) CGFloat macdMinValue; +@property (nonatomic, assign) CGFloat kdjMaxValue; +@property (nonatomic, assign) CGFloat kdjMinValue; + +// K线图层 +@property (nonatomic, strong) CAShapeLayer *redCandleLayer; +@property (nonatomic, strong) CAShapeLayer *greenCandleLayer; + +// 均线图层 +@property (nonatomic, strong) CAShapeLayer *ma5Layer; +@property (nonatomic, strong) CAShapeLayer *ma10Layer; +@property (nonatomic, strong) CAShapeLayer *ma30Layer; + +// MACD图层 +@property (nonatomic, strong) CAShapeLayer *macdRedBarLayer; +@property (nonatomic, strong) CAShapeLayer *macdGreenBarLayer; +@property (nonatomic, strong) CAShapeLayer *difLayer; +@property (nonatomic, strong) CAShapeLayer *deaLayer; +@property (nonatomic, strong) CAShapeLayer *zeroLineLayer; + +// KDJ图层 +@property (nonatomic, strong) CAShapeLayer *kLayer; +@property (nonatomic, strong) CAShapeLayer *dLayer; +@property (nonatomic, strong) CAShapeLayer *jLayer; + +@property (nonatomic, strong) UIView *crossVerticalLine; +@property (nonatomic, strong) UIView *crossHorizontalLine; +@property (nonatomic, strong) UILabel *crossPriceLabel; +@property (nonatomic, strong) UILabel *crossDateLabel; +@property (nonatomic, assign) BOOL isLongPressing; + +@end + +@implementation ChartViewController + +#pragma mark - viewDidLoad +- (void)viewDidLoad { + [super viewDidLoad]; + self.view.backgroundColor = [UIColor blackColor]; + + self.visibleKLineCount = 40; + + [self generateMockData]; + + [self calculateMA]; + [self calculateMACD]; + [self calculateKDJ]; + + [self setupSubviews]; + [self setupConstraints]; + [self setupDojiViews]; + + CGFloat chartVisibleWidth = self.view.bounds.size.width - kPriceLabelAreaWidth; + if (chartVisibleWidth > 0) { + kLineUnitWidth = chartVisibleWidth / self.visibleKLineCount; + } + + dispatch_async(dispatch_get_main_queue(), ^{ + CGFloat totalChartWidth = kLineUnitWidth * self.kLineData.count; + self.kLineScrollView.contentSize = CGSizeMake(totalChartWidth, self.kLineContainer.bounds.size.height); + + // 滚到最右侧 + if (self.kLineScrollView.contentSize.width > self.kLineScrollView.bounds.size.width) { + CGPoint offset = CGPointMake(self.kLineScrollView.contentSize.width - self.kLineScrollView.bounds.size.width, 0);//(横向偏移,纵向) + [self.kLineScrollView setContentOffset:offset animated:NO];// 禁用动画效果 + } + + [self drawAllCharts]; + }); +} + +#pragma mark - 绘制 + +- (void)drawAllCharts { + if (self.kLineData.count == 0) return; + + // 获取当前ScrollView滚到了哪里 + CGFloat contentOffsetX = self.kLineScrollView.contentOffset.x; + // 可视区域宽度 + CGFloat visibleWidth = self.kLineScrollView.bounds.size.width; + + NSInteger startIndex = floor(contentOffsetX / kLineUnitWidth);// 向下取整 + NSInteger endIndex = ceil((contentOffsetX + visibleWidth) / kLineUnitWidth);// 向上取整 + + // 防止越界 + if (startIndex < 0) startIndex = 0; + if (endIndex >= self.kLineData.count) endIndex = self.kLineData.count - 1; + if (startIndex > endIndex) endIndex = startIndex; + + // 把start,end和偏移量传给所有子视图 + [self drawKLineChartFromIndex:startIndex toIndex:endIndex contentOffset:contentOffsetX]; + [self drawMACDChartFromIndex:startIndex toIndex:endIndex contentOffset:contentOffsetX]; + [self drawKDJChartFromIndex:startIndex toIndex:endIndex contentOffset:contentOffsetX]; + + // 更新指标参数 + if (!self.isLongPressing) { + NSInteger visibleEndIndex = endIndex; + + CGFloat visibleRightX = contentOffsetX + self.kLineScrollView.bounds.size.width; + + NSInteger calculatedIndex = floor(visibleRightX / kLineUnitWidth) - 1; + + if (calculatedIndex < 0) calculatedIndex = 0; + if (calculatedIndex >= self.kLineData.count) calculatedIndex = self.kLineData.count - 1; + + visibleEndIndex = calculatedIndex; + + [self updateLegendsWithIndex:visibleEndIndex]; + } +} + +- (void)scrollViewDidScroll:(UIScrollView *)scrollView { + if (self.isLongPressing) { + self.isLongPressing = NO; + self.crossVerticalLine.hidden = YES; + self.crossHorizontalLine.hidden = YES; + self.crossPriceLabel.hidden = YES; + self.crossDateLabel.hidden = YES; + } + [self drawAllCharts]; +} + +#pragma mark - 绘制K线+均线 + +- (void)drawKLineChartFromIndex:(NSInteger)startIndex toIndex:(NSInteger)endIndex contentOffset:(CGFloat)contentOffsetX { + // 图层大小=容器大小 + CGRect bounds = self.kLineContainer.bounds; + self.redCandleLayer.frame = bounds; + self.greenCandleLayer.frame = bounds; + self.ma5Layer.frame = bounds; + self.ma10Layer.frame = bounds; + self.ma30Layer.frame = bounds; + + CGFloat chartHeight = bounds.size.height; + + // 最高最低价 + CGFloat maxPrice = 0, minPrice = 0; + NSInteger maxIndex = -1, minIndex = -1; + [self calculateMinMaxPriceForStartIndex:startIndex endIndex:endIndex maxPrice:&maxPrice minPrice:&minPrice maxIndex:&maxIndex minIndex:&minIndex];//将计算出的最高价赋值给max/minPrice + + self.currentMaxPrice = maxPrice; + self.currentMinPrice = minPrice; + + CGFloat priceRange = maxPrice - minPrice; + if (priceRange <= 0) { + self.redCandleLayer.path = nil; + return; + } + + // 更新价格和日期 + [self updatePriceLabelsWithMaxPrice:maxPrice minPrice:minPrice]; + [self updateDateLabelsStartIndex:startIndex endIndex:endIndex]; + + // 准备路径 + UIBezierPath *redPath = [UIBezierPath bezierPath];// 涨的路径 + UIBezierPath *greenPath = [UIBezierPath bezierPath];// 跌的路径 + UIBezierPath *ma5Path = [UIBezierPath bezierPath];// 均线路径 + UIBezierPath *ma10Path = [UIBezierPath bezierPath]; + UIBezierPath *ma30Path = [UIBezierPath bezierPath]; + + CGFloat kLineWidth = kLineUnitWidth * 0.8;// k线实体宽度,0.2是间隔 + BOOL f5 = YES, f10 = YES, f30 = YES; + // 路径是否是第一个点(第一个点用moveToPoint,后面用addLineToPoint) + + for (NSInteger i = startIndex; i <= endIndex; i++) { + StockKLineModel *model = self.kLineData[i]; + + // 坐标转换 + CGFloat xCenter = [self getScreenCenterXAtIndex:i contentOffset:contentOffsetX]; + CGFloat xLeft = xCenter - kLineWidth / 2.0; + + // 高度 * (最高价 - 当前价)/ 价格区间 + CGFloat yOpen = chartHeight * (maxPrice - model.open) / priceRange; + CGFloat yClose = chartHeight * (maxPrice - model.close) / priceRange; + CGFloat yHigh = chartHeight * (maxPrice - model.high) / priceRange; + CGFloat yLow = chartHeight * (maxPrice - model.low) / priceRange; + + UIBezierPath *targetPath = (model.close >= model.open) ? redPath : greenPath; + + [targetPath moveToPoint:CGPointMake(xCenter, yHigh)]; + [targetPath addLineToPoint:CGPointMake(xCenter, yLow)];// 影线 + // 实体 + [targetPath appendPath:[UIBezierPath bezierPathWithRect: + CGRectMake(xLeft,// 左边界 + MIN(yOpen, yClose),// 上边界 + kLineWidth,// 宽 + MAX(1.0, fabs(yClose - yOpen)))]];// 高 + + // 绘制均线 + void (^drawMA)(UIBezierPath*, CGFloat, BOOL*) = ^(UIBezierPath *p, CGFloat v, BOOL *f) { + if (v > 0) { + CGFloat y = chartHeight * (maxPrice - v) / priceRange;// y轴 + if (*f) {// 是第一个点 + [p moveToPoint:CGPointMake(xCenter, y)];// 移动到起点 + *f = NO; }// 起点已设置 + else { [p addLineToPoint:CGPointMake(xCenter, y)]; }// 连线,从上一个点链接这个点 + } + }; + drawMA(ma5Path, model.MA5, &f5); + drawMA(ma10Path, model.MA10, &f10); + drawMA(ma30Path, model.MA30, &f30); + } + + [CATransaction begin];// 开启Core Animation事务 + [CATransaction setDisableActions:YES];// 禁止动画 + self.redCandleLayer.path = redPath.CGPath;// 图层绑定 + self.greenCandleLayer.path = greenPath.CGPath; + self.ma5Layer.path = ma5Path.CGPath; + self.ma10Layer.path = ma10Path.CGPath; + self.ma30Layer.path = ma30Path.CGPath; + [CATransaction commit];// 事务提交 + + // 更新最高最低价的箭头位置 + [self updateMaxMinArrowsWithMaxIndex:maxIndex minIndex:minIndex maxPrice:maxPrice minPrice:minPrice chartHeight:chartHeight range:priceRange contentOffsetX:contentOffsetX]; +} + +#pragma mark - 绘制MACD +- (void)drawMACDChartFromIndex:(NSInteger)startIndex toIndex:(NSInteger)endIndex contentOffset:(CGFloat)contentOffsetX { + CGRect bounds = self.macdContainer.bounds; + self.macdRedBarLayer.frame = bounds; + self.macdGreenBarLayer.frame = bounds; + self.difLayer.frame = bounds; + self.deaLayer.frame = bounds; + self.zeroLineLayer.frame = bounds; + + CGFloat h = bounds.size.height; + + // 计算极值 + CGFloat maxV = -MAXFLOAT, minV = MAXFLOAT;// 先给正负无穷 + for (NSInteger i = startIndex; i <= endIndex; i++) { + StockKLineModel *m = self.kLineData[i]; + maxV = MAX(maxV, MAX(m.macdBar, MAX(m.dif, m.dea))); + minV = MIN(minV, MIN(m.macdBar, MIN(m.dif, m.dea))); + } + if (maxV == minV) { maxV += 1; minV -= 1; } + self.macdMaxValue = maxV; + self.macdMinValue = minV; + CGFloat range = maxV - minV; + CGFloat zeroY = h * (maxV - 0) / range; + + UIBezierPath *rPath = [UIBezierPath bezierPath]; + UIBezierPath *gPath = [UIBezierPath bezierPath]; + UIBezierPath *dPath = [UIBezierPath bezierPath]; + UIBezierPath *ePath = [UIBezierPath bezierPath]; + UIBezierPath *zPath = [UIBezierPath bezierPath]; + [zPath moveToPoint:CGPointMake(0, zeroY)];// 0轴起点 + [zPath addLineToPoint:CGPointMake(bounds.size.width, zeroY)];// 0轴终点 + + CGFloat barWidth = kLineUnitWidth * 0.2; + BOOL first = YES;// 快线慢线起点标记 + + for (NSInteger i = startIndex; i <= endIndex; i++) { + StockKLineModel *m = self.kLineData[i]; + + CGFloat xCenter = [self getScreenCenterXAtIndex:i contentOffset:contentOffsetX]; + CGFloat xLeft = xCenter - barWidth/2.0; + + CGFloat yBar = h * (maxV - m.macdBar) / range; + CGFloat barY = (m.macdBar > 0) ? yBar : zeroY;// 上边界 + + CGFloat barH = MAX(0.5, fabs(zeroY - yBar));// 高度,大于0.5,省得看不见 + + UIBezierPath *tp = (m.macdBar > 0) ? rPath : gPath; + [tp appendPath:[UIBezierPath bezierPathWithRect: + CGRectMake(xLeft, + barY, + barWidth, + barH)]]; + + CGFloat yD = h * (maxV - m.dif) / range; + CGFloat yE = h * (maxV - m.dea) / range; + + if (first) { + [dPath moveToPoint:CGPointMake(xCenter, yD)]; + [ePath moveToPoint:CGPointMake(xCenter, yE)]; + first = NO; + } else { + [dPath addLineToPoint:CGPointMake(xCenter, yD)]; + [ePath addLineToPoint:CGPointMake(xCenter, yE)]; + } + } + + [CATransaction begin]; + [CATransaction setDisableActions:YES]; + self.macdRedBarLayer.path = rPath.CGPath; + self.macdGreenBarLayer.path = gPath.CGPath; + self.difLayer.path = dPath.CGPath; + self.deaLayer.path = ePath.CGPath; + self.zeroLineLayer.path = zPath.CGPath; + [CATransaction commit]; +} + +#pragma mark - 绘制KDJ +- (void)drawKDJChartFromIndex:(NSInteger)startIndex toIndex:(NSInteger)endIndex contentOffset:(CGFloat)contentOffsetX { + self.kLayer.frame = self.kdjContainer.bounds; + self.dLayer.frame = self.kdjContainer.bounds; + self.jLayer.frame = self.kdjContainer.bounds; + + CGFloat h = self.kdjContainer.bounds.size.height; + + CGFloat maxV = 0, minV = 100; + for (NSInteger i = startIndex; i <= endIndex; i++) { + StockKLineModel *m = self.kLineData[i]; + maxV = MAX(maxV, MAX(m.K, MAX(m.D, m.J))); + minV = MIN(minV, MIN(m.K, MIN(m.D, m.J))); + } + self.kdjMaxValue = maxV; + self.kdjMinValue = minV; + CGFloat range = maxV - minV; + if (range <= 0) range = 1; + + UIBezierPath *kp = [UIBezierPath bezierPath]; + UIBezierPath *dp = [UIBezierPath bezierPath]; + UIBezierPath *jp = [UIBezierPath bezierPath]; + BOOL first = YES; + + for (NSInteger i = startIndex; i <= endIndex; i++) { + StockKLineModel *m = self.kLineData[i]; + CGFloat xCenter = [self getScreenCenterXAtIndex:i contentOffset:contentOffsetX]; + + CGFloat yK = h * (maxV - m.K) / range; + CGFloat yD = h * (maxV - m.D) / range; + CGFloat yJ = h * (maxV - m.J) / range; + + if (first) { + [kp moveToPoint:CGPointMake(xCenter, yK)]; + [dp moveToPoint:CGPointMake(xCenter, yD)]; + [jp moveToPoint:CGPointMake(xCenter, yJ)]; + first = NO; + } else { + [kp addLineToPoint:CGPointMake(xCenter, yK)]; + [dp addLineToPoint:CGPointMake(xCenter, yD)]; + [jp addLineToPoint:CGPointMake(xCenter, yJ)]; + } + } + + [CATransaction begin]; + [CATransaction setDisableActions:YES]; + self.kLayer.path = kp.CGPath; + self.dLayer.path = dp.CGPath; + self.jLayer.path = jp.CGPath; + [CATransaction commit]; +} + +#pragma mark - 坐标计算 +// 获取某根K线在屏幕上的x轴中心坐标 +- (CGFloat)getScreenCenterXAtIndex:(NSInteger)index contentOffset:(CGFloat)offsetX { + // 半个单位宽+索引*宽 + CGFloat x = kLineUnitWidth * (index + 0.5); + // 屏幕坐标 = 绝对坐标 - 滚动偏移量 + 左侧空白区 + return x - offsetX + kPriceLabelAreaWidth; +} + +#pragma mark - 极值箭头更新 +- (void)updateMaxMinArrowsWithMaxIndex:(NSInteger)maxIdx minIndex:(NSInteger)minIdx maxPrice:(CGFloat)maxPrice minPrice:(CGFloat)minPrice chartHeight:(CGFloat)height range:(CGFloat)range contentOffsetX:(CGFloat)offsetX { + + void (^updateLabel)(UILabel *, NSInteger, CGFloat) = ^(UILabel *label, NSInteger index, CGFloat price) { + if (index >= 0 && index < self.kLineData.count) { + label.hidden = NO; + CGFloat xCenter = [self getScreenCenterXAtIndex:index contentOffset:offsetX]; + CGFloat y = height * (maxPrice - price) / range;// y轴位置 + + // 默认放在k线右边 + label.text = [NSString stringWithFormat:@"← %.2f", price]; + [label sizeToFit];// 根据文字尺寸自适应标签长度 + CGFloat targetX = xCenter + kLineUnitWidth/2.0 + 2 + label.bounds.size.width/2.0; + label.center = CGPointMake(targetX, y); + + // 如果label不在屏幕内,就放到k线左边 + if (CGRectGetMaxX(label.frame) > self.kLineContainer.bounds.size.width) { + label.text = [NSString stringWithFormat:@"%.2f →", price]; + [label sizeToFit]; + targetX = xCenter - kLineUnitWidth/2.0 - 2 - label.bounds.size.width/2.0; + label.center = CGPointMake(targetX, y); + } + } else { + label.hidden = YES; + } + }; + + StockKLineModel *maxModel = self.kLineData[maxIdx]; + updateLabel(self.highPriceMarkLabel, maxIdx, maxModel.high); + + StockKLineModel *minModel = self.kLineData[minIdx]; + updateLabel(self.lowPriceMarkLabel, minIdx, minModel.low); +} + +#pragma mark - 更新指标数值 +- (void)updateLegendsWithIndex:(NSInteger)index { + if (index < 0 || index >= self.kLineData.count) return; + + StockKLineModel *m = self.kLineData[index]; + + NSMutableAttributedString * (^createStr)(NSString *, UIColor *) = ^(NSString *txt, UIColor *col) { + return [[NSMutableAttributedString alloc] initWithString:txt attributes:@{NSForegroundColorAttributeName: col}]; + }; + + // MA + NSMutableAttributedString *maStr = [[NSMutableAttributedString alloc] init]; + [maStr appendAttributedString:createStr([NSString stringWithFormat:@"MA5:%.2f ", m.MA5], [UIColor yellowColor])]; + [maStr appendAttributedString:createStr([NSString stringWithFormat:@"MA10:%.2f ", m.MA10], [UIColor magentaColor])]; + [maStr appendAttributedString:createStr([NSString stringWithFormat:@"MA30:%.2f", m.MA30], [UIColor cyanColor])]; + self.maLegendLabel.attributedText = maStr; + + // MACD + NSMutableAttributedString *macdStr = [[NSMutableAttributedString alloc] init]; + [macdStr appendAttributedString:createStr([NSString stringWithFormat:@"DIF:%.2f ", m.dif], [UIColor whiteColor])]; + [macdStr appendAttributedString:createStr([NSString stringWithFormat:@"DEA:%.2f ", m.dea], [UIColor yellowColor])]; + UIColor *barColor = (m.macdBar > 0) ? [UIColor redColor] : [UIColor greenColor]; + [macdStr appendAttributedString:createStr([NSString stringWithFormat:@"MACD:%.2f", m.macdBar], barColor)]; + self.macdLegendLabel.attributedText = macdStr; + + // KDJ + NSMutableAttributedString *kdjStr = [[NSMutableAttributedString alloc] init]; + [kdjStr appendAttributedString:createStr([NSString stringWithFormat:@"K:%.2f ", m.K], [UIColor whiteColor])]; + [kdjStr appendAttributedString:createStr([NSString stringWithFormat:@"D:%.2f ", m.D], [UIColor yellowColor])]; + [kdjStr appendAttributedString:createStr([NSString stringWithFormat:@"J:%.2f", m.J], [UIColor magentaColor])]; + self.kdjLegendLabel.attributedText = kdjStr; +} + +#pragma mark - 手势与缩放 +- (void)handlePinchGesture:(UIPinchGestureRecognizer *)gesture { + if (self.isLongPressing) {// 缩放不显示十字星 + self.isLongPressing = NO; + self.crossVerticalLine.hidden = YES; + self.crossHorizontalLine.hidden = YES; + self.crossPriceLabel.hidden = YES; + self.crossDateLabel.hidden = YES; + } + + if (gesture.state == UIGestureRecognizerStateChanged) { + CGFloat scale = gesture.scale; + CGFloat minUnitWidth = (self.view.bounds.size.width - kPriceLabelAreaWidth) / 500.0; + CGFloat maxUnitWidth = 40.0; + + CGFloat newUnitWidth = MAX(minUnitWidth, MIN(kLineUnitWidth * scale, maxUnitWidth)); + + // 屏幕中心点缩放 + CGFloat ratio = (self.kLineScrollView.contentOffset.x + self.kLineScrollView.bounds.size.width/2.0) / self.kLineScrollView.contentSize.width; + kLineUnitWidth = newUnitWidth;// 全局更新 + + // 新的滚动视图的内容宽度 + CGFloat newContentWidth = kLineUnitWidth * self.kLineData.count; + self.kLineScrollView.contentSize = CGSizeMake(newContentWidth, self.kLineContainer.bounds.size.height); + + // 新的偏移量 + CGFloat newOffset = ratio * newContentWidth - self.kLineScrollView.bounds.size.width/2.0; + self.kLineScrollView.contentOffset = CGPointMake(MAX(0, newOffset), 0); + + [self drawAllCharts]; + gesture.scale = 1.0; + } +} + +#pragma mark - 数据生成 +- (void)generateMockData { + NSMutableArray *arr = [NSMutableArray array]; + CGFloat lastClose = 100.0; + for (int i = 0; i < 2000; i++) { + StockKLineModel *model = [[StockKLineModel alloc] init]; + NSDate *date = [NSDate dateWithTimeIntervalSinceNow:-(2000 - i) * 24 * 3600]; + NSDateFormatter *fmt = [[NSDateFormatter alloc] init]; + [fmt setDateFormat:@"yyyy-MM-dd"]; + model.date = [fmt stringFromDate:date]; + CGFloat volatility = lastClose * 0.02; + CGFloat randomChange = ((arc4random() % 100) / 100.0 - 0.5) * 2 * volatility; + model.open = lastClose + ((arc4random() % 100) / 100.0 - 0.5) * volatility * 0.5; + model.close = model.open + randomChange; + CGFloat maxOC = MAX(model.open, model.close); + CGFloat minOC = MIN(model.open, model.close); + model.high = maxOC + (arc4random() % 100) / 100.0 * 1.0; + model.low = minOC - (arc4random() % 100) / 100.0 * 1.0; + if (model.low < 0) model.low = 0.01; + [arr addObject:model]; + lastClose = model.close; + } + self.kLineData = arr; +} + +- (void)calculateMA { + for (int i = 0; i < self.kLineData.count; i++) { + StockKLineModel *model = self.kLineData[i]; + model.MA5 = [self getMAWithIndex:i count:5]; + model.MA10 = [self getMAWithIndex:i count:10]; + model.MA30 = [self getMAWithIndex:i count:30]; + } +} +- (CGFloat)getMAWithIndex:(NSInteger)index count:(NSInteger)count { + if (index < count - 1) return 0; + CGFloat sum = 0; + for (NSInteger i = index; i > index - count; i--) { + StockKLineModel *m = self.kLineData[i]; + sum += m.close; + } + return sum / count; +} +- (void)calculateMACD { + if (self.kLineData.count == 0) return; + const CGFloat kShortEMA = 2.0 / (12 + 1); + const CGFloat kLongEMA = 2.0 / (26 + 1); + const CGFloat kSignalEMA = 2.0 / (9 + 1); + CGFloat lastShortEMA = 0, lastLongEMA = 0, lastDEA = 0; + for (int i = 0; i < self.kLineData.count; i++) { + StockKLineModel *model = self.kLineData[i]; + CGFloat close = model.close; + if (i == 0) { + lastShortEMA = close; lastLongEMA = close; + model.dif = 0; model.dea = 0; model.macdBar = 0; + } else { + lastShortEMA = kShortEMA * close + (1 - kShortEMA) * lastShortEMA; + lastLongEMA = kLongEMA * close + (1 - kLongEMA) * lastLongEMA; + model.dif = lastShortEMA - lastLongEMA; + model.dea = kSignalEMA * model.dif + (1 - kSignalEMA) * lastDEA; + model.macdBar = 2.0 * (model.dif - model.dea); + } + lastDEA = model.dea; + } +} +- (void)calculateKDJ { + CGFloat k = 50.0, d = 50.0; + for (int i = 0; i < self.kLineData.count; i++) { + StockKLineModel *model = self.kLineData[i]; + NSInteger startIndex = MAX(0, i - 8); + CGFloat maxHigh = -MAXFLOAT; + CGFloat minLow = MAXFLOAT; + for (NSInteger j = startIndex; j <= i; j++) { + StockKLineModel *m = self.kLineData[j]; + maxHigh = MAX(maxHigh, m.high); + minLow = MIN(minLow, m.low); + } + CGFloat rsv = 0; + if (maxHigh != minLow) rsv = (model.close - minLow) / (maxHigh - minLow) * 100.0; + k = (2.0 * k + rsv) / 3.0; + d = (2.0 * d + k) / 3.0; + model.K = k; model.D = d; model.J = 3.0 * k - 2.0 * d; + } +} + +#pragma mark 计算极值 +- (void)calculateMinMaxPriceForStartIndex:(NSInteger)startIndex endIndex:(NSInteger)endIndex maxPrice:(CGFloat *)maxPrice minPrice:(CGFloat *)minPrice maxIndex:(NSInteger *)maxIdx minIndex:(NSInteger *)minIdx { + *maxPrice = -MAXFLOAT; *minPrice = MAXFLOAT; + *maxIdx = -1; *minIdx = -1; + if (self.kLineData.count == 0) return; + for (NSInteger i = startIndex; i <= endIndex; i++) { + StockKLineModel *m = self.kLineData[i]; + if (m.high > *maxPrice) { *maxPrice = m.high; *maxIdx = i; } + if (m.low < *minPrice) { *minPrice = m.low; *minIdx = i; } + if (m.MA5 > 0) { *maxPrice = MAX(*maxPrice, m.MA5); *minPrice = MIN(*minPrice, m.MA5); } + if (m.MA10 > 0) { *maxPrice = MAX(*maxPrice, m.MA10); *minPrice = MIN(*minPrice, m.MA10); } + if (m.MA30 > 0) { *maxPrice = MAX(*maxPrice, m.MA30); *minPrice = MIN(*minPrice, m.MA30); } + } + if (*maxPrice > *minPrice) { + CGFloat d = *maxPrice - *minPrice; + *maxPrice += d * 0.05; *minPrice -= d * 0.05; + } +} + +#pragma mark - setupSubviews +-(void) setupSubviews { + UIColor *bgColor = [UIColor colorWithRed:26.0/255.0 green:26.0/255.0 blue:26.0/255.0 alpha:1.0]; + + _cardContainer = [[StockInfoCardView alloc] init]; + _cardContainer.translatesAutoresizingMaskIntoConstraints = NO; + [_cardContainer setupView]; + [self.view addSubview:_cardContainer]; + + _kSelectContainer = [[UIView alloc] init]; + _kSelectContainer.backgroundColor = bgColor; + _kSelectContainer.translatesAutoresizingMaskIntoConstraints = NO; + [self.view addSubview:_kSelectContainer]; + [self addKSelectOptions]; + + self.kLineContainer = [self createContainerViewWithColor:bgColor]; + self.macdContainer = [self createContainerViewWithColor:bgColor]; + self.kdjContainer = [self createContainerViewWithColor:bgColor]; + self.otherContainer = [self createContainerViewWithColor:bgColor]; + + self.kLineScrollView = [[UIScrollView alloc] init]; + self.kLineScrollView.backgroundColor = [UIColor clearColor]; + self.kLineScrollView.showsHorizontalScrollIndicator = NO; + self.kLineScrollView.translatesAutoresizingMaskIntoConstraints = NO; + self.kLineScrollView.delegate = self; + [self.kLineContainer addSubview:self.kLineScrollView]; + + [NSLayoutConstraint activateConstraints:@[ + [self.kLineScrollView.topAnchor constraintEqualToAnchor:self.kLineContainer.topAnchor], + [self.kLineScrollView.bottomAnchor constraintEqualToAnchor:self.kLineContainer.bottomAnchor], + [self.kLineScrollView.leadingAnchor constraintEqualToAnchor:self.kLineContainer.leadingAnchor constant:kPriceLabelAreaWidth], + [self.kLineScrollView.trailingAnchor constraintEqualToAnchor:self.kLineContainer.trailingAnchor], + ]]; + + UIPinchGestureRecognizer *pinchGesture = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(handlePinchGesture:)]; + [self.kLineScrollView addGestureRecognizer:pinchGesture]; + + [self setupAllLayers]; + [self setupLabels]; + + self.maLegendLabel = [self createLegendLabel]; + [self.view addSubview:self.maLegendLabel]; + self.macdLegendLabel = [self createLegendLabel]; + [self.view addSubview:self.macdLegendLabel]; + self.kdjLegendLabel = [self createLegendLabel]; + [self.view addSubview:self.kdjLegendLabel]; + + [NSLayoutConstraint activateConstraints:@[ + [self.maLegendLabel.leadingAnchor constraintEqualToAnchor:self.kLineContainer.leadingAnchor constant:kPriceLabelAreaWidth], + [self.maLegendLabel.bottomAnchor constraintEqualToAnchor:self.kLineContainer.topAnchor], + [self.macdLegendLabel.leadingAnchor constraintEqualToAnchor:self.macdContainer.leadingAnchor constant:kPriceLabelAreaWidth], + [self.macdLegendLabel.bottomAnchor constraintEqualToAnchor:self.macdContainer.topAnchor], + [self.kdjLegendLabel.leadingAnchor constraintEqualToAnchor:self.kdjContainer.leadingAnchor constant:kPriceLabelAreaWidth], + [self.kdjLegendLabel.bottomAnchor constraintEqualToAnchor:self.kdjContainer.topAnchor] + ]]; + + self.highPriceMarkLabel = [self createMarkLabel]; + [self.kLineContainer addSubview:self.highPriceMarkLabel]; + self.lowPriceMarkLabel = [self createMarkLabel]; + [self.kLineContainer addSubview:self.lowPriceMarkLabel]; +} + +- (UIView *)createContainerViewWithColor:(UIColor *)color { + UIView *uiView = [[UIView alloc] init]; + uiView.backgroundColor = color; + uiView.translatesAutoresizingMaskIntoConstraints = NO; + uiView.clipsToBounds = YES; + [self.view addSubview:uiView]; + return uiView; +} + +#pragma mark - setupConstraints +- (void)setupConstraints { + [NSLayoutConstraint activateConstraints:@[ + [_cardContainer.topAnchor constraintEqualToAnchor:self.view.safeAreaLayoutGuide.topAnchor], + [_cardContainer.leadingAnchor constraintEqualToAnchor:self.view.leadingAnchor], + [_cardContainer.widthAnchor constraintEqualToAnchor:self.view.widthAnchor], + [_cardContainer.heightAnchor constraintEqualToConstant:100], + + [_kSelectContainer.topAnchor constraintEqualToAnchor:_cardContainer.bottomAnchor constant:5], + [_kSelectContainer.leadingAnchor constraintEqualToAnchor:self.view.leadingAnchor], + [_kSelectContainer.widthAnchor constraintEqualToAnchor:self.view.widthAnchor], + [_kSelectContainer.heightAnchor constraintEqualToConstant:40], + ]]; + + // 循环设置图表容器约束 + NSArray *containers = @[self.kLineContainer, self.macdContainer, self.kdjContainer, self.otherContainer]; + NSArray *heights = @[@(kKLineHeight), @(kContainerHeight), @(kContainerHeight), @(kContainerHeight)]; + + UIView *previousView = _kSelectContainer; + + for (int i = 0; i < containers.count; i++) { + UIView *container = containers[i]; + // 间距 第一个是15,MACD是30,其他是15 + CGFloat spacing = (i == 1) ? 30.0 : 15.0; + + [NSLayoutConstraint activateConstraints:@[ + [container.topAnchor constraintEqualToAnchor:previousView.bottomAnchor constant:spacing], + [container.leadingAnchor constraintEqualToAnchor:self.view.leadingAnchor], + [container.widthAnchor constraintEqualToAnchor:self.view.widthAnchor], + [container.heightAnchor constraintEqualToConstant:[heights[i] floatValue]] + ]]; + + previousView = container; + } +} + +- (void)setupAllLayers { + // K线 + _redCandleLayer = [self createLayerColor:[UIColor redColor] width:1.0 filled:YES]; + _greenCandleLayer = [self createLayerColor:[UIColor greenColor] width:1.0 filled:YES]; + [self.kLineContainer.layer insertSublayer:_redCandleLayer atIndex:0]; + [self.kLineContainer.layer insertSublayer:_greenCandleLayer atIndex:0]; + + // 均线 + _ma5Layer = [self createLayerColor:[UIColor yellowColor] width:1.0 filled:NO]; + _ma10Layer = [self createLayerColor:[UIColor magentaColor] width:1.0 filled:NO]; + _ma30Layer = [self createLayerColor:[UIColor cyanColor] width:1.0 filled:NO]; + [self.kLineContainer.layer insertSublayer:_ma5Layer below:_redCandleLayer]; + [self.kLineContainer.layer insertSublayer:_ma10Layer below:_ma5Layer]; + [self.kLineContainer.layer insertSublayer:_ma30Layer below:_ma10Layer]; + + // MACD + _macdRedBarLayer = [self createLayerColor:[UIColor redColor] width:0 filled:YES]; + _macdGreenBarLayer = [self createLayerColor:[UIColor greenColor] width:0 filled:YES]; + _difLayer = [self createLayerColor:[UIColor whiteColor] width:1.0 filled:NO]; + _deaLayer = [self createLayerColor:[UIColor yellowColor] width:1.0 filled:NO]; + _zeroLineLayer = [self createLayerColor:[UIColor grayColor] width:0.5 filled:NO]; + [self.macdContainer.layer insertSublayer:_zeroLineLayer atIndex:0]; + [self.macdContainer.layer insertSublayer:_macdRedBarLayer above:_zeroLineLayer]; + [self.macdContainer.layer insertSublayer:_macdGreenBarLayer above:_macdRedBarLayer]; + [self.macdContainer.layer insertSublayer:_difLayer above:_macdGreenBarLayer]; + [self.macdContainer.layer insertSublayer:_deaLayer above:_difLayer]; + + // KDJ + _kLayer = [self createLayerColor:[UIColor whiteColor] width:1.0 filled:NO]; + _dLayer = [self createLayerColor:[UIColor yellowColor] width:1.0 filled:NO]; + _jLayer = [self createLayerColor:[UIColor magentaColor] width:1.0 filled:NO]; + [self.kdjContainer.layer insertSublayer:_kLayer atIndex:0]; + [self.kdjContainer.layer insertSublayer:_dLayer above:_kLayer]; + [self.kdjContainer.layer insertSublayer:_jLayer above:_dLayer]; +} + +- (CAShapeLayer *)createLayerColor:(UIColor *)color width:(CGFloat)width filled:(BOOL)fill { + CAShapeLayer *layer = [CAShapeLayer layer]; + layer.lineWidth = width; + layer.strokeColor = color.CGColor; + layer.fillColor = fill ? color.CGColor : [UIColor clearColor].CGColor; + layer.lineCap = kCALineCapSquare; + layer.lineJoin = kCALineJoinRound;// 圆角连接,避免折线拐角出现尖锐锯齿 + return layer; +} + +- (UILabel *)createLegendLabel { + UILabel *label = [[UILabel alloc] init]; + label.font = [UIFont systemFontOfSize:10]; + label.textColor = [UIColor whiteColor]; + label.backgroundColor = [UIColor clearColor]; + label.translatesAutoresizingMaskIntoConstraints = NO; + return label; +} + +- (UILabel *)createMarkLabel { + UILabel *label = [[UILabel alloc] init]; + label.font = [UIFont systemFontOfSize:10]; + label.textColor = [UIColor whiteColor]; + label.backgroundColor = [UIColor clearColor]; + label.hidden = YES; + return label; +} + +- (void)setupLabels { + NSMutableArray *priceLabelArr = [NSMutableArray array]; + CGFloat chartUsableHeight = kKLineHeight - kPriceLabelPadding; + for (NSInteger i = 0; i < 5; i++) { + UILabel *label = [[UILabel alloc] init]; + label.text = @"--"; + label.textColor = [UIColor lightGrayColor]; + label.font = [UIFont systemFontOfSize:10]; + label.translatesAutoresizingMaskIntoConstraints = NO; + [self.kLineContainer addSubview:label]; + [NSLayoutConstraint activateConstraints:@[ + [label.leadingAnchor constraintEqualToAnchor:self.kLineContainer.leadingAnchor constant:2], + [label.topAnchor constraintEqualToAnchor:self.kLineContainer.topAnchor constant: (chartUsableHeight / 4 * i)] + ]]; + [priceLabelArr addObject:label]; + } + self.priceLabels = priceLabelArr; + + self.startDateLabel = [[UILabel alloc] init]; + self.startDateLabel.textColor = [UIColor lightGrayColor]; + self.startDateLabel.font = [UIFont systemFontOfSize:10]; + self.startDateLabel.translatesAutoresizingMaskIntoConstraints = NO; + [self.view addSubview:self.startDateLabel]; + + self.endDateLabel = [[UILabel alloc] init]; + self.endDateLabel.textColor = [UIColor lightGrayColor]; + self.endDateLabel.font = [UIFont systemFontOfSize:10]; + self.endDateLabel.textAlignment = NSTextAlignmentRight; + self.endDateLabel.translatesAutoresizingMaskIntoConstraints = NO; + [self.view addSubview:self.endDateLabel]; + + [NSLayoutConstraint activateConstraints:@[ + [self.startDateLabel.leadingAnchor constraintEqualToAnchor:self.kLineContainer.leadingAnchor constant:kPriceLabelAreaWidth], + [self.startDateLabel.topAnchor constraintEqualToAnchor:self.kLineContainer.bottomAnchor constant:2], + [self.endDateLabel.trailingAnchor constraintEqualToAnchor:self.kLineContainer.trailingAnchor], + [self.endDateLabel.topAnchor constraintEqualToAnchor:self.kLineContainer.bottomAnchor constant:2], + ]]; +} + +#pragma mark - 左侧价格刻度计算 +- (void)updatePriceLabelsWithMaxPrice:(CGFloat)maxPrice minPrice:(CGFloat)minPrice { + CGFloat range = maxPrice - minPrice; + for (NSInteger i = 0; i < 5; i++) { + self.priceLabels[i].text = [NSString stringWithFormat:@"%.2f", maxPrice - range / 4.0 * i]; + } +} + +# pragma mark - 日期计算 +- (void)updateDateLabelsStartIndex:(NSInteger)startIndex endIndex:(NSInteger)endIndex { + if (self.kLineData.count > 0) { + if (startIndex < self.kLineData.count) self.startDateLabel.text = ((StockKLineModel *)self.kLineData[startIndex]).date; + if (endIndex < self.kLineData.count) self.endDateLabel.text = ((StockKLineModel *)self.kLineData[endIndex]).date; + } +} + +#pragma mark - k线选择 +- (void)addKSelectOptions { + NSArray *titles = @[@"分时",@"日k", @"周k", @"月k", @"更多", @"设置"]; + UIStackView *stackView = [[UIStackView alloc] init]; + stackView.axis = UILayoutConstraintAxisHorizontal; + stackView.distribution = UIStackViewDistributionFillEqually; + stackView.alignment = UIStackViewAlignmentCenter; + stackView.spacing = 5.0; + stackView.translatesAutoresizingMaskIntoConstraints = NO; + for (NSString *title in titles) { + UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem]; + [button setTitle:title forState:UIControlStateNormal]; + button.titleLabel.font = [UIFont systemFontOfSize:14]; + [button setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; + [stackView addArrangedSubview:button]; + } + [_kSelectContainer addSubview:stackView]; + [NSLayoutConstraint activateConstraints:@[ + [stackView.leadingAnchor constraintEqualToAnchor:_kSelectContainer.leadingAnchor constant:10], + [stackView.trailingAnchor constraintEqualToAnchor:_kSelectContainer.trailingAnchor constant:-10], + [stackView.topAnchor constraintEqualToAnchor:_kSelectContainer.topAnchor constant:15], + [stackView.bottomAnchor constraintEqualToAnchor:_kSelectContainer.bottomAnchor constant:-15] + ]]; +} + +#pragma mark - 十字星 +- (void)setupDojiViews { + // 竖线 + self.crossVerticalLine = [[UIView alloc] init]; + self.crossVerticalLine.backgroundColor = [[UIColor whiteColor] colorWithAlphaComponent:0.8]; + self.crossVerticalLine.hidden = YES; + self.crossVerticalLine.userInteractionEnabled = NO; // 不挡手势 + [self.view addSubview:self.crossVerticalLine]; + + // 横线 + self.crossHorizontalLine = [[UIView alloc] init]; + self.crossHorizontalLine.backgroundColor = [[UIColor whiteColor] colorWithAlphaComponent:0.8]; + self.crossHorizontalLine.hidden = YES; + self.crossHorizontalLine.userInteractionEnabled = NO; + [self.view addSubview:self.crossHorizontalLine]; + + // 价格 + self.crossPriceLabel = [[UILabel alloc] init]; + self.crossPriceLabel.backgroundColor = [UIColor systemBlueColor]; + self.crossPriceLabel.textColor = [UIColor whiteColor]; + self.crossPriceLabel.font = [UIFont systemFontOfSize:9]; + self.crossPriceLabel.textAlignment = NSTextAlignmentCenter; + self.crossPriceLabel.clipsToBounds = YES; + self.crossPriceLabel.layer.cornerRadius = 2.0; + self.crossPriceLabel.hidden = YES; + [self.view addSubview:self.crossPriceLabel]; + + // 日期 + self.crossDateLabel = [[UILabel alloc] init]; + self.crossDateLabel.backgroundColor = [UIColor systemBlueColor]; + self.crossDateLabel.textColor = [UIColor whiteColor]; + self.crossDateLabel.font = [UIFont systemFontOfSize:9]; + self.crossDateLabel.textAlignment = NSTextAlignmentCenter;// 居中对齐 + //NSTextAlignmentJustified 两端对齐 + self.crossDateLabel.clipsToBounds = YES; + self.crossDateLabel.layer.cornerRadius = 2.0; + self.crossDateLabel.hidden = YES; + [self.view addSubview:self.crossDateLabel]; + + NSArray *targetViews = @[self.kLineScrollView, self.macdContainer, self.kdjContainer]; + for (UIView *view in targetViews) { + // 必须在循环里创建新的手势对象,因为一个手势只能绑定一个View + UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleLongPress:)]; + longPress.minimumPressDuration = 0.3; // 设置触发时间 + [view addGestureRecognizer:longPress]; + } +} + +- (void)handleLongPress:(UILongPressGestureRecognizer *)gesture { + CGPoint touchPoint = [gesture locationInView:self.kLineScrollView]; + CGPoint touchPointInView = [gesture locationInView:self.view]; + + CGFloat offsetX = self.kLineScrollView.contentOffset.x; + + NSInteger index = floor(touchPoint.x / kLineUnitWidth);// 向下取整 + if (index < 0) index = 0; + if (index >= self.kLineData.count) index = self.kLineData.count - 1; + + if (gesture.state == UIGestureRecognizerStateBegan || gesture.state == UIGestureRecognizerStateChanged) {// 手势开始/移动 + self.isLongPressing = YES; + self.crossVerticalLine.hidden = NO; + self.crossHorizontalLine.hidden = NO; + self.crossPriceLabel.hidden = NO; + self.crossDateLabel.hidden = NO;// 显示十字星 + + // 更新竖线位置 + CGFloat xCenterInScroll = kLineUnitWidth * 0.5 + kLineUnitWidth * index; + //滚动视图x坐标 - 滚动偏移量 + 价格标签宽度 + CGFloat xCenterInView = xCenterInScroll - offsetX + kPriceLabelAreaWidth; + + // 不要越界 + if (xCenterInView < kPriceLabelAreaWidth || xCenterInView > self.view.bounds.size.width) return; + + CGFloat topY = self.kLineContainer.frame.origin.y;// k线容器在主视图的顶部y + CGFloat bottomY = CGRectGetMaxY(self.otherContainer.frame);// 空容器的底部 + self.crossVerticalLine.frame = CGRectMake(xCenterInView, topY, 0.5, bottomY - topY); + + CGFloat displayValue = 0.0; + BOOL isTouchValid = NO; // 用于标记是否摸到了有效的图表区域 + + // 判断手指在哪个容器里 + if (CGRectContainsPoint(self.kLineContainer.frame, touchPointInView)) {// CGRectContainsPoint(矩形区域, 点) 布尔: + isTouchValid = YES; + CGFloat relativeY = touchPointInView.y - self.kLineContainer.frame.origin.y; + CGFloat height = self.kLineContainer.frame.size.height; + displayValue = self.currentMaxPrice - (relativeY / height) * (self.currentMaxPrice - self.currentMinPrice); + + } else if (CGRectContainsPoint(self.macdContainer.frame, touchPointInView)) { + isTouchValid = YES; + CGFloat relativeY = touchPointInView.y - self.macdContainer.frame.origin.y; + CGFloat height = self.macdContainer.frame.size.height; + displayValue = self.macdMaxValue - (relativeY / height) * (self.macdMaxValue - self.macdMinValue); + + } else if (CGRectContainsPoint(self.kdjContainer.frame, touchPointInView)) { + isTouchValid = YES; + CGFloat relativeY = touchPointInView.y - self.kdjContainer.frame.origin.y; + CGFloat height = self.kdjContainer.frame.size.height; + displayValue = self.kdjMaxValue - (relativeY / height) * (self.kdjMaxValue - self.kdjMinValue); + } + + // 只有触摸在图表内才更新横线 + if (isTouchValid) { + self.crossHorizontalLine.frame = CGRectMake(kPriceLabelAreaWidth, touchPointInView.y, self.view.bounds.size.width - kPriceLabelAreaWidth, 0.5); + + self.crossPriceLabel.text = [NSString stringWithFormat:@" %.2f ", displayValue]; + [self.crossPriceLabel sizeToFit]; + self.crossPriceLabel.center = CGPointMake(kPriceLabelAreaWidth / 2.0, touchPointInView.y); + } + + StockKLineModel *model = self.kLineData[index]; + self.crossDateLabel.text = [NSString stringWithFormat:@" %@ ", model.date]; + [self.crossDateLabel sizeToFit]; + CGFloat dateLabelY = CGRectGetMaxY(self.kLineContainer.frame); + self.crossDateLabel.center = CGPointMake(xCenterInView, dateLabelY); + + [self updateLegendsWithIndex:index]; + + } else if (gesture.state == UIGestureRecognizerStateEnded || gesture.state == UIGestureRecognizerStateCancelled) {// 结束/取消 + self.isLongPressing = NO; + self.crossVerticalLine.hidden = YES; + self.crossHorizontalLine.hidden = YES; + self.crossPriceLabel.hidden = YES; + self.crossDateLabel.hidden = YES; + + [self drawAllCharts]; + } +} + + +@end diff --git a/HC/CommonTabBar.h b/App/HC/CommonTabBar.h similarity index 100% rename from HC/CommonTabBar.h rename to App/HC/CommonTabBar.h diff --git a/HC/CommonTabBar.m b/App/HC/CommonTabBar.m similarity index 100% rename from HC/CommonTabBar.m rename to App/HC/CommonTabBar.m diff --git a/HC/CountryModel.h b/App/HC/CountryModel.h similarity index 100% rename from HC/CountryModel.h rename to App/HC/CountryModel.h diff --git a/HC/CountryModel.m b/App/HC/CountryModel.m similarity index 100% rename from HC/CountryModel.m rename to App/HC/CountryModel.m diff --git a/HC/HC.xcdatamodeld/.xccurrentversion b/App/HC/HC.xcdatamodeld/.xccurrentversion similarity index 100% rename from HC/HC.xcdatamodeld/.xccurrentversion rename to App/HC/HC.xcdatamodeld/.xccurrentversion diff --git a/HC/HC.xcdatamodeld/HC.xcdatamodel/contents b/App/HC/HC.xcdatamodeld/HC.xcdatamodel/contents similarity index 100% rename from HC/HC.xcdatamodeld/HC.xcdatamodel/contents rename to App/HC/HC.xcdatamodeld/HC.xcdatamodel/contents diff --git a/HC/HomeViewController.h b/App/HC/HomeViewController.h similarity index 100% rename from HC/HomeViewController.h rename to App/HC/HomeViewController.h diff --git a/HC/HomeViewController.m b/App/HC/HomeViewController.m similarity index 100% rename from HC/HomeViewController.m rename to App/HC/HomeViewController.m diff --git a/HC/Info.plist b/App/HC/Info.plist similarity index 100% rename from HC/Info.plist rename to App/HC/Info.plist diff --git a/HC/MLXYViewController.h b/App/HC/MLXYViewController.h similarity index 100% rename from HC/MLXYViewController.h rename to App/HC/MLXYViewController.h diff --git a/App/HC/MLXYViewController.m b/App/HC/MLXYViewController.m new file mode 100644 index 0000000..e4e5d5d --- /dev/null +++ b/App/HC/MLXYViewController.m @@ -0,0 +1,585 @@ +// +// MLXYViewController.m +// HC +// +// Created by huilinLi on 2025/11/26. +// + +#import "MLXYViewController.h" +#import "ChartViewController.h" + +#pragma mark - cell们 +static NSString *const stockCell = @"StockCell";// 股票cell +static NSString *const permCell = @"PermCell";// 接口cell + +@interface MLXYViewController () + +#pragma mark - Config +@property (nonatomic, strong) UIButtonConfiguration *buttonConfig; +@property (nonatomic, strong) NSArray *sectorDataConfig; +@property (nonatomic, strong) NSMutableArray *permissionDataList; + +#pragma mark - 滚动相关 +@property (nonatomic, strong) UIScrollView *globalScrollView; +@property (nonatomic, strong) UIView *scrollContentView; +@property (nonatomic, strong) UIButton *mlxyButton; + +#pragma mark - 大盘 +@property (nonatomic, strong) UILabel *marketTitleLabel; +@property (nonatomic, strong) UIView *marketView; +@property (nonatomic, strong) UILabel *marketLine1; +@property (nonatomic, strong) UILabel *marketLine2; +@property (nonatomic, strong) UILabel *marketLine3; + +#pragma mark - 板块 +@property (nonatomic, strong) UILabel *sectorTitleLabel; +@property (nonatomic, strong) UIButton *sectorBtn; +@property (nonatomic, strong) UIView *sectorCard1; +@property (nonatomic, strong) UIView *sectorCard2; +@property (nonatomic, strong) UIView *sectorCard3; + +#pragma mark - 股票容器 +@property (nonatomic, strong) UIView *stockContainer; +@property (nonatomic, strong) UIView *stockHeaderView; +@property (nonatomic, strong) UITableView *stockTableView; + +#pragma mark - 接口容器 +@property (nonatomic, strong) UIView *stockContainer1; +@property (nonatomic, strong) UILabel *stockLabel1; +@property (nonatomic, strong) UIView *permissionHeaderView; +@property (nonatomic, strong) UITableView *permissionTableView; + +@end + +@implementation MLXYViewController + +#pragma mark - viewDidLoad +- (void)viewDidLoad { + [super viewDidLoad]; + self.view.backgroundColor = [UIColor blackColor]; + + [self setupData]; + + [self setupGlobalScrollView]; + [self setupSubviews]; + + [self marketViewClick]; + + [self setupConstraints]; + + [self fetchPermissionData]; +} + +#pragma mark - 数据 +- (void)setupData { + _permissionDataList = [NSMutableArray array]; + + _sectorDataConfig = @[ + @{@"name":@"Health", @"value1":@"1099.683", @"value2":@"27.236",@"value3":@"2.270%"}, + @{@"name":@"Others", @"value1":@"2083.783", @"value2":@"0.000",@"value3":@"0.000%"}, + @{@"name":@"HLKLI", @"value1":@"987.895", @"value2":@"-1.854",@"value3":@"-0.230%"} + ]; + + UIButtonConfiguration *config = [UIButtonConfiguration plainButtonConfiguration]; + config.title = @"更多"; + config.attributedTitle = [[NSAttributedString alloc] initWithString:@"更多" attributes:@{ + NSFontAttributeName: [UIFont systemFontOfSize:14], + NSForegroundColorAttributeName: [UIColor lightGrayColor]// 文字颜色 + }]; + config.image = [UIImage systemImageNamed:@"chevron.right"]; + config.imagePlacement = NSDirectionalRectEdgeTrailing; + config.imagePadding = 1; + config.baseForegroundColor = [UIColor lightGrayColor];// 按钮文字和模板都会继承这个颜色 + _buttonConfig = config; +} + +#pragma mark - 发请求 + +- (void)fetchPermissionData { + NSString *urlString = @"https://hwjb.homilychart.com/dev/admin/permission/getPermission"; + NSURL *url = [NSURL URLWithString:urlString]; + NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; + request.HTTPMethod = @"POST"; + + [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; + NSString *token = @"eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiIwMTQ0ZDE4MWQ3NDI0ZjljYjk1OTI0Y2RiZWQzZTlmYSIsInN1YiI6IntcImlkXCI6MTAwMDAxMyxcImFkbWluTmFtZVwiOlwi5p2O5oWn55Cz5ryU56S65py6XCIsXCJhY2NvdW50XCI6XCI5MDA0NzY4MVwiLFwicGFzc3dvcmRcIjpcIiQyYSQxMCRzSXVXMFNSMllEZFIyMGxxZnVRRXBlbDdHU2NTVmRqb1lDaXNrSmpTU0suNE5hbmN5NkUyLlwiLFwibWFjaGluZUlkXCI6XCIyMDAzMDQwMSxGQzM2RDYzOEZGM0FcIixcIm1hY2hpbmVJZHNcIjpudWxsLFwiYWRtaW5TdGF0dXNcIjoxLFwibWFya2V0XCI6bnVsbCxcIm1hcmtldHNcIjpcIuaAu-mDqFwiLFwicm9sZUtleVwiOm51bGwsXCJwb3N0aXRvblwiOlwi56CU5Y-RXCIsXCJyZW1hcmtcIjpcIuWRmOW3pVwiLFwiY3JlYXRlVGltZVwiOlwiMjAyNS0wOC0xMCAxNDozNDowOVwiLFwidXBkYXRlVGltZVwiOlwiMjAyNS0xMS0yMSAxNzo1NDo0MVwiLFwicm9sZUlkXCI6MixcInVzZXJuYW1lXCI6XCI5MDA0NzY4MVwifSIsImlzcyI6InNnIiwiaWF0IjoxNzY0OTE1NzQ5LCJleHAiOjE3NjUwMDIxNDl9.5O__C0lpO3CBHMVPOjiUsLD1Cp733aBZCcDmpkfcXSc"; + [request setValue:token forHTTPHeaderField:@"token"]; + + NSDictionary *params = @{ + @"pageNum": @1, + @"pageSize": @10, + @"permission": @{ @"account": @"", @"market": @"", @"postiton": @"" } + }; + + // 参数转json + NSError *error; + NSData *jsonData = [NSJSONSerialization dataWithJSONObject:params options:0 error:&error]; + if (!error) {request.HTTPBody = jsonData; + }else{ + NSLog(@"参数转json失败:%@",error); + return; + } + + NSURLSessionDataTask *task = [[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { + if (error) { + NSLog(@"请求失败: %@", error); + return; + } + if (data) { + NSError *jsonError; + NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:0 error:&jsonError]; + if (!jsonError && [json[@"code"] integerValue] == 200) { + NSArray *list = json[@"data"][@"list"]; + [self.permissionDataList removeAllObjects]; + [self.permissionDataList addObjectsFromArray:list]; + dispatch_async(dispatch_get_main_queue(), ^{ + [self.permissionTableView reloadData]; + }); + } + } + }]; + [task resume]; +} + +#pragma mark - 子视图们 +- (void)setupGlobalScrollView { + _globalScrollView = [[UIScrollView alloc] init]; + _globalScrollView.backgroundColor = [UIColor blackColor]; + _globalScrollView.showsVerticalScrollIndicator = YES; + _globalScrollView.translatesAutoresizingMaskIntoConstraints = NO; + [self.view addSubview:_globalScrollView]; + + _scrollContentView = [[UIView alloc] init]; + _scrollContentView.backgroundColor = [UIColor blackColor]; + _scrollContentView.translatesAutoresizingMaskIntoConstraints = NO; + [_globalScrollView addSubview:_scrollContentView]; +} + +- (void)setupSubviews { + _mlxyButton = [UIButton buttonWithType:UIButtonTypeSystem]; + [_mlxyButton setTitle:@"马来西亚" forState:UIControlStateNormal]; + [_mlxyButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; + [_mlxyButton setBackgroundColor:[UIColor blueColor]]; + _mlxyButton.layer.cornerRadius = 15; + _mlxyButton.titleLabel.font = [UIFont systemFontOfSize:14]; + _mlxyButton.translatesAutoresizingMaskIntoConstraints = NO; + [_scrollContentView addSubview:_mlxyButton]; + + // 大盘 + [self setupMarketUI]; + // 板块 + [self setupSectorUI]; + // 股票 + [self setupStockListUI]; + // 接口 + [self setupPermissionUI]; +} + +- (void)setupMarketUI { + _marketTitleLabel = [self createTitleLabel:@"大盘指数"]; + [_scrollContentView addSubview:_marketTitleLabel]; + + _marketView = [[UIView alloc] init]; + _marketView.backgroundColor = [UIColor greenColor]; + _marketView.layer.cornerRadius = 8; + _marketView.translatesAutoresizingMaskIntoConstraints = NO; + [_scrollContentView addSubview:_marketView]; + + _marketLine1 = [self createMarketLabel:@"富时马来西亚KLCI" fontSize:12 isBold:YES]; + _marketLine2 = [self createMarketLabel:@"1624.500" fontSize:17 isBold:YES]; + _marketLine3 = [self createMarketLabel:@"12.760 0.792%" fontSize:12 isBold:YES]; + + [_marketView addSubview:_marketLine1]; + [_marketView addSubview:_marketLine2]; + [_marketView addSubview:_marketLine3]; +} + +- (void)setupSectorUI { + _sectorTitleLabel = [self createTitleLabel:@"板块"]; + [_scrollContentView addSubview:_sectorTitleLabel]; + + _sectorBtn = [UIButton buttonWithConfiguration:self.buttonConfig primaryAction:nil]; + _sectorBtn.translatesAutoresizingMaskIntoConstraints = NO; + [_scrollContentView addSubview:_sectorBtn]; + + _sectorCard1 = [self createSectorCardWithData:self.sectorDataConfig[0]]; + _sectorCard2 = [self createSectorCardWithData:self.sectorDataConfig[1]]; + _sectorCard3 = [self createSectorCardWithData:self.sectorDataConfig[2]]; + + [_scrollContentView addSubview:_sectorCard1]; + [_scrollContentView addSubview:_sectorCard2]; + [_scrollContentView addSubview:_sectorCard3]; +} + +- (void)setupStockListUI { + _stockContainer = [[UIView alloc] init]; + _stockContainer.translatesAutoresizingMaskIntoConstraints = NO; + [_scrollContentView addSubview:_stockContainer]; + + UILabel *title = [self createTitleLabel:@"股票"]; + [_stockContainer addSubview:title]; + + UIButton *btn = [UIButton buttonWithConfiguration:self.buttonConfig primaryAction:nil]; + btn.translatesAutoresizingMaskIntoConstraints = NO; + [_stockContainer addSubview:btn]; + + _stockHeaderView = [[UIView alloc] init]; + _stockHeaderView.backgroundColor = [UIColor blackColor]; + _stockHeaderView.translatesAutoresizingMaskIntoConstraints = NO; + [_stockContainer addSubview:_stockHeaderView]; + + [self setupHeaderLabelsForView:_stockHeaderView titles:@[@"名称", @"最新", @"涨幅"] isWhite:NO]; + + _stockTableView = [[UITableView alloc] init]; + _stockTableView.backgroundColor = [UIColor blackColor]; + _stockTableView.separatorStyle = UITableViewCellSeparatorStyleNone; + _stockTableView.delegate = self; + _stockTableView.dataSource = self; + _stockTableView.scrollEnabled = NO; + [_stockTableView registerClass:[UITableViewCell class] forCellReuseIdentifier:stockCell]; + _stockTableView.translatesAutoresizingMaskIntoConstraints = NO; + [_stockContainer addSubview:_stockTableView]; +} + +- (void)setupPermissionUI { + _stockContainer1 = [[UIView alloc] init]; + _stockContainer1.backgroundColor = [UIColor whiteColor]; + _stockContainer1.layer.cornerRadius = 8; + _stockContainer1.translatesAutoresizingMaskIntoConstraints = NO; + [_scrollContentView addSubview:_stockContainer1]; + + _stockLabel1 = [[UILabel alloc] init]; + _stockLabel1.text = @"真数据!"; + _stockLabel1.textColor = [UIColor blackColor]; + _stockLabel1.font = [UIFont systemFontOfSize:16 weight:UIFontWeightBold]; + _stockLabel1.translatesAutoresizingMaskIntoConstraints = NO; + [_stockContainer1 addSubview:_stockLabel1]; + + _permissionHeaderView = [[UIView alloc] init]; + _permissionHeaderView.backgroundColor = [UIColor colorWithWhite:0.95 alpha:1.0]; + _permissionHeaderView.translatesAutoresizingMaskIntoConstraints = NO; + [_stockContainer1 addSubview:_permissionHeaderView]; + + [self setupHeaderLabelsForView:_permissionHeaderView titles:@[@"Name", @"Account", @"Market", @"Position"] isWhite:YES]; + + _permissionTableView = [[UITableView alloc] init]; + _permissionTableView.backgroundColor = [UIColor whiteColor]; + _permissionTableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine; + _permissionTableView.delegate = self; + _permissionTableView.dataSource = self; + _permissionTableView.scrollEnabled = NO; + [_permissionTableView registerClass:[UITableViewCell class] forCellReuseIdentifier:permCell]; + _permissionTableView.translatesAutoresizingMaskIntoConstraints = NO; + [_stockContainer1 addSubview:_permissionTableView]; +} + +#pragma mark - 小工具 +- (UILabel *)createTitleLabel:(NSString *)text { + UILabel *label = [[UILabel alloc] init]; + label.text = text; + label.textColor = [UIColor whiteColor]; + label.font = [UIFont systemFontOfSize:16 weight:UIFontWeightMedium]; + label.translatesAutoresizingMaskIntoConstraints = NO; + return label; +} + +- (UILabel *)createMarketLabel:(NSString *)text fontSize:(CGFloat)size isBold:(BOOL)isBold { + UILabel *label = [[UILabel alloc] init]; + label.text = text; + label.textColor = [UIColor whiteColor]; + label.font = isBold ? [UIFont boldSystemFontOfSize:size] : [UIFont systemFontOfSize:size]; + label.textAlignment = NSTextAlignmentCenter; + label.translatesAutoresizingMaskIntoConstraints = NO; + return label; +} + +- (void)setupHeaderLabelsForView:(UIView *)view titles:(NSArray *)titles isWhite:(BOOL)isWhite { + CGFloat multiplier = 1.0 / titles.count; + for (NSInteger i = 0; i < titles.count; i++) { + UILabel *label = [[UILabel alloc] init]; + label.text = titles[i]; + label.textColor = isWhite ? [UIColor darkGrayColor] : [UIColor lightGrayColor]; + label.font = isWhite ? [UIFont boldSystemFontOfSize:12] : [UIFont systemFontOfSize:12]; + label.translatesAutoresizingMaskIntoConstraints = NO; + [view addSubview:label]; + + if (isWhite) { + // 等分 + label.textAlignment = NSTextAlignmentCenter; + [NSLayoutConstraint activateConstraints:@[ + [label.topAnchor constraintEqualToAnchor:view.topAnchor], + [label.bottomAnchor constraintEqualToAnchor:view.bottomAnchor], + [label.widthAnchor constraintEqualToAnchor:view.widthAnchor multiplier:multiplier], + (i == 0) ? [label.leadingAnchor constraintEqualToAnchor:view.leadingAnchor] : [label.leadingAnchor constraintEqualToAnchor:view.subviews[i-1].trailingAnchor] + ]]; + } else { + // 股票表头 + label.textAlignment = (i == 0) ? NSTextAlignmentLeft : NSTextAlignmentRight; + [label.centerYAnchor constraintEqualToAnchor:view.centerYAnchor].active = YES; + if (i == 0) { + [label.leadingAnchor constraintEqualToAnchor:view.leadingAnchor constant:15].active = YES; + } else if (i == 1) { + [label.widthAnchor constraintEqualToConstant:60].active = YES; + [label.trailingAnchor constraintEqualToAnchor:view.trailingAnchor constant:-110].active = YES; + } else { + [label.widthAnchor constraintEqualToConstant:80].active = YES; + [label.trailingAnchor constraintEqualToAnchor:view.trailingAnchor constant:-30].active = YES; + } + } + } +} + +- (UIView *)createSectorCardWithData:(NSDictionary *)data { + UIView *card = [[UIView alloc] init]; + card.backgroundColor = [UIColor darkGrayColor]; + card.layer.cornerRadius = 8; + card.translatesAutoresizingMaskIntoConstraints = NO; + + UILabel *nameLabel = [self createCardLabel:data[@"name"] color:[UIColor whiteColor] size:14 bold:NO]; + UILabel *val1Label = [self createCardLabel:data[@"value1"] color:[UIColor greenColor] size:16 bold:YES]; + UILabel *val2Label = [self createCardLabel:data[@"value2"] color:[UIColor greenColor] size:12 bold:NO]; + UILabel *val3Label = [self createCardLabel:data[@"value3"] color:[UIColor greenColor] size:12 bold:NO]; + + [card addSubview:nameLabel]; + [card addSubview:val1Label]; + [card addSubview:val2Label]; + [card addSubview:val3Label]; + + [NSLayoutConstraint activateConstraints:@[ + [nameLabel.topAnchor constraintEqualToAnchor:card.topAnchor constant:7], + [nameLabel.leadingAnchor constraintEqualToAnchor:card.leadingAnchor constant:10], + [val1Label.topAnchor constraintEqualToAnchor:nameLabel.bottomAnchor constant:10], + [val1Label.leadingAnchor constraintEqualToAnchor:card.leadingAnchor constant:10], + [val2Label.topAnchor constraintEqualToAnchor:val1Label.bottomAnchor constant:7], + [val2Label.leadingAnchor constraintEqualToAnchor:card.leadingAnchor constant:10], + [val3Label.topAnchor constraintEqualToAnchor:val2Label.bottomAnchor constant:6], + [val3Label.leadingAnchor constraintEqualToAnchor:card.leadingAnchor constant:10] + ]]; + return card; +} + +- (UILabel *)createCardLabel:(NSString *)text color:(UIColor *)color size:(CGFloat)size bold:(BOOL)bold { + UILabel *label = [[UILabel alloc] init]; + label.text = text; + label.textColor = color; + label.font = bold ? [UIFont boldSystemFontOfSize:size] : [UIFont systemFontOfSize:size]; + label.translatesAutoresizingMaskIntoConstraints = NO; + return label; +} + +#pragma mark - 约束们 + +- (void)setupConstraints { + [NSLayoutConstraint activateConstraints:@[ + [_globalScrollView.leadingAnchor constraintEqualToAnchor:self.view.leadingAnchor], + [_globalScrollView.trailingAnchor constraintEqualToAnchor:self.view.trailingAnchor], + [_globalScrollView.topAnchor constraintEqualToAnchor:self.view.safeAreaLayoutGuide.topAnchor], + [_globalScrollView.bottomAnchor constraintEqualToAnchor:self.view.safeAreaLayoutGuide.bottomAnchor], + + [_scrollContentView.leadingAnchor constraintEqualToAnchor:_globalScrollView.leadingAnchor], + [_scrollContentView.trailingAnchor constraintEqualToAnchor:_globalScrollView.trailingAnchor], + [_scrollContentView.topAnchor constraintEqualToAnchor:_globalScrollView.topAnchor], + [_scrollContentView.bottomAnchor constraintEqualToAnchor:_globalScrollView.bottomAnchor], + [_scrollContentView.widthAnchor constraintEqualToAnchor:self.view.widthAnchor] + ]]; + + [NSLayoutConstraint activateConstraints:@[ + [_mlxyButton.topAnchor constraintEqualToAnchor:_scrollContentView.topAnchor constant:15], + [_mlxyButton.leadingAnchor constraintEqualToAnchor:_scrollContentView.leadingAnchor constant:15], + [_mlxyButton.widthAnchor constraintEqualToConstant:90], + [_mlxyButton.heightAnchor constraintEqualToConstant:30] + ]]; + + [NSLayoutConstraint activateConstraints:@[ + [_marketTitleLabel.topAnchor constraintEqualToAnchor:_mlxyButton.bottomAnchor constant:10], + [_marketTitleLabel.leadingAnchor constraintEqualToAnchor:_scrollContentView.leadingAnchor constant:15], + + [_marketView.topAnchor constraintEqualToAnchor:_marketTitleLabel.bottomAnchor constant:10], + [_marketView.leadingAnchor constraintEqualToAnchor:_scrollContentView.leadingAnchor constant:15], + [_marketView.widthAnchor constraintEqualToAnchor:_scrollContentView.widthAnchor multiplier:0.3], + [_marketView.heightAnchor constraintEqualToConstant:100], + + [_marketLine1.topAnchor constraintEqualToAnchor:_marketView.topAnchor constant:10], + [_marketLine1.centerXAnchor constraintEqualToAnchor:_marketView.centerXAnchor], + [_marketLine2.topAnchor constraintEqualToAnchor:_marketLine1.bottomAnchor constant:15], + [_marketLine2.centerXAnchor constraintEqualToAnchor:_marketView.centerXAnchor], + [_marketLine3.topAnchor constraintEqualToAnchor:_marketLine2.bottomAnchor constant:12], + [_marketLine3.centerXAnchor constraintEqualToAnchor:_marketView.centerXAnchor] + ]]; + + [NSLayoutConstraint activateConstraints:@[ + [_sectorTitleLabel.topAnchor constraintEqualToAnchor:_marketView.bottomAnchor constant:20], + [_sectorTitleLabel.leadingAnchor constraintEqualToAnchor:_scrollContentView.leadingAnchor constant:15], + + [_sectorBtn.centerYAnchor constraintEqualToAnchor:_sectorTitleLabel.centerYAnchor], + [_sectorBtn.trailingAnchor constraintEqualToAnchor:_scrollContentView.trailingAnchor constant:-15], + + [_sectorCard1.topAnchor constraintEqualToAnchor:_sectorTitleLabel.bottomAnchor constant:10], + [_sectorCard1.leadingAnchor constraintEqualToAnchor:_scrollContentView.leadingAnchor constant:8], + [_sectorCard1.widthAnchor constraintEqualToAnchor:_scrollContentView.widthAnchor multiplier:0.3], + [_sectorCard1.heightAnchor constraintEqualToConstant:100], + + [_sectorCard2.topAnchor constraintEqualToAnchor:_sectorCard1.topAnchor], + [_sectorCard2.leadingAnchor constraintEqualToAnchor:_sectorCard1.trailingAnchor constant:8], + [_sectorCard2.widthAnchor constraintEqualToAnchor:_sectorCard1.widthAnchor], + [_sectorCard2.heightAnchor constraintEqualToAnchor:_sectorCard1.heightAnchor], + + [_sectorCard3.topAnchor constraintEqualToAnchor:_sectorCard1.topAnchor], + [_sectorCard3.leadingAnchor constraintEqualToAnchor:_sectorCard2.trailingAnchor constant:8], + [_sectorCard3.trailingAnchor constraintEqualToAnchor:_scrollContentView.trailingAnchor constant:-16], + [_sectorCard3.heightAnchor constraintEqualToAnchor:_sectorCard1.heightAnchor] + ]]; + + UILabel *stockTitle = _stockContainer.subviews[0]; + UIButton *stockBtn = _stockContainer.subviews[1]; + + [NSLayoutConstraint activateConstraints:@[ + [_stockContainer.topAnchor constraintEqualToAnchor:_sectorCard1.bottomAnchor constant:20], + [_stockContainer.leadingAnchor constraintEqualToAnchor:_scrollContentView.leadingAnchor], + [_stockContainer.trailingAnchor constraintEqualToAnchor:_scrollContentView.trailingAnchor], + [_stockContainer.bottomAnchor constraintEqualToAnchor:_stockTableView.bottomAnchor constant:10], + + [stockTitle.topAnchor constraintEqualToAnchor:_stockContainer.topAnchor constant:15], + [stockTitle.leadingAnchor constraintEqualToAnchor:_stockContainer.leadingAnchor constant:15], + [stockBtn.centerYAnchor constraintEqualToAnchor:stockTitle.centerYAnchor], + [stockBtn.trailingAnchor constraintEqualToAnchor:_stockContainer.trailingAnchor constant:-15], + + [_stockHeaderView.topAnchor constraintEqualToAnchor:stockTitle.bottomAnchor constant:10], + [_stockHeaderView.leadingAnchor constraintEqualToAnchor:_stockContainer.leadingAnchor], + [_stockHeaderView.trailingAnchor constraintEqualToAnchor:_stockContainer.trailingAnchor], + [_stockHeaderView.heightAnchor constraintEqualToConstant:30], + + [_stockTableView.topAnchor constraintEqualToAnchor:_stockHeaderView.bottomAnchor], + [_stockTableView.leadingAnchor constraintEqualToAnchor:_stockContainer.leadingAnchor], + [_stockTableView.trailingAnchor constraintEqualToAnchor:_stockContainer.trailingAnchor], + [_stockTableView.heightAnchor constraintEqualToConstant:240] + ]]; + + [NSLayoutConstraint activateConstraints:@[ + [_stockContainer1.topAnchor constraintEqualToAnchor:_stockContainer.bottomAnchor constant:20], + [_stockContainer1.leadingAnchor constraintEqualToAnchor:_scrollContentView.leadingAnchor constant:15], + [_stockContainer1.trailingAnchor constraintEqualToAnchor:_scrollContentView.trailingAnchor constant:-15], + [_stockContainer1.heightAnchor constraintEqualToConstant:290], // Height approximation + [_stockContainer1.bottomAnchor constraintEqualToAnchor:_scrollContentView.bottomAnchor constant:-20], + + [_stockLabel1.topAnchor constraintEqualToAnchor:_stockContainer1.topAnchor constant:10], + [_stockLabel1.leadingAnchor constraintEqualToAnchor:_stockContainer1.leadingAnchor constant:15], + + [_permissionHeaderView.topAnchor constraintEqualToAnchor:_stockLabel1.bottomAnchor constant:10], + [_permissionHeaderView.leadingAnchor constraintEqualToAnchor:_stockContainer1.leadingAnchor], + [_permissionHeaderView.trailingAnchor constraintEqualToAnchor:_stockContainer1.trailingAnchor], + [_permissionHeaderView.heightAnchor constraintEqualToConstant:30], + + [_permissionTableView.topAnchor constraintEqualToAnchor:_permissionHeaderView.bottomAnchor], + [_permissionTableView.leadingAnchor constraintEqualToAnchor:_stockContainer1.leadingAnchor], + [_permissionTableView.trailingAnchor constraintEqualToAnchor:_stockContainer1.trailingAnchor], + [_permissionTableView.bottomAnchor constraintEqualToAnchor:_stockContainer1.bottomAnchor constant:-5] + ]]; +} + +#pragma mark - 跳转k线 +-(void)marketViewClick{ + _marketView.userInteractionEnabled = YES; + UITapGestureRecognizer *click = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(marketViewPush)]; + [_marketView addGestureRecognizer:click]; +} + +-(void)marketViewPush{ + ChartViewController *chartViewController = [[ChartViewController alloc] init]; + [self.navigationController pushViewController:chartViewController animated:YES]; +} + +#pragma mark - 哦哦哦哦哦 + +- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { + if (tableView == _stockTableView) return 4;// 股票表4行 + if (tableView == _permissionTableView) return MIN(self.permissionDataList.count, 5);// 接口最多5行 + return 0; +} + +- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { + return (tableView == _stockTableView) ? 60 : 44;// 行高 +} + +- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { + if (tableView == _stockTableView) { + return [self stockCellForIndexPath:indexPath]; + } else { + return [self permissionCellForIndexPath:indexPath]; + } +} + +// 股票Cell +- (UITableViewCell *)stockCellForIndexPath:(NSIndexPath *)indexPath { + UITableViewCell *cell = [_stockTableView dequeueReusableCellWithIdentifier:stockCell forIndexPath:indexPath]; + cell.backgroundColor = [UIColor blackColor]; + cell.selectionStyle = UITableViewCellSelectionStyleNone; + [cell.contentView.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)]; + + NSArray *stocks = @[ + @{@"name":@"PEGASUS HEIGHTS BERHAD", @"code":@"4464", @"price":@"0.010", @"value2":@"100.000%"}, + @{@"name":@"SMTRACK BERHAD", @"code":@"0169", @"price":@"0.010", @"value2":@"100.000%"}, + @{@"name":@"TXCD BERHAD - ICPS 2020/2030", @"code":@"7145PA", @"price":@"0.020", @"value2":@"33.333%"}, + @{@"name":@"DNONCE TECHNOLOGY BHD", @"code":@"7114", @"price":@"0.040", @"value2":@"33.333%"} + ]; + NSDictionary *data = stocks[indexPath.row]; + + UILabel *name = [self createCardLabel:data[@"name"] color:[UIColor whiteColor] size:14 bold:NO]; + name.lineBreakMode = NSLineBreakByTruncatingTail; + UILabel *code = [self createCardLabel:data[@"code"] color:[UIColor lightGrayColor] size:12 bold:NO]; + UILabel *price = [self createCardLabel:data[@"price"] color:[UIColor greenColor] size:14 bold:NO]; + price.textAlignment = NSTextAlignmentRight; + UILabel *val2 = [self createCardLabel:data[@"value2"] color:[UIColor greenColor] size:14 bold:NO]; + val2.textAlignment = NSTextAlignmentRight; + + [cell.contentView addSubview:name]; + [cell.contentView addSubview:code]; + [cell.contentView addSubview:price]; + [cell.contentView addSubview:val2]; + + [NSLayoutConstraint activateConstraints:@[ + [name.leadingAnchor constraintEqualToAnchor:cell.contentView.leadingAnchor constant:15], + [name.topAnchor constraintEqualToAnchor:cell.contentView.topAnchor constant:10], + [name.trailingAnchor constraintLessThanOrEqualToAnchor:price.leadingAnchor constant:-10], + + [code.leadingAnchor constraintEqualToAnchor:cell.contentView.leadingAnchor constant:15], + [code.topAnchor constraintEqualToAnchor:name.bottomAnchor constant:5], + + [price.widthAnchor constraintEqualToConstant:60], + [price.trailingAnchor constraintEqualToAnchor:val2.leadingAnchor constant:-10], + [price.centerYAnchor constraintEqualToAnchor:cell.contentView.centerYAnchor], + + [val2.widthAnchor constraintEqualToConstant:80], + [val2.trailingAnchor constraintEqualToAnchor:cell.contentView.trailingAnchor constant:-15], + [val2.centerYAnchor constraintEqualToAnchor:cell.contentView.centerYAnchor] + ]]; + return cell; +} + +// 接口Cell +- (UITableViewCell *)permissionCellForIndexPath:(NSIndexPath *)indexPath { + UITableViewCell *cell = [_permissionTableView dequeueReusableCellWithIdentifier:permCell forIndexPath:indexPath]; + cell.backgroundColor = [UIColor whiteColor]; + cell.selectionStyle = UITableViewCellSelectionStyleNone; + [cell.contentView.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)]; + + NSDictionary *item = self.permissionDataList[indexPath.row]; + NSArray *values = @[item[@"name"] ?: @"-", item[@"account"] ?: @"-", item[@"market"] ?: @"-", item[@"postiton"] ?: @"-"]; + + for (NSInteger i = 0; i < values.count; i++) { + UILabel *label = [self createCardLabel:[NSString stringWithFormat:@"%@", values[i]] color:[UIColor blackColor] size:11 bold:NO]; + label.textAlignment = NSTextAlignmentCenter; + label.lineBreakMode = NSLineBreakByTruncatingTail; + [cell.contentView addSubview:label]; + + [NSLayoutConstraint activateConstraints:@[ + [label.topAnchor constraintEqualToAnchor:cell.contentView.topAnchor], + [label.bottomAnchor constraintEqualToAnchor:cell.contentView.bottomAnchor], + [label.widthAnchor constraintEqualToAnchor:cell.contentView.widthAnchor multiplier:0.25], + (i == 0) ? [label.leadingAnchor constraintEqualToAnchor:cell.contentView.leadingAnchor] : [label.leadingAnchor constraintEqualToAnchor:cell.contentView.subviews[i-1].trailingAnchor] + ]]; + } + return cell; +} + +@end diff --git a/HC/MyViewController.h b/App/HC/MyViewController.h similarity index 100% rename from HC/MyViewController.h rename to App/HC/MyViewController.h diff --git a/HC/MyViewController.m b/App/HC/MyViewController.m similarity index 100% rename from HC/MyViewController.m rename to App/HC/MyViewController.m diff --git a/HC/QuotationViewController.h b/App/HC/QuotationViewController.h similarity index 100% rename from HC/QuotationViewController.h rename to App/HC/QuotationViewController.h diff --git a/HC/QuotationViewController.m b/App/HC/QuotationViewController.m similarity index 95% rename from HC/QuotationViewController.m rename to App/HC/QuotationViewController.m index 012dea1..de9d3b4 100644 --- a/HC/QuotationViewController.m +++ b/App/HC/QuotationViewController.m @@ -50,7 +50,16 @@ vcClassName:NSStringFromClass([MLXYViewController class])], [CountryModel modelWithCode:@"CN" name:@"中国" - vcClassName:NSStringFromClass([CNViewController class])] + vcClassName:NSStringFromClass([CNViewController class])], + [CountryModel modelWithCode:@"CN" + name:@"中国" + vcClassName:NSStringFromClass([CNViewController class])], + [CountryModel modelWithCode:@"CN" + name:@"中国" + vcClassName:NSStringFromClass([CNViewController class])], + [CountryModel modelWithCode:@"CN" + name:@"中国" + vcClassName:NSStringFromClass([CNViewController class])], ]; } diff --git a/HC/SceneDelegate.h b/App/HC/SceneDelegate.h similarity index 100% rename from HC/SceneDelegate.h rename to App/HC/SceneDelegate.h diff --git a/HC/SceneDelegate.m b/App/HC/SceneDelegate.m similarity index 81% rename from HC/SceneDelegate.m rename to App/HC/SceneDelegate.m index 9be9ac3..230823e 100644 --- a/HC/SceneDelegate.m +++ b/App/HC/SceneDelegate.m @@ -22,18 +22,14 @@ if (!windowScene) return; self.window = [[UIWindow alloc] initWithWindowScene:windowScene]; - // 改用窗口场景的屏幕尺寸(兼容 iOS 26+) self.window.frame = windowScene.screen.bounds; self.window.backgroundColor = [UIColor blackColor]; - //ViewController *loginVC = [[ViewController alloc] init]; - //UINavigationController *navVC = [[UINavigationController alloc] initWithRootViewController:loginVC]; - //self.window.rootViewController = navVC; - // 实例化 ChartViewController - ChartViewController *chartVC = [[ChartViewController alloc] init]; - - // **设置 ChartViewController 为根视图控制器** - self.window.rootViewController = chartVC; + ViewController *loginVC = [[ViewController alloc] init]; + UINavigationController *navVC = [[UINavigationController alloc] initWithRootViewController:loginVC]; + self.window.rootViewController = navVC; +// ChartViewController *chartVC = [[ChartViewController alloc] init]; +// self.window.rootViewController = chartVC; [self.window makeKeyAndVisible]; } diff --git a/App/HC/StockInfoCardView.h b/App/HC/StockInfoCardView.h new file mode 100644 index 0000000..587e366 --- /dev/null +++ b/App/HC/StockInfoCardView.h @@ -0,0 +1,29 @@ +// +// StockInfoCardView.h +// HC +// +// Created by huilinLi on 2025/12/1. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface StockInfoCardView : UIView + +@property (nonatomic, strong, readonly) UILabel *mainPriceLabel; +@property (nonatomic, strong, readonly) UILabel *changePriceLabel; +@property (nonatomic, strong, readonly) UILabel *changePercentLabel; + +@property (nonatomic, strong, readonly) UILabel *highValueLabel; +@property (nonatomic, strong, readonly) UILabel *openValueLabel; +@property (nonatomic, strong, readonly) UILabel *volumeValueLabel; +@property (nonatomic, strong, readonly) UILabel *lowValueLabel; +@property (nonatomic, strong, readonly) UILabel *turnoverRateLabel; // 换 +@property (nonatomic, strong, readonly) UILabel *amountLabel; // 额 (成交额) + +- (void)setupView; + +@end + +NS_ASSUME_NONNULL_END diff --git a/App/HC/StockInfoCardView.m b/App/HC/StockInfoCardView.m new file mode 100644 index 0000000..bac1ea1 --- /dev/null +++ b/App/HC/StockInfoCardView.m @@ -0,0 +1,156 @@ +// +// StockInfoCardView.m +// HC +// +// Created by huilinLi on 2025/12/1. +// + +#import "StockInfoCardView.h" + +@interface StockInfoCardView () +// 在实现文件中重新定义为 readwrite 方便内部赋值 +@property (nonatomic, strong, readwrite) UILabel *mainPriceLabel; +@property (nonatomic, strong, readwrite) UILabel *changePriceLabel; +@property (nonatomic, strong, readwrite) UILabel *changePercentLabel; +@property (nonatomic, strong, readwrite) UILabel *highValueLabel; +@property (nonatomic, strong, readwrite) UILabel *openValueLabel; +@property (nonatomic, strong, readwrite) UILabel *volumeValueLabel; +@property (nonatomic, strong, readwrite) UILabel *lowValueLabel; +@property (nonatomic, strong, readwrite) UILabel *turnoverRateLabel; +@property (nonatomic, strong, readwrite) UILabel *amountLabel; +@end + +@implementation StockInfoCardView + +- (instancetype)initWithFrame:(CGRect)frame { + self = [super initWithFrame:frame]; + if (self) { + // 通常在 init 之后立即调用 setupView + [self setupView]; + } + return self; +} + +- (void)setupView { + self.backgroundColor = [UIColor colorWithRed:0x20/255.0 green:0x20/255.0 blue:0x20/255.0 alpha:1]; + + // 1. 创建左上角价格和变化标签 + _mainPriceLabel = [self createLabelWithFontSize:15 textColor:[UIColor redColor]]; + _changePriceLabel = [self createLabelWithFontSize:8 textColor:[UIColor redColor]]; + _changePercentLabel = [self createLabelWithFontSize:8 textColor:[UIColor redColor]]; + + // 2. 创建右侧信息标签(名称和值) + + // 标签名称(保持原有的布局比例) + UILabel *cardLabelHeight = [self createLabelWithText:@"高" fontSize:15 color:[UIColor colorWithRed:0.2 green:0.2 blue:0.2 alpha:1]]; + UILabel *cardLabelStart = [self createLabelWithText:@"开" fontSize:15 color:[UIColor colorWithRed:0.2 green:0.2 blue:0.2 alpha:1]]; + UILabel *cardLabelVolume = [self createLabelWithText:@"量" fontSize:15 color:[UIColor colorWithRed:0.2 green:0.2 blue:0.2 alpha:1]]; + UILabel *cardLabelLow = [self createLabelWithText:@"低" fontSize:15 color:[UIColor colorWithRed:0.2 green:0.2 blue:0.2 alpha:1]]; + UILabel *cardLabelChange = [self createLabelWithText:@"换" fontSize:15 color:[UIColor colorWithRed:0.2 green:0.2 blue:0.2 alpha:1]]; + UILabel *cardLabelQuota = [self createLabelWithText:@"额" fontSize:15 color:[UIColor colorWithRed:0.2 green:0.2 blue:0.2 alpha:1]]; + + // 标签值(初始内容与原代码相同) + _highValueLabel = [self createLabelWithText:@"1617.260" fontSize:12 color:[UIColor redColor]]; + _openValueLabel = [self createLabelWithText:@"1616.750" fontSize:12 color:[UIColor redColor]]; + _volumeValueLabel = [self createLabelWithText:@"1.511亿" fontSize:12 color:[UIColor whiteColor]]; + _lowValueLabel = [self createLabelWithText:@"1608.850" fontSize:12 color:[UIColor whiteColor]]; + _turnoverRateLabel = [self createLabelWithText:@"--" fontSize:12 color:[UIColor whiteColor]]; + _amountLabel = [self createLabelWithText:@"--" fontSize:12 color:[UIColor whiteColor]]; + + // 将所有子视图添加到 CardView + NSArray *allSubviews = @[_mainPriceLabel, _changePriceLabel, _changePercentLabel, cardLabelHeight, cardLabelStart, cardLabelVolume, cardLabelLow, cardLabelChange, cardLabelQuota, _highValueLabel, _openValueLabel, _volumeValueLabel, _lowValueLabel, _turnoverRateLabel, _amountLabel]; + + for (UIView *view in allSubviews) { + [self addSubview:view]; + } + + // 3. 布局约束 (使用 self 代替原来的 _cardContainer) + [NSLayoutConstraint activateConstraints:@[ + // 左侧主要信息 + [_mainPriceLabel.topAnchor constraintEqualToAnchor:self.topAnchor constant:25], + [_mainPriceLabel.leadingAnchor constraintEqualToAnchor:self.leadingAnchor constant:10], + + [_changePriceLabel.topAnchor constraintEqualToAnchor:self.topAnchor constant:50], + [_changePriceLabel.leadingAnchor constraintEqualToAnchor:self.leadingAnchor constant: 8], + + [_changePercentLabel.topAnchor constraintEqualToAnchor:self.topAnchor constant:50], + [_changePercentLabel.leadingAnchor constraintEqualToAnchor:self.leadingAnchor constant: 45], + + // 相对布局的 Label(高, 开, 量) + [cardLabelHeight.bottomAnchor constraintEqualToAnchor:self.bottomAnchor constant:-75], + + [cardLabelStart.bottomAnchor constraintEqualToAnchor:cardLabelHeight.bottomAnchor], + [cardLabelVolume.bottomAnchor constraintEqualToAnchor:cardLabelHeight.bottomAnchor], + + // 相对布局的 Label(低, 换, 额) + [cardLabelLow.topAnchor constraintEqualToAnchor:self.bottomAnchor constant:-50], + [cardLabelLow.leadingAnchor constraintEqualToAnchor:cardLabelHeight.leadingAnchor], + + [cardLabelChange.topAnchor constraintEqualToAnchor:self.bottomAnchor constant:-50], + [cardLabelChange.leadingAnchor constraintEqualToAnchor:cardLabelStart.leadingAnchor], + + [cardLabelQuota.topAnchor constraintEqualToAnchor:self.bottomAnchor constant:-50], + [cardLabelQuota.leadingAnchor constraintEqualToAnchor:cardLabelVolume.leadingAnchor], + + // 相对布局的 Value(高, 开, 量) + [_highValueLabel.bottomAnchor constraintEqualToAnchor:self.topAnchor constant:45], + [_highValueLabel.leadingAnchor constraintEqualToAnchor:cardLabelHeight.leadingAnchor], + + [_openValueLabel.bottomAnchor constraintEqualToAnchor:_highValueLabel.bottomAnchor], + [_openValueLabel.leadingAnchor constraintEqualToAnchor:cardLabelStart.leadingAnchor], + + [_volumeValueLabel.bottomAnchor constraintEqualToAnchor:_highValueLabel.bottomAnchor], + [_volumeValueLabel.leadingAnchor constraintEqualToAnchor:cardLabelVolume.leadingAnchor], + + // 相对布局的 Value(低, 换, 额) + [_lowValueLabel.bottomAnchor constraintEqualToAnchor:self.bottomAnchor constant:-10], + [_lowValueLabel.leadingAnchor constraintEqualToAnchor:cardLabelLow.leadingAnchor], + + [_turnoverRateLabel.bottomAnchor constraintEqualToAnchor:_lowValueLabel.bottomAnchor], + [_turnoverRateLabel.leadingAnchor constraintEqualToAnchor:cardLabelChange.leadingAnchor], + + [_amountLabel.bottomAnchor constraintEqualToAnchor:_lowValueLabel.bottomAnchor], + [_amountLabel.leadingAnchor constraintEqualToAnchor:cardLabelVolume.leadingAnchor] + ]]; + + // 关键:基于父视图宽度比例的约束(使用 self 代替 _cardContainer) + [NSLayoutConstraint constraintWithItem:cardLabelHeight + attribute:NSLayoutAttributeLeading + relatedBy:NSLayoutRelationEqual + toItem:self + attribute:NSLayoutAttributeTrailing + multiplier:0.25 + constant:0].active = YES; + [NSLayoutConstraint constraintWithItem:cardLabelStart + attribute:NSLayoutAttributeLeading + relatedBy:NSLayoutRelationEqual + toItem:self + attribute:NSLayoutAttributeTrailing + multiplier:0.5 + constant:0].active = YES; + [NSLayoutConstraint constraintWithItem:cardLabelVolume + attribute:NSLayoutAttributeLeading + relatedBy:NSLayoutRelationEqual + toItem:self + attribute:NSLayoutAttributeTrailing + multiplier:0.75 + constant:0].active = YES; +} + +// 辅助方法:创建 UILabel +- (UILabel *)createLabelWithFontSize:(CGFloat)size textColor:(UIColor *)color { + UILabel *label = [[UILabel alloc] init]; + label.textColor = color; + label.font = [UIFont systemFontOfSize:size]; + label.translatesAutoresizingMaskIntoConstraints = NO; + return label; +} + +// 辅助方法:创建带初始文本的 UILabel +- (UILabel *)createLabelWithText:(NSString *)text fontSize:(CGFloat)size color:(UIColor *)color { + UILabel *label = [self createLabelWithFontSize:size textColor:color]; + label.text = text; + return label; +} + +@end diff --git a/HC/StockKLineModel.h b/App/HC/StockKLineModel.h similarity index 60% rename from HC/StockKLineModel.h rename to App/HC/StockKLineModel.h index c6aa38f..74ebd21 100644 --- a/HC/StockKLineModel.h +++ b/App/HC/StockKLineModel.h @@ -22,10 +22,20 @@ NS_ASSUME_NONNULL_BEGIN @property (nonatomic, assign) CGFloat low; // 最低价 @property (nonatomic, assign) CGFloat volume; // 成交量 -// 预留给MA均线(后面章节会用到) -@property (nonatomic, assign) CGFloat ma5; -@property (nonatomic, assign) CGFloat ma10; -@property (nonatomic, assign) CGFloat ma20; +// MACD +@property (nonatomic, assign) CGFloat dif; +@property (nonatomic, assign) CGFloat dea; +@property (nonatomic, assign) CGFloat macdBar; + +// MA (均线) +@property (nonatomic, assign) CGFloat MA5; +@property (nonatomic, assign) CGFloat MA10; +@property (nonatomic, assign) CGFloat MA30; + +// KDJ +@property (nonatomic, assign) CGFloat K; +@property (nonatomic, assign) CGFloat D; +@property (nonatomic, assign) CGFloat J; // 辅助方法:判断是否是阳线(涨) - (BOOL)isUp; diff --git a/HC/StockKLineModel.m b/App/HC/StockKLineModel.m similarity index 100% rename from HC/StockKLineModel.m rename to App/HC/StockKLineModel.m diff --git a/HC/ViewController.h b/App/HC/ViewController.h similarity index 100% rename from HC/ViewController.h rename to App/HC/ViewController.h diff --git a/HC/ViewController.m b/App/HC/ViewController.m similarity index 100% rename from HC/ViewController.m rename to App/HC/ViewController.m diff --git a/HC/main.m b/App/HC/main.m similarity index 100% rename from HC/main.m rename to App/HC/main.m diff --git a/HC.xcodeproj/project.pbxproj b/HC.xcodeproj/project.pbxproj index 3288676..3af9026 100644 --- a/HC.xcodeproj/project.pbxproj +++ b/HC.xcodeproj/project.pbxproj @@ -10,22 +10,9 @@ 38BE1CE22ECC0F27004B805B /* HC.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = HC.app; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ -/* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */ - 3895388C2ED53BDF004AECEA /* Exceptions for "HC" folder in "HC" target */ = { - isa = PBXFileSystemSynchronizedBuildFileExceptionSet; - membershipExceptions = ( - Info.plist, - ); - target = 38BE1CE12ECC0F27004B805B /* HC */; - }; -/* End PBXFileSystemSynchronizedBuildFileExceptionSet section */ - /* Begin PBXFileSystemSynchronizedRootGroup section */ 38BE1CE42ECC0F27004B805B /* HC */ = { isa = PBXFileSystemSynchronizedRootGroup; - exceptions = ( - 3895388C2ED53BDF004AECEA /* Exceptions for "HC" folder in "HC" target */, - ); path = HC; sourceTree = ""; }; @@ -45,7 +32,7 @@ 38BE1CD92ECC0F27004B805B = { isa = PBXGroup; children = ( - 38BE1CE42ECC0F27004B805B /* HC */, + 38DB04EC2EE6A8EC006CBCAF /* New Group */, 38BE1CE32ECC0F27004B805B /* Products */, ); sourceTree = ""; @@ -58,6 +45,14 @@ name = Products; sourceTree = ""; }; + 38DB04EC2EE6A8EC006CBCAF /* New Group */ = { + isa = PBXGroup; + children = ( + 38BE1CE42ECC0F27004B805B /* HC */, + ); + path = "New Group"; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -141,9 +136,12 @@ isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + "ASSETCATALOG_COMPILER_APPICON_NAME[sdk=iphoneos*]" = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = S672243B4Z; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = HC/Info.plist; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; @@ -169,8 +167,10 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = S672243B4Z; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = HC/Info.plist; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; diff --git a/HC.xcodeproj/project.xcworkspace/xcuserdata/huilinli.xcuserdatad/IDEFindNavigatorScopes.plist b/HC.xcodeproj/project.xcworkspace/xcuserdata/huilinli.xcuserdatad/IDEFindNavigatorScopes.plist new file mode 100644 index 0000000..5dd5da8 --- /dev/null +++ b/HC.xcodeproj/project.xcworkspace/xcuserdata/huilinli.xcuserdatad/IDEFindNavigatorScopes.plist @@ -0,0 +1,5 @@ + + + + + diff --git a/HC/ChartViewController.m b/HC/ChartViewController.m deleted file mode 100644 index 91208fe..0000000 --- a/HC/ChartViewController.m +++ /dev/null @@ -1,592 +0,0 @@ -// ChartViewController.m -// HC -// -// Created by huilinLi on 2025/11/27. -// - -#import "ChartViewController.h" -#import "StockKLineModel.h" - -@interface ChartViewController () - -// 上方卡片容器 -@property (nonatomic, strong) UIView *cardContainer; -// k线选择项容器 -@property (nonatomic, strong) UIView *kSelectContainer; -// K线图表容器 -@property (nonatomic, strong) UIView *kLineContainer; -// K线图表滚动视图 -@property (nonatomic, strong) UIScrollView *kLineScrollView; - -// K线数据 -@property (nonatomic, strong) NSArray *kLineData; -// 价格刻度标签 -@property (nonatomic, strong) NSArray *priceLabels; -// 日期刻度标签 -@property (nonatomic, strong) NSArray *dateLabels; - -// 默认展示的K线数量 -@property (nonatomic, assign) NSInteger visibleKLineCount; - -@end - -@implementation ChartViewController - -- (void)viewDidLoad { - [super viewDidLoad]; - self.view.backgroundColor = [UIColor blackColor]; - - self.visibleKLineCount = 40; - - [self generateMockData]; - [self setupSubviews]; - [self setupConstraints]; - - dispatch_async(dispatch_get_main_queue(), ^{ - [self drawKLineChart]; - - if (self.kLineScrollView.contentSize.width > self.kLineScrollView.bounds.size.width) { - CGPoint offset = CGPointMake(self.kLineScrollView.contentSize.width - self.kLineScrollView.bounds.size.width, 0); - [self.kLineScrollView setContentOffset:offset animated:NO]; - } - }); -} - -#pragma mark - UI Setup --(void) setupSubviews{ - // 卡片容器 - _cardContainer = [[UIView alloc] init]; - _cardContainer.backgroundColor = [UIColor colorWithRed:26.0/255.0 - green:26.0/255.0 - blue:2.0/255.0 - alpha:1.0]; - _cardContainer.translatesAutoresizingMaskIntoConstraints = NO; - [self.view addSubview:_cardContainer]; - - UILabel *cardLabel1 = [[UILabel alloc] init]; - cardLabel1.text = @"1617.060"; - cardLabel1.textColor = [UIColor redColor]; - cardLabel1.font = [UIFont systemFontOfSize:15]; - cardLabel1.translatesAutoresizingMaskIntoConstraints = NO; - [_cardContainer addSubview:cardLabel1]; - - UILabel *cardLabel2 = [[UILabel alloc] init]; - cardLabel2.text = @"-7.470"; - cardLabel2.textColor = [UIColor redColor]; - cardLabel2.font = [UIFont systemFontOfSize:8]; - cardLabel2.translatesAutoresizingMaskIntoConstraints = NO; - [_cardContainer addSubview:cardLabel2]; - - UILabel *cardLabel3 = [[UILabel alloc] init]; - cardLabel3.text = @"-0.461%"; - cardLabel3.textColor = [UIColor redColor]; - cardLabel3.font = [UIFont systemFontOfSize:8]; - cardLabel3.translatesAutoresizingMaskIntoConstraints = NO; - [_cardContainer addSubview:cardLabel3]; - - [NSLayoutConstraint activateConstraints:@[ - [cardLabel1.topAnchor constraintEqualToAnchor:_cardContainer.topAnchor constant:25], - [cardLabel1.leadingAnchor constraintEqualToAnchor:self.view.leadingAnchor constant:10], - - [cardLabel2.topAnchor constraintEqualToAnchor:_cardContainer.topAnchor constant:50], - [cardLabel2.leadingAnchor constraintEqualToAnchor:self.view.leadingAnchor constant: 8], - - [cardLabel3.topAnchor constraintEqualToAnchor:_cardContainer.topAnchor constant:50], - [cardLabel3.leadingAnchor constraintEqualToAnchor:self.view.leadingAnchor constant: 45] - ]]; - - UILabel *cardLabelHeight = [[UILabel alloc] init]; - cardLabelHeight.text = @"高"; - cardLabelHeight.textColor = [UIColor colorWithRed:0.2 green:0.2 blue:0.2 alpha:1]; - cardLabelHeight.font = [UIFont systemFontOfSize:15]; - cardLabelHeight.translatesAutoresizingMaskIntoConstraints = NO; - [_cardContainer addSubview:cardLabelHeight]; - - UILabel *cardLabelStart = [[UILabel alloc] init]; - cardLabelStart.text = @"开"; - cardLabelStart.textColor = [UIColor colorWithRed:0.2 green:0.2 blue:0.2 alpha:1]; - cardLabelStart.font = [UIFont systemFontOfSize:15]; - cardLabelStart.translatesAutoresizingMaskIntoConstraints = NO; - [_cardContainer addSubview:cardLabelStart]; - - UILabel *cardLabelVolume = [[UILabel alloc] init]; - cardLabelVolume.text = @"量"; - cardLabelVolume.textColor = [UIColor colorWithRed:0.2 green:0.2 blue:0.2 alpha:1]; - cardLabelVolume.font = [UIFont systemFontOfSize:15]; - cardLabelVolume.translatesAutoresizingMaskIntoConstraints = NO; - [_cardContainer addSubview:cardLabelVolume]; - - UILabel *cardLabelLow = [[UILabel alloc] init]; - cardLabelLow.text = @"低"; - cardLabelLow.textColor = [UIColor colorWithRed:0.2 green:0.2 blue:0.2 alpha:1]; - cardLabelLow.font = [UIFont systemFontOfSize:15]; - cardLabelLow.translatesAutoresizingMaskIntoConstraints = NO; - [_cardContainer addSubview:cardLabelLow]; - - UILabel *cardLabelChange = [[UILabel alloc] init]; - cardLabelChange.text = @"换"; - cardLabelChange.textColor = [UIColor colorWithRed:0.2 green:0.2 blue:0.2 alpha:1]; - cardLabelChange.font = [UIFont systemFontOfSize:15]; - cardLabelChange.translatesAutoresizingMaskIntoConstraints = NO; - [_cardContainer addSubview:cardLabelChange]; - - UILabel *cardLabelQuota = [[UILabel alloc] init]; - cardLabelQuota.text = @"额"; - cardLabelQuota.textColor = [UIColor colorWithRed:0.2 green:0.2 blue:0.2 alpha:1]; - cardLabelQuota.font = [UIFont systemFontOfSize:15]; - cardLabelQuota.translatesAutoresizingMaskIntoConstraints = NO; - [_cardContainer addSubview:cardLabelQuota]; - - UILabel *cardNumHeight = [[UILabel alloc] init]; - cardNumHeight.text = @"1617.260"; - cardNumHeight.textColor = [UIColor redColor]; - cardNumHeight.font = [UIFont systemFontOfSize:12]; - cardNumHeight.translatesAutoresizingMaskIntoConstraints = NO; - [_cardContainer addSubview:cardNumHeight]; - - UILabel *cardNumStart = [[UILabel alloc] init]; - cardNumStart.text = @"1616.750"; - cardNumStart.textColor = [UIColor redColor]; - cardNumStart.font = [UIFont systemFontOfSize:12]; - cardNumStart.translatesAutoresizingMaskIntoConstraints = NO; - [_cardContainer addSubview:cardNumStart]; - - UILabel *cardNumVolume = [[UILabel alloc] init]; - cardNumVolume.text = @"1.511亿"; - cardNumVolume.textColor = [UIColor whiteColor]; - cardNumVolume.font = [UIFont systemFontOfSize:12]; - cardNumVolume.translatesAutoresizingMaskIntoConstraints = NO; - [_cardContainer addSubview:cardNumVolume]; - - UILabel *cardNumLow = [[UILabel alloc] init]; - cardNumLow.text = @"1608.850"; - cardNumLow.textColor = [UIColor whiteColor]; - cardNumLow.font = [UIFont systemFontOfSize:12]; - cardNumLow.translatesAutoresizingMaskIntoConstraints = NO; - [_cardContainer addSubview:cardNumLow]; - - UILabel *cardNumChange = [[UILabel alloc] init]; - cardNumChange.text = @"--"; - cardNumChange.textColor = [UIColor whiteColor]; - cardNumChange.font = [UIFont systemFontOfSize:12]; - cardNumChange.translatesAutoresizingMaskIntoConstraints = NO; - [_cardContainer addSubview:cardNumChange]; - - UILabel *cardNumQuota = [[UILabel alloc] init]; - cardNumQuota.text = @"--"; - cardNumQuota.textColor = [UIColor whiteColor]; - cardNumQuota.font = [UIFont systemFontOfSize:12]; - cardNumQuota.translatesAutoresizingMaskIntoConstraints = NO; - [_cardContainer addSubview:cardNumQuota]; - - [NSLayoutConstraint activateConstraints:@[ - [cardLabelHeight.bottomAnchor constraintEqualToAnchor:_cardContainer.bottomAnchor constant:-75], - - [cardLabelStart.bottomAnchor constraintEqualToAnchor:cardLabelHeight.bottomAnchor], - - [cardLabelVolume.bottomAnchor constraintEqualToAnchor:cardLabelHeight.bottomAnchor], - - [cardLabelLow.topAnchor constraintEqualToAnchor:_cardContainer.bottomAnchor constant:-50], - [cardLabelLow.leadingAnchor constraintEqualToAnchor:cardLabelHeight.leadingAnchor], - - [cardLabelChange.topAnchor constraintEqualToAnchor:_cardContainer.bottomAnchor constant:-50], - [cardLabelChange.leadingAnchor constraintEqualToAnchor:cardLabelStart.leadingAnchor], - - [cardLabelQuota.topAnchor constraintEqualToAnchor:_cardContainer.bottomAnchor constant:-50], - [cardLabelQuota.leadingAnchor constraintEqualToAnchor:cardLabelVolume.leadingAnchor], - - [cardNumHeight.bottomAnchor constraintEqualToAnchor:_cardContainer.topAnchor constant:45], - [cardNumHeight.leadingAnchor constraintEqualToAnchor:cardLabelHeight.leadingAnchor], - - [cardNumStart.bottomAnchor constraintEqualToAnchor:cardNumHeight.bottomAnchor], - [cardNumStart.leadingAnchor constraintEqualToAnchor:cardLabelStart.leadingAnchor], - - [cardNumVolume.bottomAnchor constraintEqualToAnchor:cardNumHeight.bottomAnchor], - [cardNumVolume.leadingAnchor constraintEqualToAnchor:cardLabelVolume.leadingAnchor], - - [cardNumLow.bottomAnchor constraintEqualToAnchor:_cardContainer.bottomAnchor constant:-10], - [cardNumLow.leadingAnchor constraintEqualToAnchor:cardLabelLow.leadingAnchor], - - [cardNumChange.bottomAnchor constraintEqualToAnchor:cardNumLow.bottomAnchor], - [cardNumChange.leadingAnchor constraintEqualToAnchor:cardLabelChange.leadingAnchor], - - [cardNumQuota.bottomAnchor constraintEqualToAnchor:cardNumLow.bottomAnchor], - [cardNumQuota.leadingAnchor constraintEqualToAnchor:cardLabelVolume.leadingAnchor] - ]]; - - [NSLayoutConstraint constraintWithItem:cardLabelHeight - attribute:NSLayoutAttributeLeading - relatedBy:NSLayoutRelationEqual - toItem:_cardContainer - attribute:NSLayoutAttributeTrailing - multiplier:0.25 - constant:0].active = YES; - [NSLayoutConstraint constraintWithItem:cardLabelStart - attribute:NSLayoutAttributeLeading - relatedBy:NSLayoutRelationEqual - toItem:_cardContainer - attribute:NSLayoutAttributeTrailing - multiplier:0.5 - constant:0].active = YES; - [NSLayoutConstraint constraintWithItem:cardLabelVolume - attribute:NSLayoutAttributeLeading - relatedBy:NSLayoutRelationEqual - toItem:_cardContainer - attribute:NSLayoutAttributeTrailing - multiplier:0.75 - constant:0].active = YES; - - // K线选择项容器 - _kSelectContainer = [[UIView alloc] init]; - _kSelectContainer.backgroundColor = [UIColor colorWithRed:26.0/255.0 - green:26.0/255.0 - blue:2.0/255.0 - alpha:1.0]; - _kSelectContainer.translatesAutoresizingMaskIntoConstraints = NO; - [self.view addSubview:_kSelectContainer]; - [self addKSelectOptions]; - - // K线图表容器 - self.kLineContainer = [[UIView alloc] init]; - self.kLineContainer.backgroundColor = [UIColor colorWithRed:26.0/255.0 green:26.0/255.0 blue:26.0/255.0 alpha:1.0]; - self.kLineContainer.translatesAutoresizingMaskIntoConstraints = NO; - [self.view addSubview:self.kLineContainer]; - - // K线图表滚动视图 - self.kLineScrollView = [[UIScrollView alloc] init]; - self.kLineScrollView.backgroundColor = [UIColor clearColor]; - self.kLineScrollView.showsHorizontalScrollIndicator = NO; - self.kLineScrollView.userInteractionEnabled = YES; - self.kLineScrollView.translatesAutoresizingMaskIntoConstraints = NO; - - [self.kLineContainer addSubview:self.kLineScrollView]; - - CGFloat priceLabelAreaWidth = 50.0; - - // 滚动视图的约束 - [NSLayoutConstraint activateConstraints:@[ - [self.kLineScrollView.topAnchor constraintEqualToAnchor:self.kLineContainer.topAnchor], - [self.kLineScrollView.bottomAnchor constraintEqualToAnchor:self.kLineContainer.bottomAnchor], - [self.kLineScrollView.leadingAnchor constraintEqualToAnchor:self.kLineContainer.leadingAnchor constant:priceLabelAreaWidth], - [self.kLineScrollView.trailingAnchor constraintEqualToAnchor:self.kLineContainer.trailingAnchor], - [self.kLineScrollView.heightAnchor constraintEqualToAnchor:self.kLineContainer.heightAnchor] - ]]; - - // 边框 - UIView *borderView = [[UIView alloc] init]; - borderView.backgroundColor = [UIColor clearColor]; - borderView.layer.borderWidth = 1; - borderView.layer.borderColor = [[UIColor colorWithRed:0.4 green:0.4 blue:0.4 alpha:1.0] CGColor]; - borderView.translatesAutoresizingMaskIntoConstraints = NO; - [self.kLineContainer addSubview:borderView]; - [NSLayoutConstraint activateConstraints:@[ - [borderView.leadingAnchor constraintEqualToAnchor:self.kLineContainer.leadingAnchor], - [borderView.trailingAnchor constraintEqualToAnchor:self.kLineContainer.trailingAnchor], - [borderView.topAnchor constraintEqualToAnchor:self.kLineContainer.topAnchor], - [borderView.bottomAnchor constraintEqualToAnchor:self.kLineContainer.bottomAnchor] - ]]; - - // 动态计算模型数据的价格区间 - CGFloat maxPrice = 0; - CGFloat minPrice = CGFLOAT_MAX; - for (id item in self.kLineData) { - if ([item isKindOfClass:[StockKLineModel class]]) { - StockKLineModel *model = (StockKLineModel *)item; - maxPrice = MAX(maxPrice, model.high); - minPrice = MIN(minPrice, model.low); - } else if ([item isKindOfClass:[NSDictionary class]]) { - NSDictionary *dict = (NSDictionary *)item; - maxPrice = MAX(maxPrice, [dict[@"high"] floatValue]); - minPrice = MIN(minPrice, [dict[@"low"] floatValue]); - } - } - maxPrice = maxPrice + (maxPrice - minPrice) * 0.1; - minPrice = minPrice - (maxPrice - minPrice) * 0.1; - - // 价格刻度 - NSMutableArray *priceLabelArr = [NSMutableArray array]; - for (NSInteger i = 0; i < 5; i++) { - CGFloat price = maxPrice - (maxPrice - minPrice) / 4 * i; - UILabel *label = [[UILabel alloc] init]; - label.text = [NSString stringWithFormat:@"%.1f", price]; - label.textColor = [UIColor lightGrayColor]; - label.font = [UIFont systemFontOfSize:10]; - label.translatesAutoresizingMaskIntoConstraints = NO; - [self.kLineContainer addSubview:label]; - - [NSLayoutConstraint activateConstraints:@[ - [label.leadingAnchor constraintEqualToAnchor:self.kLineContainer.leadingAnchor constant:5], - [label.centerYAnchor constraintEqualToAnchor:self.kLineContainer.centerYAnchor constant:-80 + 40 * i] - ]]; - [priceLabelArr addObject:label]; - } - self.priceLabels = priceLabelArr; - - self.dateLabels = @[]; -} - -- (void)addKSelectOptions { - NSArray *titles = @[@"日k", @"周k", @"月k", @"更多", @"设置"]; - - UIStackView *stackView = [[UIStackView alloc] init]; - stackView.axis = UILayoutConstraintAxisHorizontal; - stackView.distribution = UIStackViewDistributionFillEqually; - stackView.alignment = UIStackViewAlignmentCenter; - stackView.spacing = 5.0; - stackView.translatesAutoresizingMaskIntoConstraints = NO; - - for (NSString *title in titles) { - UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem]; - [button setTitle:title forState:UIControlStateNormal]; - button.titleLabel.font = [UIFont systemFontOfSize:14]; - [button setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; - - if ([title isEqualToString:@"日k"]) { - [button setTitleColor:[UIColor yellowColor] forState:UIControlStateNormal]; - button.layer.borderColor = [[UIColor yellowColor] CGColor]; - button.layer.borderWidth = 1.0; - } else { - [button setTitleColor:[UIColor lightGrayColor] forState:UIControlStateNormal]; - button.layer.borderWidth = 0; - } - - button.layer.cornerRadius = 3.0; - button.clipsToBounds = YES; - - [stackView addArrangedSubview:button]; - } - - [_kSelectContainer addSubview:stackView]; - - [NSLayoutConstraint activateConstraints:@[ - [stackView.leadingAnchor constraintEqualToAnchor:_kSelectContainer.leadingAnchor constant:10], - [stackView.trailingAnchor constraintEqualToAnchor:_kSelectContainer.trailingAnchor constant:-10], - [stackView.topAnchor constraintEqualToAnchor:_kSelectContainer.topAnchor constant:5], - [stackView.bottomAnchor constraintEqualToAnchor:_kSelectContainer.bottomAnchor constant:-5] - ]]; -} - -#pragma mark - Constraints -- (void)setupConstraints{ - [NSLayoutConstraint activateConstraints:@[ - [_cardContainer.topAnchor constraintEqualToAnchor:self.view.safeAreaLayoutGuide.topAnchor], - [_cardContainer.leadingAnchor constraintEqualToAnchor:self.view.leadingAnchor], - [_cardContainer.widthAnchor constraintEqualToAnchor:self.view.widthAnchor], - [_cardContainer.heightAnchor constraintEqualToConstant:100], - - [_kSelectContainer.topAnchor constraintEqualToAnchor:_cardContainer.bottomAnchor constant:5], - [_kSelectContainer.leadingAnchor constraintEqualToAnchor:self.view.leadingAnchor], - [_kSelectContainer.widthAnchor constraintEqualToAnchor:self.view.widthAnchor], - [_kSelectContainer.heightAnchor constraintEqualToConstant:40], - - [self.kLineContainer.topAnchor constraintEqualToAnchor:self.kSelectContainer.bottomAnchor constant:5], - [self.kLineContainer.leadingAnchor constraintEqualToAnchor:self.view.leadingAnchor], - [self.kLineContainer.widthAnchor constraintEqualToAnchor:self.view.widthAnchor], - [self.kLineContainer.heightAnchor constraintEqualToConstant:200] - ]]; -} - -#pragma mark - KLine Drawing -- (void)drawKLineChart { - // 移除旧的 K 线 - for (UIView *subview in self.kLineScrollView.subviews) { - if (![subview isKindOfClass:[UILabel class]]) { - [subview removeFromSuperview]; - } - } - - CGFloat chartHeight = self.kLineContainer.bounds.size.height; - if (chartHeight == 0) { - chartHeight = 200; - } - - // K线宽度计算 - CGFloat kLineUnitWidth = 5.0; - CGFloat kLineRatio = 0.8; - CGFloat kLineWidth = kLineUnitWidth * kLineRatio; - CGFloat space = kLineUnitWidth * (1.0 - kLineRatio); - CGFloat totalChartWidth = kLineUnitWidth * self.kLineData.count; - - // 设置contentSize - self.kLineScrollView.contentSize = CGSizeMake(totalChartWidth, chartHeight); - - // 动态计算价格区间 - CGFloat maxPrice = 0; - CGFloat minPrice = CGFLOAT_MAX; - for (id item in self.kLineData) { - if ([item isKindOfClass:[StockKLineModel class]]) { - StockKLineModel *model = (StockKLineModel *)item; - maxPrice = MAX(maxPrice, model.high); - minPrice = MIN(minPrice, model.low); - } else if ([item isKindOfClass:[NSDictionary class]]) { - NSDictionary *dict = (NSDictionary *)item; - maxPrice = MAX(maxPrice, [dict[@"high"] floatValue]); - minPrice = MIN(minPrice, [dict[@"low"] floatValue]); - } - } - maxPrice = maxPrice + (maxPrice - minPrice) * 0.1; - minPrice = minPrice - (maxPrice - minPrice) * 0.1; - CGFloat priceRange = maxPrice - minPrice; - - // 绘制K线 - for (NSInteger i = 0; i < self.kLineData.count; i++) { - CGFloat open = 0, high = 0, low = 0, close = 0; - - if ([self.kLineData[i] isKindOfClass:[StockKLineModel class]]) { - StockKLineModel *model = (StockKLineModel *)self.kLineData[i]; - open = model.open; - high = model.high; - low = model.low; - close = model.close; - } else if ([self.kLineData[i] isKindOfClass:[NSDictionary class]]) { - NSDictionary *dict = (NSDictionary *)self.kLineData[i]; - open = [dict[@"open"] floatValue]; - high = [dict[@"high"] floatValue]; - low = [dict[@"low"] floatValue]; - close = [dict[@"close"] floatValue]; - } - - // 坐标转换 - CGFloat yOpen = chartHeight * (maxPrice - open) / priceRange; - CGFloat yHigh = chartHeight * (maxPrice - high) / priceRange; - CGFloat yLow = chartHeight * (maxPrice - low) / priceRange; - CGFloat yClose = chartHeight * (maxPrice - close) / priceRange; - - // 计算X坐标 - CGFloat xPosition = space/2 + kLineUnitWidth * i; - - // 绘制K线实体 - UIView *bodyView = [[UIView alloc] init]; - bodyView.backgroundColor = (close >= open) ? [UIColor greenColor] : [UIColor redColor]; - bodyView.frame = CGRectMake( - xPosition, - MIN(yOpen, yClose), - kLineWidth, - MAX(1.0, fabs(yClose - yOpen)) - ); - [self.kLineScrollView addSubview:bodyView]; - - // 绘制影线 - UIView *shadowView = [[UIView alloc] init]; - shadowView.backgroundColor = bodyView.backgroundColor; - shadowView.frame = CGRectMake( - bodyView.center.x - 0.5, - yHigh, - 1, - yLow - yHigh - ); - [self.kLineScrollView addSubview:shadowView]; - } - - // 日期刻度 - for (UILabel *label in self.dateLabels) { - [label removeFromSuperview]; - } - - NSMutableArray *dateLabelArr = [NSMutableArray array]; - NSInteger dateInterval = 10; - - for (NSInteger i = 0; i < self.kLineData.count; i += dateInterval) { - NSString *dateStr = @""; - if ([self.kLineData[i] isKindOfClass:[StockKLineModel class]]) { - StockKLineModel *model = (StockKLineModel *)self.kLineData[i]; - dateStr = model.date; - } else if ([self.kLineData[i] isKindOfClass:[NSDictionary class]]) { - NSDictionary *dict = (NSDictionary *)self.kLineData[i]; - dateStr = dict[@"date"]; - } - UILabel *label = [[UILabel alloc] init]; - label.text = dateStr; - label.textColor = [UIColor lightGrayColor]; - label.font = [UIFont systemFontOfSize:10]; - label.translatesAutoresizingMaskIntoConstraints = YES; - - CGFloat xCenter = kLineUnitWidth * (i + 0.5); - [label sizeToFit]; - - label.frame = CGRectMake( - xCenter - label.bounds.size.width / 2, - chartHeight - 15, - label.bounds.size.width, - label.bounds.size.height - ); - - [self.kLineScrollView addSubview:label]; - [dateLabelArr addObject:label]; - } - self.dateLabels = dateLabelArr; - - NSLog(@"ScrollView Bounds Width: %f", self.kLineScrollView.bounds.size.width); - NSLog(@"Content Size Width: %f", self.kLineScrollView.contentSize.width); - - if (self.kLineScrollView.contentSize.width <= self.kLineScrollView.bounds.size.width) { - NSLog(@"⚠️ 警告:ContentSize 不够大,无法滑动。"); - } -} - -#pragma mark - Mock Data -- (void) setupData{ - self.kLineData = @[ - @{@"date":@"2025/11/18", @"open":@1620.0, @"high":@1643.0, @"low":@1605.0, @"close":@1630.0, @"volume":@2.5}, - @{@"date":@"2025/11/19", @"open":@1630.0, @"high":@1635.0, @"low":@1615.0, @"close":@1620.0, @"volume":@2.2}, - @{@"date":@"2025/11/20", @"open":@1620.0, @"high":@1628.0, @"low":@1608.0, @"close":@1615.0, @"volume":@1.8}, - @{@"date":@"2025/11/21", @"open":@1615.0, @"high":@1625.0, @"low":@1610.0, @"close":@1622.0, @"volume":@2.0}, - @{@"date":@"2025/11/22", @"open":@1622.0, @"high":@1630.0, @"low":@1618.0, @"close":@1625.0, @"volume":@2.3}, - @{@"date":@"2025/11/25", @"open":@1625.0, @"high":@1632.0, @"low":@1620.0, @"close":@1628.0, @"volume":@1.9}, - @{@"date":@"2025/11/26", @"open":@1628.0, @"high":@1635.0, @"low":@1622.0, @"close":@1630.0, @"volume":@2.1}, - @{@"date":@"2025/11/27", @"open":@1630.0, @"high":@1638.0, @"low":@1625.0, @"close":@1628.0, @"volume":@2.4}, - @{@"date":@"2025/11/28", @"open":@1628.0, @"high":@1632.0, @"low":@1609.0, @"close":@1610.0, @"volume":@2.6}, - @{@"date":@"2025/11/29", @"open":@1610.0, @"high":@1620.0, @"low":@1608.0, @"close":@1615.0, @"volume":@1.7} - ]; -} - -- (void)generateMockData { - NSMutableArray *arr = [NSMutableArray array]; - CGFloat lastClose = 100.0; - NSLog(@"生成模拟数据中。。。"); - - // 生成200条数据(减少数量,避免contentSize过大) - for (int i = 0; i < 200; i++) { - StockKLineModel *model = [[StockKLineModel alloc] init]; - - NSDate *date = [NSDate dateWithTimeIntervalSinceNow:-(200 - i) * 24 * 3600]; - NSDateFormatter *fmt = [[NSDateFormatter alloc] init]; - [fmt setDateFormat:@"MM-dd"]; - model.date = [fmt stringFromDate:date]; - - // 价格生成逻辑 - CGFloat volatility = lastClose * 0.02; - CGFloat randomChange = ((arc4random() % 100) / 100.0 - 0.5) * 2 * volatility; - - model.open = lastClose + ((arc4random() % 100) / 100.0 - 0.5) * volatility * 0.5; - model.close = model.open + randomChange; - - CGFloat maxOC = MAX(model.open, model.close); - CGFloat minOC = MIN(model.open, model.close); - - model.high = maxOC + (arc4random() % 100) / 100.0 * 1.0; - model.low = minOC - (arc4random() % 100) / 100.0 * 1.0; - - // 成交量生成逻辑 - CGFloat baseVolume = 1000000.0; - CGFloat randomVolFactor = (arc4random() % 200) / 100.0 + 0.5; - - if (fabs(model.close - model.open) / model.open > 0.03) { - randomVolFactor *= 1.5; - } - - model.volume = baseVolume * randomVolFactor; - - if (model.low < 0) model.low = 0.01; - - [arr addObject:model]; - - lastClose = model.close; - } - - NSLog(@"生成模拟数据完毕,共%ld条", arr.count); - - self.kLineData = arr; -} - -@end diff --git a/HC/MLXYViewController.m b/HC/MLXYViewController.m deleted file mode 100644 index 505923e..0000000 --- a/HC/MLXYViewController.m +++ /dev/null @@ -1,442 +0,0 @@ -// -// MLXYViewController.m -// HC -// -// Created by huilinLi on 2025/11/26. -// -#import "MLXYViewController.h" -#import "ChartViewController.h" - -@interface MLXYViewController () -@property (nonatomic, strong) UIButton *mlxyButton; -// 大盘指数 -@property (nonatomic, strong) UILabel *marketTitleLabel; -@property (nonatomic, strong) UIView *marketView; -@property (nonatomic, strong) UILabel *marketLine1; -@property (nonatomic, strong) UILabel *marketLine2; -@property (nonatomic, strong) UILabel *marketLine3; -// 板块 -@property (nonatomic, strong) UILabel *sectorTitleLabel; -@property (nonatomic, strong) UIButton *sectorBtn; -// 三个板块卡片(分别配置) -@property (nonatomic, strong) UIView *sectorCard1; -@property (nonatomic, strong) UIView *sectorCard2; -@property (nonatomic, strong) UIView *sectorCard3; -// 股票 -@property (nonatomic, strong) UIView *stockContainer; -@property (nonatomic, strong) UITableView *stockTableView; -// 股票表头 -@property (nonatomic, strong) UIView *stockHeaderView; -// 按钮配置 -@property (nonatomic, strong) UIButtonConfiguration *buttonConfig; -// 板块数据配置 -@property (nonatomic, strong) NSArray *sectorDataConfig; -@end - -@implementation MLXYViewController - -- (void)viewDidLoad { - [super viewDidLoad]; - self.view.backgroundColor = [UIColor blackColor]; - - [self setupButtonConfig]; - [self setupSectorDataConfig]; - - [self setupSubviews]; - [self setupConstraints]; - - [self marketViewClick]; -} - --(void) marketViewClick{ - _marketView.userInteractionEnabled = YES; - UITapGestureRecognizer *click = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(marketViewPush)]; - [_marketView addGestureRecognizer:click]; -} - --(void) marketViewPush{ - ChartViewController *chartViewController = [[ChartViewController alloc] init]; - [self.navigationController pushViewController:chartViewController animated:YES]; -} - -- (void)setupButtonConfig { - UIButtonConfiguration *config = [UIButtonConfiguration plainButtonConfiguration]; - config.title = @"更多"; - config.attributedTitle = [[NSAttributedString alloc] initWithString:@"更多" attributes:@{ - NSFontAttributeName: [UIFont systemFontOfSize:14], - NSForegroundColorAttributeName: [UIColor lightGrayColor] - }]; - - UIImage *image = [[UIImage systemImageNamed:@"chevron.right"] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; - config.image = image; - config.imagePlacement = NSDirectionalRectEdgeTrailing; // 图片在文字右侧 - config.imagePadding = 1; - - config.baseForegroundColor = [UIColor lightGrayColor]; - - _buttonConfig = config; -} - -- (void)setupSectorDataConfig { - _sectorDataConfig = @[ - @{@"name":@"Health", @"value1":@"1099.683", @"value2":@"27.236",@"value3":@"2.270%"}, - @{@"name":@"Others", @"value1":@"2083.783", @"value2":@"0.000",@"value3":@"0.000%"}, - @{@"name":@"HLKLI", @"value1":@"987.895", @"value2":@"-1.854",@"value3":@"-0.230%"} - ]; -} - -- (void)setupSubviews { - // 马来西亚按钮 - _mlxyButton = [UIButton buttonWithType:UIButtonTypeSystem]; - [_mlxyButton setTitle:@"马来西亚" forState:UIControlStateNormal]; - [_mlxyButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; - [_mlxyButton setBackgroundColor:[UIColor blueColor]]; - _mlxyButton.layer.cornerRadius = 15; - _mlxyButton.titleLabel.font = [UIFont systemFontOfSize:14]; - _mlxyButton.translatesAutoresizingMaskIntoConstraints = NO; - [self.view addSubview:_mlxyButton]; - - // 大盘指数 - _marketTitleLabel = [[UILabel alloc] init]; - _marketTitleLabel.text = @"大盘指数"; - _marketTitleLabel.textColor = [UIColor whiteColor]; - _marketTitleLabel.font = [UIFont systemFontOfSize:16 weight:UIFontWeightMedium]; - _marketTitleLabel.translatesAutoresizingMaskIntoConstraints = NO; - [self.view addSubview:_marketTitleLabel]; - - // 绿色卡片 - _marketView = [[UIView alloc] init]; - _marketView.backgroundColor = [UIColor greenColor]; - _marketView.layer.cornerRadius = 8; - _marketView.translatesAutoresizingMaskIntoConstraints = NO; - [self.view addSubview:_marketView]; - - _marketLine1 = [[UILabel alloc] init]; - _marketLine1.text = @"富时马来西亚KLCI"; - _marketLine1.textColor = [UIColor whiteColor]; - _marketLine1.font = [UIFont fontWithName:@"Helvetica-Bold" size:12]; - _marketLine1.textAlignment = NSTextAlignmentCenter; - _marketLine1.translatesAutoresizingMaskIntoConstraints = NO; - [_marketView addSubview:_marketLine1]; - - _marketLine2 = [[UILabel alloc] init]; - _marketLine2.text = @"1624.500"; - _marketLine2.textColor = [UIColor whiteColor]; - _marketLine2.font = [UIFont boldSystemFontOfSize:17]; - _marketLine2.textAlignment = NSTextAlignmentCenter; - _marketLine2.translatesAutoresizingMaskIntoConstraints = NO; - [_marketView addSubview:_marketLine2]; - - _marketLine3 = [[UILabel alloc] init]; - _marketLine3.text = @"12.760 0.792%"; - _marketLine3.textColor = [UIColor whiteColor]; - _marketLine3.font = [UIFont boldSystemFontOfSize:12]; - _marketLine3.textAlignment = NSTextAlignmentCenter; - _marketLine3.translatesAutoresizingMaskIntoConstraints = NO; - [_marketView addSubview:_marketLine3]; - - // 板块 - _sectorTitleLabel = [[UILabel alloc] init]; - _sectorTitleLabel.text = @"板块"; - _sectorTitleLabel.textColor = [UIColor whiteColor]; - _sectorTitleLabel.font = [UIFont systemFontOfSize:16 weight:UIFontWeightMedium]; - _sectorTitleLabel.translatesAutoresizingMaskIntoConstraints = NO; - [self.view addSubview:_sectorTitleLabel]; - - _sectorBtn = [UIButton buttonWithConfiguration:self.buttonConfig primaryAction:nil]; - _sectorBtn.translatesAutoresizingMaskIntoConstraints = NO; - [self.view addSubview:_sectorBtn]; - - _sectorCard1 = [self createSectorCardWithData:self.sectorDataConfig[0]]; - [self.view addSubview:_sectorCard1]; - - _sectorCard2 = [self createSectorCardWithData:self.sectorDataConfig[1]]; - [self.view addSubview:_sectorCard2]; - - _sectorCard3 = [self createSectorCardWithData:self.sectorDataConfig[2]]; - [self.view addSubview:_sectorCard3]; - - // 股票容器 - _stockContainer = [[UIView alloc] init]; - _stockContainer.translatesAutoresizingMaskIntoConstraints = NO; - [self.view addSubview:_stockContainer]; - - UILabel *stockTitleLabel = [[UILabel alloc] init]; - stockTitleLabel.text = @"股票"; - stockTitleLabel.textColor = [UIColor whiteColor]; - stockTitleLabel.font = [UIFont systemFontOfSize:16 weight:UIFontWeightMedium]; - stockTitleLabel.translatesAutoresizingMaskIntoConstraints = NO; - [_stockContainer addSubview:stockTitleLabel]; - - UIButton *stockBtn = [UIButton buttonWithConfiguration:self.buttonConfig primaryAction:nil]; - stockBtn.translatesAutoresizingMaskIntoConstraints = NO; - [_stockContainer addSubview:stockBtn]; - - // 股票列表表头 - _stockHeaderView = [[UIView alloc] init]; - _stockHeaderView.backgroundColor = [UIColor blackColor]; - _stockHeaderView.translatesAutoresizingMaskIntoConstraints = NO; - [_stockContainer addSubview:_stockHeaderView]; - - NSArray *headerTitles = @[@"名称", @"最新", @"涨幅"]; - for (NSInteger i = 0; i < headerTitles.count; i++) { - UILabel *headerLabel = [[UILabel alloc] init]; - headerLabel.text = headerTitles[i]; - headerLabel.textColor = [UIColor lightGrayColor]; - headerLabel.font = [UIFont systemFontOfSize:12]; - headerLabel.textAlignment = (i == 0) ? NSTextAlignmentLeft : NSTextAlignmentRight; - headerLabel.translatesAutoresizingMaskIntoConstraints = NO; - [_stockHeaderView addSubview:headerLabel]; - - if (i == 0) { - [headerLabel.leadingAnchor constraintEqualToAnchor:_stockHeaderView.leadingAnchor constant:15].active = YES; - } else if (i == 1) { - [headerLabel.widthAnchor constraintEqualToConstant:60].active = YES; - [headerLabel.trailingAnchor constraintEqualToAnchor:_stockHeaderView.trailingAnchor constant:-110].active = YES; - } else { - [headerLabel.widthAnchor constraintEqualToConstant:80].active = YES; - [headerLabel.trailingAnchor constraintEqualToAnchor:_stockHeaderView.trailingAnchor constant:-30].active = YES; - } - [headerLabel.centerYAnchor constraintEqualToAnchor:_stockHeaderView.centerYAnchor].active = YES; - } - - _stockTableView = [[UITableView alloc] init]; - _stockTableView.backgroundColor = [UIColor blackColor]; - _stockTableView.separatorStyle = UITableViewCellSeparatorStyleNone;// 隐藏单元格之间的分隔线 - //SingleLine 默认,1px的分割线 - _stockTableView.delegate = self; - _stockTableView.dataSource = self; - [_stockTableView registerClass:[UITableViewCell class]// 单元格复用类 - forCellReuseIdentifier:@"StockCell"];// 复用标识 - _stockTableView.translatesAutoresizingMaskIntoConstraints = NO; - [_stockContainer addSubview:_stockTableView]; -} - -- (UIView *)createSectorCardWithData:(NSDictionary *)data { - UIView *card = [[UIView alloc] init]; - card.backgroundColor = [UIColor darkGrayColor]; - card.layer.cornerRadius = 8; - card.translatesAutoresizingMaskIntoConstraints = NO; - - // 名称 - UILabel *nameLabel = [[UILabel alloc] init]; - nameLabel.text = data[@"name"]; - nameLabel.textColor = [UIColor whiteColor]; - nameLabel.font = [UIFont systemFontOfSize:14]; - nameLabel.translatesAutoresizingMaskIntoConstraints = NO; - [card addSubview:nameLabel]; - - // 数值 - UILabel *value1Label = [[UILabel alloc] init]; - value1Label.text = data[@"value1"]; - value1Label.textColor = [UIColor greenColor]; - value1Label.font = [UIFont systemFontOfSize:16 weight:UIFontWeightBold]; - value1Label.translatesAutoresizingMaskIntoConstraints = NO; - [card addSubview:value1Label]; - - // 涨幅 - UILabel *value2Label = [[UILabel alloc] init]; - value2Label.text = data[@"value2"]; - value2Label.textColor = [UIColor greenColor]; - value2Label.font = [UIFont systemFontOfSize:12]; - value2Label.translatesAutoresizingMaskIntoConstraints = NO; - [card addSubview:value2Label]; - - UILabel *value3Label = [[UILabel alloc] init]; - value3Label.text = data[@"value3"]; - value3Label.textColor = [UIColor greenColor]; - value3Label.font = [UIFont systemFontOfSize:12]; - value3Label.translatesAutoresizingMaskIntoConstraints = NO; - [card addSubview:value3Label]; - - [NSLayoutConstraint activateConstraints:@[ - [nameLabel.topAnchor constraintEqualToAnchor:card.topAnchor constant:7], - [nameLabel.leadingAnchor constraintEqualToAnchor:card.leadingAnchor constant:10], - - [value1Label.topAnchor constraintEqualToAnchor:nameLabel.bottomAnchor constant:10], - [value1Label.leadingAnchor constraintEqualToAnchor:card.leadingAnchor constant:10], - - [value2Label.topAnchor constraintEqualToAnchor:value1Label.bottomAnchor constant:7], - [value2Label.leadingAnchor constraintEqualToAnchor:card.leadingAnchor constant:10], - - [value3Label.topAnchor constraintEqualToAnchor:value2Label.bottomAnchor constant:6], - [value3Label.leadingAnchor constraintEqualToAnchor:card.leadingAnchor constant:10] - ]]; - - return card; -} - -- (void)setupConstraints { - // 马来西亚按钮 - NSLayoutConstraint *btnTop = [_mlxyButton.topAnchor constraintEqualToAnchor:self.view.safeAreaLayoutGuide.topAnchor]; - NSLayoutConstraint *btnLeft = [_mlxyButton.leadingAnchor constraintEqualToAnchor:self.view.leadingAnchor constant:15]; - NSLayoutConstraint *btnWidth = [_mlxyButton.widthAnchor constraintEqualToConstant:90]; - NSLayoutConstraint *btnHeight = [_mlxyButton.heightAnchor constraintEqualToConstant:30]; - [NSLayoutConstraint activateConstraints:@[btnTop, btnLeft, btnWidth, btnHeight]]; - - // 大盘 - NSLayoutConstraint *marketTitleTop = [_marketTitleLabel.topAnchor constraintEqualToAnchor:_mlxyButton.bottomAnchor constant:10]; - NSLayoutConstraint *marketTitleLeft = [_marketTitleLabel.leadingAnchor constraintEqualToAnchor:self.view.leadingAnchor constant:15]; - [NSLayoutConstraint activateConstraints:@[marketTitleTop, marketTitleLeft]]; - - NSLayoutConstraint *marketCardTop = [_marketView.topAnchor constraintEqualToAnchor:_marketTitleLabel.bottomAnchor constant:10]; - NSLayoutConstraint *marketCardLeft = [_marketView.leadingAnchor constraintEqualToAnchor:self.view.leadingAnchor constant:15]; - NSLayoutConstraint *marketCardWidth = [_marketView.widthAnchor constraintEqualToAnchor:self.view.widthAnchor multiplier:0.3]; - NSLayoutConstraint *marketCardHeight = [_marketView.heightAnchor constraintEqualToConstant:100]; - [NSLayoutConstraint activateConstraints:@[marketCardTop, marketCardLeft, marketCardWidth, marketCardHeight]]; - - NSLayoutConstraint *line1Top = [_marketLine1.topAnchor constraintEqualToAnchor:_marketView.topAnchor constant:10]; - NSLayoutConstraint *line1CenterX = [_marketLine1.centerXAnchor constraintEqualToAnchor:_marketView.centerXAnchor]; - - NSLayoutConstraint *line2Top = [_marketLine2.topAnchor constraintEqualToAnchor:_marketLine1.bottomAnchor constant:15]; - NSLayoutConstraint *line2CenterX = [_marketLine2.centerXAnchor constraintEqualToAnchor:_marketView.centerXAnchor]; - - NSLayoutConstraint *line3Top = [_marketLine3.topAnchor constraintEqualToAnchor:_marketLine2.bottomAnchor constant:12]; - NSLayoutConstraint *line3CenterX = [_marketLine3.centerXAnchor constraintEqualToAnchor:_marketView.centerXAnchor]; - - [NSLayoutConstraint activateConstraints:@[line1Top, line1CenterX, line2Top, line2CenterX, line3Top, line3CenterX]]; - - // 板块 - NSLayoutConstraint *sectorTitleTop = [_sectorTitleLabel.topAnchor constraintEqualToAnchor:_marketView.bottomAnchor constant:20]; - NSLayoutConstraint *sectorTitleLeft = [_sectorTitleLabel.leadingAnchor constraintEqualToAnchor:self.view.leadingAnchor constant:15]; - [NSLayoutConstraint activateConstraints:@[sectorTitleTop, sectorTitleLeft]]; - - NSLayoutConstraint *sectorBtnTop = [_sectorBtn.centerYAnchor constraintEqualToAnchor:_sectorTitleLabel.centerYAnchor]; - NSLayoutConstraint *sectorBtnRight = [_sectorBtn.trailingAnchor constraintEqualToAnchor:self.view.trailingAnchor constant:-15]; - [NSLayoutConstraint activateConstraints:@[sectorBtnTop, sectorBtnRight]]; - - NSLayoutConstraint *card1Top = [_sectorCard1.topAnchor constraintEqualToAnchor:_sectorTitleLabel.bottomAnchor constant:10]; - NSLayoutConstraint *card1Left = [_sectorCard1.leadingAnchor constraintEqualToAnchor:self.view.leadingAnchor constant:8]; - NSLayoutConstraint *card1Width = [_sectorCard1.widthAnchor constraintEqualToAnchor:self.view.widthAnchor multiplier:0.3]; - NSLayoutConstraint *card1Height = [_sectorCard1.heightAnchor constraintEqualToConstant:100]; - [NSLayoutConstraint activateConstraints:@[card1Top, card1Left, card1Width, card1Height]]; - - NSLayoutConstraint *card2Top = [_sectorCard2.topAnchor constraintEqualToAnchor:_sectorCard1.topAnchor]; - NSLayoutConstraint *card2Left = [_sectorCard2.leadingAnchor constraintEqualToAnchor:_sectorCard1.trailingAnchor constant:8]; - NSLayoutConstraint *card2Width = [_sectorCard2.widthAnchor constraintEqualToAnchor:_sectorCard1.widthAnchor]; - NSLayoutConstraint *card2Height = [_sectorCard2.heightAnchor constraintEqualToAnchor:_sectorCard1.heightAnchor]; - [NSLayoutConstraint activateConstraints:@[card2Top, card2Left, card2Width, card2Height]]; - - NSLayoutConstraint *card3Top = [_sectorCard3.topAnchor constraintEqualToAnchor:_sectorCard1.topAnchor]; - NSLayoutConstraint *card3Left = [_sectorCard3.leadingAnchor constraintEqualToAnchor:_sectorCard2.trailingAnchor constant:8]; - NSLayoutConstraint *card3Right = [_sectorCard3.trailingAnchor constraintEqualToAnchor:self.view.trailingAnchor constant:-16]; - // *card3Width = [_sectorCard3.widthAnchor constraintEqualToAnchor:_sectorCard1.widthAnchor];都行 - NSLayoutConstraint *card3Height = [_sectorCard3.heightAnchor constraintEqualToAnchor:_sectorCard1.heightAnchor]; - [NSLayoutConstraint activateConstraints:@[card3Top, card3Left, card3Right, card3Height]]; - - // 股票容器 - NSLayoutConstraint *stockTop = [_stockContainer.topAnchor constraintEqualToAnchor:_sectorCard1.bottomAnchor constant:20]; - NSLayoutConstraint *stockLeft = [_stockContainer.leadingAnchor constraintEqualToAnchor:self.view.leadingAnchor]; - NSLayoutConstraint *stockRight = [_stockContainer.trailingAnchor constraintEqualToAnchor:self.view.trailingAnchor]; - NSLayoutConstraint *stockBottom = [_stockContainer.bottomAnchor constraintEqualToAnchor:self.view.bottomAnchor]; - [NSLayoutConstraint activateConstraints:@[stockTop, stockLeft, stockRight, stockBottom]]; - - UILabel *stockTitleLabel = _stockContainer.subviews[0]; - UIButton *stockBtn = _stockContainer.subviews[1]; - - NSLayoutConstraint *stockTitleTop = [stockTitleLabel.topAnchor constraintEqualToAnchor:_stockContainer.topAnchor constant:15]; - NSLayoutConstraint *stockTitleLeft = [stockTitleLabel.leadingAnchor constraintEqualToAnchor:_stockContainer.leadingAnchor constant:15]; - - NSLayoutConstraint *stockBtnTop = [stockBtn.centerYAnchor constraintEqualToAnchor:stockTitleLabel.centerYAnchor]; - NSLayoutConstraint *stockBtnRight = [stockBtn.trailingAnchor constraintEqualToAnchor:_stockContainer.trailingAnchor constant:-15]; - - [NSLayoutConstraint activateConstraints:@[stockTitleTop, stockTitleLeft, stockBtnTop, stockBtnRight]]; - - // 股票表头 - NSLayoutConstraint *headerTop = [_stockHeaderView.topAnchor constraintEqualToAnchor:stockTitleLabel.bottomAnchor constant:10]; - NSLayoutConstraint *headerLeft = [_stockHeaderView.leadingAnchor constraintEqualToAnchor:_stockContainer.leadingAnchor]; - NSLayoutConstraint *headerRight = [_stockHeaderView.trailingAnchor constraintEqualToAnchor:_stockContainer.trailingAnchor]; - NSLayoutConstraint *headerHeight = [_stockHeaderView.heightAnchor constraintEqualToConstant:30]; - [NSLayoutConstraint activateConstraints:@[headerTop, headerLeft, headerRight, headerHeight]]; - - // 股票列表 - NSLayoutConstraint *tableTop = [_stockTableView.topAnchor constraintEqualToAnchor:_stockHeaderView.bottomAnchor]; - NSLayoutConstraint *tableLeft = [_stockTableView.leadingAnchor constraintEqualToAnchor:_stockContainer.leadingAnchor]; - NSLayoutConstraint *tableRight = [_stockTableView.trailingAnchor constraintEqualToAnchor:_stockContainer.trailingAnchor]; - NSLayoutConstraint *tableBottom = [_stockTableView.bottomAnchor constraintEqualToAnchor:_stockContainer.bottomAnchor]; - [NSLayoutConstraint activateConstraints:@[tableTop, tableLeft, tableRight, tableBottom]]; -} - -#pragma mark - UITableView -- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { - return 4; -} - -- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { - UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"StockCell" forIndexPath:indexPath]; - cell.backgroundColor = [UIColor blackColor]; - cell.selectionStyle = UITableViewCellSelectionStyleNone; - - // 清空复用内容 - [cell.contentView.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)]; - - NSArray *stocks = @[ - @{@"name":@"PEGASUS HEIGHTS BERHAD", @"code":@"4464", @"price":@"0.010", @"value2":@"100.000%"}, - @{@"name":@"SMTRACK BERHAD", @"code":@"0169", @"price":@"0.010", @"value2":@"100.000%"}, - @{@"name":@"TXCD BERHAD - ICPS 2020/2030", @"code":@"7145PA", @"price":@"0.020", @"value2":@"33.333%"}, - @{@"name":@"DNONCE TECHNOLOGY BHD", @"code":@"7114", @"price":@"0.040", @"value2":@"33.333%"} - ]; - NSDictionary *stock = stocks[indexPath.row]; - - // 名称 - UILabel *nameLabel = [[UILabel alloc] init]; - nameLabel.text = stock[@"name"]; - nameLabel.textColor = [UIColor whiteColor]; - nameLabel.font = [UIFont systemFontOfSize:14]; - nameLabel.numberOfLines = 1; - nameLabel.lineBreakMode = NSLineBreakByTruncatingTail; - nameLabel.translatesAutoresizingMaskIntoConstraints = NO; - [cell.contentView addSubview:nameLabel]; - - // 代码 - UILabel *codeLabel = [[UILabel alloc] init]; - codeLabel.text = stock[@"code"]; - codeLabel.textColor = [UIColor lightGrayColor]; - codeLabel.font = [UIFont systemFontOfSize:12]; - codeLabel.translatesAutoresizingMaskIntoConstraints = NO; - [cell.contentView addSubview:codeLabel]; - - // 价格 - UILabel *priceLabel = [[UILabel alloc] init]; - priceLabel.text = stock[@"price"]; - priceLabel.textColor = [UIColor greenColor]; - priceLabel.font = [UIFont systemFontOfSize:14]; - priceLabel.textAlignment = NSTextAlignmentRight; - priceLabel.translatesAutoresizingMaskIntoConstraints = NO; - [cell.contentView addSubview:priceLabel]; - - // 涨幅 - UILabel *value2Label = [[UILabel alloc] init]; - value2Label.text = stock[@"value2"]; - value2Label.textColor = [UIColor greenColor]; - value2Label.font = [UIFont systemFontOfSize:14]; - value2Label.textAlignment = NSTextAlignmentRight; - value2Label.translatesAutoresizingMaskIntoConstraints = NO; - [cell.contentView addSubview:value2Label]; - - // 约束 - [NSLayoutConstraint activateConstraints:@[ - [nameLabel.leadingAnchor constraintEqualToAnchor:cell.contentView.leadingAnchor constant:15], - [nameLabel.topAnchor constraintEqualToAnchor:cell.contentView.topAnchor constant:10], - [nameLabel.trailingAnchor constraintLessThanOrEqualToAnchor:priceLabel.leadingAnchor constant:-10], - - [codeLabel.leadingAnchor constraintEqualToAnchor:cell.contentView.leadingAnchor constant:15], - [codeLabel.topAnchor constraintEqualToAnchor:nameLabel.bottomAnchor constant:5], - - [priceLabel.widthAnchor constraintEqualToConstant:60], - [priceLabel.trailingAnchor constraintEqualToAnchor:value2Label.leadingAnchor constant:-10], - [priceLabel.centerYAnchor constraintEqualToAnchor:cell.contentView.centerYAnchor], - - [value2Label.widthAnchor constraintEqualToConstant:80], - [value2Label.trailingAnchor constraintEqualToAnchor:cell.contentView.trailingAnchor constant:-15], - [value2Label.centerYAnchor constraintEqualToAnchor:cell.contentView.centerYAnchor] - ]]; - - return cell; -} - -- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { - return 60; -} - -@end