返回顶部
首页 > 资讯 > 移动开发 >iOS按比例实现方块图
  • 906
分享到

iOS按比例实现方块图

iOS方块图 2022-06-02 18:06:34 906人浏览 薄情痞子
摘要

本文实例为大家分享了iOS按比例实现方块图的具体代码,供大家参考,具体内容如下 原理:二分法递归实现,就是每次“对半分”,分到只剩两个 上代码:SZBlockView 

本文实例为大家分享了iOS按比例实现方块图的具体代码,供大家参考,具体内容如下

原理:二分法递归实现,就是每次“对半分”,分到只剩两个

上代码:SZBlockView 


@interface SZBlockView : UIView
@property (nonatomic, strong) NSArray *data;//数据源
@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;//黄金比例,可以自己根据需求修改
}
 
-(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布局此方法可不实现
    self.valueLabel.frame = self.bounds;
    self.valueLabel.adjustsFontSizeToFitWidth = YES;
}
@end

效果图:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。

--结束END--

本文标题: iOS按比例实现方块图

本文链接: https://lsjlt.com/news/30533.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • iOS按比例实现方块图
    本文实例为大家分享了iOS按比例实现方块图的具体代码,供大家参考,具体内容如下 原理:二分法递归实现,就是每次“对半分”,分到只剩两个 上代码:SZBlockView  ...
    99+
    2022-06-02
    iOS 方块图
  • iOS实现圆环比例图
    本文实例为大家分享了iOS实现圆环比例图的具体代码,供大家参考,具体内容如下 实现效果 实现方法 SSTCircleProgressView  @interfac...
    99+
    2022-05-16
    iOS 比例图
  • Java实现按比例缩小图片
    本文实例为大家分享了Java实现按比例缩小图片的具体代码,供大家参考,具体内容如下 使用spring注解上传文件@RequestParam(value="", r...
    99+
    2024-04-02
  • Java怎么实现按比例缩小图片
    这篇文章主要讲解了“Java怎么实现按比例缩小图片”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java怎么实现按比例缩小图片”吧!使用spring注解上传文件@RequestParam(v...
    99+
    2023-06-30
  • Android开发之imageView图片按比例缩放的实现方法
    本文实例讲述了Android开发之imageView图片按比例缩放的实现方法。分享给大家供大家参考,具体如下: android:scaleType可控制图片的缩放方式,示例代码...
    99+
    2022-06-06
    方法 android开发 Android
  • vue利用插件实现按比例切割图片
    本文实例为大家分享了vue利用插件实现按比例切割图片的具体代码,供大家参考,具体内容如下 1.使用插件——vueCropper 安装该插件:npm install vue-cropp...
    99+
    2024-04-02
  • iOS实现悬浮按钮
    前言 开发中会遇到有悬浮按钮功能。 效果 上代码 SuspensionButton.h #import <UIKit/UIKit.h> NS_ASSUME_NON...
    99+
    2022-06-04
    iOS 按钮
  • css怎么实现改变图片大小按比例缩放
    本篇内容介绍了“css怎么实现改变图片大小按比例缩放”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!首先,在页面中创建一个img标签,并插入图...
    99+
    2023-07-04
  • PythonPIL图片如何按比例裁剪
    目录PIL图片如何按比例裁剪问题描述解决方案PIL调整图片大小介绍看代码吧PIL图片如何按比例裁剪 问题描述 如图片比例为 1:1 裁剪为 4:3 1.jpg 解决方案 from ...
    99+
    2024-04-02
  • iOS实现全局悬浮按钮
    本文实例为大家分享了iOS实现全局悬浮按钮的具体代码,供大家参考,具体内容如下 现在有很多app都做这个全局按钮 如上面两张图的效果,完成一个全局悬浮的按钮,而且不会划出屏幕外既然...
    99+
    2024-04-02
  • Python PIL图片怎么按比例裁剪
    这篇文章主要介绍“Python PIL图片怎么按比例裁剪”,在日常操作中,相信很多人在Python PIL图片怎么按比例裁剪问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python&nb...
    99+
    2023-06-30
  • iOS中UIBezierPath实现饼状图的方法
    这篇文章主要介绍iOS中UIBezierPath实现饼状图的方法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!首先看效果图:代码:#import <UIKit/UIKit.h> NS_...
    99+
    2023-06-14
  • iOS webview捕获H5按钮方法示例代码
    前言 本文主要给大家介绍了关于iOS webview捕获H5按钮的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧 方法如下: 实现iOS webview捕获...
    99+
    2022-05-29
    ios webview h5
  • iOS UIBezierPath实现饼状图
    本文实例为大家分享了iOS UIBezierPath实现饼状图的具体代码,供大家参考,具体内容如下 首先看效果图: 代码: #import <UIKit/UIKit.h&...
    99+
    2022-06-05
    iOS 饼状图
  • Android编程实现等比例显示图片的方法
    本文实例讲述了Android编程实现等比例显示图片的方法。分享给大家供大家参考,具体如下: 在android中,由于密度的影响,如果想得到图片的宽高是不行的,具体为什么我就大概...
    99+
    2022-06-06
    方法 图片 Android
  • iOS如何实现全局悬浮按钮
    这篇文章给大家分享的是有关iOS如何实现全局悬浮按钮的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。具体内容如下现在有很多app都做这个全局按钮如上面两张图的效果,完成一个全局悬浮的按钮,而且不会划出屏幕外既然是全...
    99+
    2023-06-29
  • C++中地图按键排序实现示例
    目录正文创建过程中的排序创建升序创建降序生成一个范围的降序通过键比较两个元素key_compare key_comp() constvalue_compare value_comp(...
    99+
    2024-04-02
  • IOS 图片存放3种方式的实现
    Image.xcassets 创建 .xcassets,以 Image Set 形式管理图片,添加图片后会生成对应的 content.json 文件 加入 @2x 和 @3...
    99+
    2022-06-03
    IOS 图片存放
  • dedecms 5.6 缩略图按大小比例缩小裁剪
    这样的话,如果图片的宽高比例不合适,那么缩略图将会被压缩得很不好看,在这里,我是先对图片进行按宽或高进行放缩,超过缩略图大小的部分再进行裁剪,这样生成的缩略图的显示效果要比原来的要好得多了。 于是重新修改了一下DEDEc...
    99+
    2022-06-12
    dedecms 缩略图 比例缩小
  • css如何改变图片大小按比例缩放
    在css中设置图片大小按比例缩放的方法:1.首先,创建img标签,插入图片;2.使用width和height属性设置图片大小按比例缩放;在css中设置图片大小按比例缩放的方法首先,在页面中创建一个img标签,并插入图片;<!DOCTY...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作