电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

iOS按比例實現(xiàn)方塊圖

瀏覽:3日期:2022-09-16 15:43:49

本文實例為大家分享了iOS按比例實現(xiàn)方塊圖的具體代碼,供大家參考,具體內(nèi)容如下

原理:二分法遞歸實現(xiàn),就是每次“對半分”,分到只剩兩個

上代碼:SZBlockView

@interface SZBlockView : UIView@property (nonatomic, strong) NSArray *data;//數(shù)據(jù)源@end #import 'SZBlockView.h'#import 'SZItemView.h' @implementation SZBlockView - (instancetype)initWithFrame:(CGRect)frame{ self = [super initWithFrame:frame]; if (self) {self.backgroundColor = UIColor.whiteColor; } return self;} -(void)setData:(NSArray *)data{ _data = data; [self removeAll]; for (NSString* value in data) {[self addSubNode:[value intValue]]; } [self recalcLayout];} -(void)addSubNode:(int)value{ SZItemView* item = [SZItemView new]; item.value = value; [self addSubview:item];} -(void)removeAll{ //移除所有子視圖 [self.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];} -(bool)isVertical:(double)w Height:(double) h{ return w / h > 1.618;//黃金比例,可以自己根據(jù)需求修改} -(void)recalcLayout{ if (self.subviews.count < 1) return; [self recalcSquarifiedLayout:0 Finish:self.subviews.count - 1 Area:self.bounds];} -(void)recalcSliceLayout:(NSUInteger)nStart Finish:(NSUInteger)nFinish Area:(CGRect)rect IsVertical:(bool) bIsVertical{ NSAssert(nStart < self.subviews.count, @'nStart >= self.subviews.count'); NSAssert(nFinish < self.subviews.count, @'nFinish >= self.subviews.count'); if (nStart == nFinish) {[self.subviews[nStart] setFrame:rect];return; } double dblTotal = [self getChildrenTotal:nStart Finish:nFinish]; double x = rect.origin.x; double y = rect.origin.y; if (bIsVertical) {for (NSUInteger i = nStart; i <= nFinish; i++){ SZItemView* item = self.subviews[i]; double cx = rect.size.width * item.value / dblTotal; CGRect rectSubNode = item.frame; rectSubNode = rect; rectSubNode.origin.x = x; if (i == nFinish) {rectSubNode.size.width = cx; }else{rectSubNode.size.width = cx-1; }item.frame = rectSubNode;x += cx;} } else {for (NSUInteger i = nStart; i <= nFinish; i++){ SZItemView* item = self.subviews[i]; double cy = rect.size.height * item.value / dblTotal; CGRect rectSubNode = item.frame; rectSubNode = rect; rectSubNode.origin.y = y; if (i==nFinish) {rectSubNode.size.height = cy; }else{rectSubNode.size.height = cy-1; }item.frame = rectSubNode; y += cy;} }} -(void)recalcSquarifiedLayout:(NSUInteger)nStart Finish:(NSUInteger)nFinish Area:(CGRect) rect{ NSAssert(nStart < self.subviews.count, @'nStart >= self.subviews.count'); NSAssert(nFinish < self.subviews.count, @'nFinish >= self.subviews.count'); if (nStart + 2 > nFinish) {return [self recalcSliceLayout:nStart Finish:nFinish Area:rect IsVertical:[self isVertical:rect.size.width Height:rect.size.height]]; } double total = [self getChildrenTotal:nStart Finish:nFinish],total_left = 0.; for (NSUInteger i = nStart; i <= nFinish; i++) {SZItemView* item = self.subviews[i];double pre_dt = total_left - total / 2;total_left += item.value;double dt = total_left - total / 2; if (dt > 0){ if (dt + pre_dt > 0) {total_left -= item.value;i--; } if ([self isVertical:rect.size.width Height:rect.size.height]) {CGRect rectLeft = rect;rectLeft.size.width = rect.size.width * total_left / total - 1;[self recalcSquarifiedLayout:nStart Finish:i Area:rectLeft]; CGRect rectRight = rect;rectRight.origin.x = rectLeft.origin.x + rectLeft.size.width + 1;rectRight.size.width = rect.size.width - rectLeft.size.width - 1;[self recalcSquarifiedLayout:i + 1 Finish:nFinish Area:rectRight]; } else {CGRect rectTop = rect;rectTop.size.height = rect.size.height * total_left / total - 1;[self recalcSquarifiedLayout:nStart Finish:i Area:rectTop]; CGRect rectBottom = rect;rectBottom.origin.y = rectTop.origin.y + rectTop.size.height + 1;rectBottom.size.height = rect.size.height - rectTop.size.height - 1;[self recalcSquarifiedLayout:i + 1 Finish:nFinish Area:rectBottom]; } return;} } // NSAssert(false, @'unreachable');} -(double)getChildrenTotal:(NSUInteger)nStart Finish:(NSUInteger) nFinish{ double dblTotal = 0.; for (NSUInteger i = nStart; i <= nFinish; i++) {SZItemView* item = self.subviews[i];dblTotal += item.value; } return dblTotal;} @end

SZItemView 里面的每一個小的視圖

@interface SZItemView : UIView@property (nonatomic, assign) int value;//傳入要顯示的值@end #import 'SZItemView.h'@interface SZItemView ()@property (nonatomic, strong) UILabel *valueLabel;@end @implementation SZItemView - (instancetype)init{ self = [super init]; if (self) {[self setupUI]; } return self;}-(void)setupUI{ UILabel *valueLabel = [[UILabel alloc] initWithFrame:self.frame]; valueLabel.adjustsFontSizeToFitWidth = YES; self.valueLabel = valueLabel; valueLabel.textAlignment = NSTextAlignmentCenter; valueLabel.textColor = UIColor.whiteColor; [self addSubview:valueLabel];} - (void)setValue:(int)value{ _value = value; self.valueLabel.text = [NSString stringWithFormat:@'%d',value]; self.backgroundColor = UIColor.orangeColor;}- (void)layoutSubviews{//如果用masonry布局此方法可不實現(xiàn) self.valueLabel.frame = self.bounds; self.valueLabel.adjustsFontSizeToFitWidth = YES;}@end

