最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2021年06月16日 09:53:03   作者:shuzhi57  
這篇文章主要為大家詳細介紹了iOS按比例實現(xiàn)方塊圖,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例為大家分享了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

效果圖:

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

您可能感興趣的文章:

相關(guān)文章

  • iOS中遍歷的方法總結(jié)

    iOS中遍歷的方法總結(jié)

    本篇文章主要介紹了iOS中遍歷的方法總結(jié),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-04-04
  • iOS中實現(xiàn)imageView任意角度旋轉(zhuǎn)的方法

    iOS中實現(xiàn)imageView任意角度旋轉(zhuǎn)的方法

    這篇文章主要給大家介紹了關(guān)于iOS中實現(xiàn)imageView任意角度旋轉(zhuǎn)的方法,文中通過示例代碼介紹的非常詳細,對大家學習或者工作具有一定的參考學習價值,需要的朋友下面隨著小編來一起學習學習吧。
    2017-12-12
  • iOS開發(fā)中UITabBarController的使用示例

    iOS開發(fā)中UITabBarController的使用示例

    這篇文章主要介紹了iOS開發(fā)中UITabBarController的使用示例,代碼基于Objective-C進行演示,需要的朋友可以參考下
    2015-09-09
  • iOS把圖片緩存到本地的幾種方法(總結(jié))

    iOS把圖片緩存到本地的幾種方法(總結(jié))

    下面小編就為大家分享一篇iOS把圖片緩存到本地的幾種方法總結(jié),具有很的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2017-12-12
  • iOS實現(xiàn)無限滑動效果

    iOS實現(xiàn)無限滑動效果

    這篇文章主要為大家詳細介紹了iOS實現(xiàn)無限滑動效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • ios設(shè)計模式--委托模式

    ios設(shè)計模式--委托模式

    這篇文章主要介紹了ios設(shè)計模式中的委托模式,希望對大家學習ios框架有所幫助,下面讓我們一起來了解一下吧
    2023-03-03
  • 詳解iOS應(yīng)用開發(fā)中Core Data數(shù)據(jù)存儲的使用

    詳解iOS應(yīng)用開發(fā)中Core Data數(shù)據(jù)存儲的使用

    這篇文章主要介紹了iOS應(yīng)用開發(fā)中Core Data數(shù)據(jù)存儲的使用,Core Data可以看作是一個內(nèi)嵌型數(shù)據(jù)庫SQLite的iOS專用版本,需要的朋友可以參考下
    2016-02-02
  • iPhone/iPad開發(fā)通過LocalNotification實現(xiàn)iOS定時本地推送功能

    iPhone/iPad開發(fā)通過LocalNotification實現(xiàn)iOS定時本地推送功能

    這篇文章主要介紹了iPhone/iPad開發(fā)之通過LocalNotification實現(xiàn)iOS定時本地推送功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • iOS逆向教程之跟蹤函數(shù)調(diào)用詳解

    iOS逆向教程之跟蹤函數(shù)調(diào)用詳解

    這篇文章主要給大家介紹了關(guān)于iOS逆向教程之跟蹤函數(shù)調(diào)用的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。
    2018-04-04
  • 個人對于異步和多線程的關(guān)系的理解分享

    個人對于異步和多線程的關(guān)系的理解分享

    異步和多線程并不是一個同等關(guān)系,異步是最終目的,多線程只是我們實現(xiàn)異步的一種手段。異步是當一個調(diào)用請求發(fā)送給被調(diào)用者,而調(diào)用者不用等待其結(jié)果的返回而可以做其它的事情。
    2014-08-08

最新評論

唐河县| 来凤县| 若羌县| 全州县| 鄢陵县| 北碚区| 西峡县| 乳源| 勐海县| 定南县| 武陟县| 普陀区| 叶城县| 内乡县| 汝州市| 福贡县| 静乐县| 旺苍县| 盐山县| 胶州市| 甘德县| 措勤县| 巧家县| 合山市| 潮州市| 达州市| 南乐县| 双牌县| 松滋市| 抚顺市| 永登县| 那曲县| 安庆市| 黄山市| 林周县| 舒城县| 元阳县| 龙游县| 清原| 会东县| 屏南县|