效果圖:

iOS按比例實現(xiàn)方塊圖

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標簽: IOS
相關(guān)文章:
主站蜘蛛池模板: 酒精检测棒,数显温湿度计,酒安酒精测试仪,酒精检测仪,呼气式酒精检测仪-郑州欧诺仪器有限公司 | 专业深孔加工_东莞深孔钻加工_东莞深孔钻_东莞深孔加工_模具深孔钻加工厂-东莞市超耀实业有限公司 | 升降机-高空作业车租赁-蜘蛛车-曲臂式伸缩臂剪叉式液压升降平台-脚手架-【普雷斯特公司厂家】 | 电缆故障测试仪_电缆故障定位仪_探测仪_检测仪器_陕西意联电气厂家 | 汽车水泵_汽车水泵厂家-瑞安市骏迪汽车配件有限公司 | EDLC超级法拉电容器_LIC锂离子超级电容_超级电容模组_软包单体电容电池_轴向薄膜电力电容器_深圳佳名兴电容有限公司_JMX专注中高端品牌电容生产厂家 | 琉璃瓦-琉璃瓦厂家-安徽盛阳新型建材科技有限公司 | 南京PVC快速门厂家南京快速卷帘门_南京pvc快速门_世界500强企业国内供应商_南京美高门业 | 游泳池设备安装工程_恒温泳池设备_儿童游泳池设备厂家_游泳池水处理设备-东莞市君达泳池设备有限公司 | 污水/卧式/潜水/钻井/矿用/大型/小型/泥浆泵,价格,参数,型号,厂家 - 安平县鼎千泵业制造厂 | 肉嫩度仪-凝胶测试仪-国产质构仪-气味分析仪-上海保圣实业发展有限公司|总部 | 无硅导热垫片-碳纤维导热垫片-导热相变材料厂家-东莞市盛元新材料科技有限公司 | 专注氟塑料泵_衬氟泵_磁力泵_卧龙泵阀_化工泵专业品牌 - 梭川泵阀 | 防腐木批发价格_深圳_惠州_东莞防腐木厂家_森源(深圳)防腐木有限公司 | 背压阀|减压器|不锈钢减压器|减压阀|卫生级背压阀|单向阀|背压阀厂家-上海沃原自控阀门有限公司 本安接线盒-本安电路用接线盒-本安分线盒-矿用电话接线盒-JHH生产厂家-宁波龙亿电子科技有限公司 | 济南网站建设|济南建网站|济南网站建设公司【济南腾飞网络】【荐】 | 重庆LED显示屏_显示屏安装公司_重庆LED显示屏批发-彩光科技公司 重庆钣金加工厂家首页-专业定做监控电视墙_操作台 | 气动隔膜阀_气动隔膜阀厂家_卫生级隔膜阀价格_浙江浙控阀门有限公司 | 【连江县榕彩涂料有限公司】官方网站 | 浇钢砖,流钢砖_厂家价低-淄博恒森耐火材料有限公司 | 深圳美安可自动化设备有限公司,喷码机,定制喷码机,二维码喷码机,深圳喷码机,纸箱喷码机,东莞喷码机 UV喷码机,日期喷码机,鸡蛋喷码机,管芯喷码机,管内壁喷码机,喷码机厂家 | 钛板_钛管_钛棒_钛盘管-无锡市盛钛科技有限公司 | 高压油管,液压接头,液压附件-烟台市正诚液压附件 | 细砂提取机,隔膜板框泥浆污泥压滤机,螺旋洗砂机设备,轮式洗砂机械,机制砂,圆锥颚式反击式破碎机,振动筛,滚筒筛,喂料机- 上海重睿环保设备有限公司 | 湿地保护| 口信网(kousing.com) - 行业资讯_行业展会_行业培训_行业资料 | 新密高铝耐火砖,轻质保温砖价格,浇注料厂家直销-郑州荣盛窑炉耐火材料有限公司 | 婚博会2024时间表_婚博会门票领取_婚博会地址-婚博会官网 | 铁素体测量仪/检测仪/铁素体含量测试仪-苏州圣光仪器有限公司 | 海南在线 海南一家| 气力输送设备_料封泵_仓泵_散装机_气化板_压力释放阀-河南锐驰机械设备有限公司 | 卸料器-卸灰阀-卸料阀-瑞安市天蓝环保设备有限公司 | 玖容气动液压设备有限公司-气液增压缸_压力机_增压机_铆接机_增压器 | 优考试_免费在线考试系统_培训考试系统_题库系统_组卷答题系统_匡优考试 | China plate rolling machine manufacturer,cone rolling machine-Saint Fighter | 管理会计网-PCMA初级管理会计,中级管理会计考试网站 | 扫地车厂家-山西洗地机-太原电动扫地车「大同朔州吕梁晋中忻州长治晋城洗地机」山西锦力环保科技有限公司 | 高扬程排污泵_隔膜泵_磁力泵_节能自吸离心水泵厂家-【上海博洋】 | 讲师宝经纪-专业培训机构师资供应商_培训机构找讲师、培训师、讲师经纪就上讲师宝经纪 | 智能气瓶柜(大型气瓶储存柜)百科 | 磁力抛光研磨机_超声波清洗机厂家_去毛刺设备-中锐达数控 |