iphone开发之我也做瀑布流

本文介绍了一种使用iOS开发实现瀑布流布局的方法。通过自定义视图控制器并利用SBJSON解析JSON数据,实现了动态加载图片的功能。文章详细展示了如何计算图片位置以达到瀑布流效果。

b&h&i&p 走个人的道路,接私活,网站建设app开发

最近学习IPHONE开发,很喜欢购物APP的瀑布流于是自己做了一个,结合网上的JSON数据,异步加载,在这里和大家分享一下

首先是头文件

waterfall.h

#import <Foundation/Foundation.h>
#import "QuartzCore/QuartzCore.h"
#import "../SBJSON/SBJson.h"
#import "EGOImageView.h"


@interface waterFall : NSObject


@property NSString *DataFromServer;
@property NSArray *imageWidths;
@property NSArray *imageHeights;
@property NSArray *imageSources;


@property float topDistance;
@property float rowWidth;
@property float rowDistance;
@property float fallHeight;


@property float itemOriginY_1st; //第一列高度
@property float itemOriginY_2nd; //第二列高度
@property float itemOriginY_3rd; //第三列高度


@property float itemOriginX_1st;
@property float itemOriginX_2nd;
@property float itemOriginX_3rd;


@property UIView *fall;


-(UIView *)createWaterFall:(NSArray *)imageSrc;
-(float)getFallHeigth;
-(void)addWaterFall;


@end


waterfall.m  主要是createWaterFall,addWaterFall基本和createWaterFall差不多


-(UIView *)createWaterFall:(NSArray *)imageSrc{
    
    [self setRowWidth:100];
    [self setRowDistance:5];
    [self setItemOriginY_1st:3];
    [self setItemOriginY_2nd:3];
    [self setItemOriginY_3rd:3];
    [self setItemOriginX_1st:rowDistance];
    [self setItemOriginX_2nd:itemOriginX_1st+rowWidth+rowDistance];
    [self setItemOriginX_3rd:itemOriginX_2nd+rowWidth+rowDistance];
    
    UIView *view = [[UIView alloc] init];
    float _fallHeight = 0;
    
    [self setDataFromServer:[self getHttpRequst]];
    [self initTableviewValueFromJSONData];
    
    for (int i=0; i<self.imageWidths.count; i++) {
        
        float minHeightItem = 0;
        float imageX = 0;
        float imageY = 0;
        
        
        float changedHeight = 0;
        changedHeight = rowWidth*[[self.imageHeights objectAtIndex:i] intValue]/[[self.imageWidths objectAtIndex:i] intValue] + 3;
        
        minHeightItem = itemOriginY_1st;
        
        if (itemOriginY_1st > itemOriginY_2nd) {
            
            minHeightItem = itemOriginY_2nd;
            imageX = itemOriginX_2nd;
            itemOriginY_2nd = itemOriginY_2nd + changedHeight;
            
        }else if (itemOriginY_1st > itemOriginY_3rd) {
            
            minHeightItem = itemOriginY_3rd;
            imageX = itemOriginX_3rd;
            itemOriginY_3rd = itemOriginY_3rd + changedHeight;
            
        }else {
            
            imageX = itemOriginX_1st;
            itemOriginY_1st = itemOriginY_1st + changedHeight;
        }
        
        imageY = minHeightItem;
        
        EGOImageView *imageView = [[EGOImageView alloc] initWithFrame:CGRectMake(imageX, imageY, rowWidth, changedHeight - 3)];
        [imageView setPlaceholderImage:[UIImage imageNamed:@"images/fall1.jpg"]];
        NSURL *url = [NSURL URLWithString:[self.imageSources objectAtIndex:i]];
        //NSLog([NSString stringWithFormat:@"http://192.168.10.69/fall%d.jpg",i]);
        imageView.imageURL = url;
        
        /*
        UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(imageX, imageY, rowWidth, changedHeight - 3)];
        imageView.image = [UIImage imageNamed:@"images/fall1.jpg"];
        imageView.layer.shadowColor = [UIColor blackColor].CGColor;
        imageView.layer.shadowRadius = 3;
        imageView.layer.shadowOffset = CGSizeMake(0, 0);
        imageView.layer.shadowOpacity = 0.5;
         */
        
        [view addSubview:imageView];
        
        _fallHeight = itemOriginY_1st;
        if (itemOriginY_1st < itemOriginY_2nd) {
            
            _fallHeight = itemOriginY_2nd;
            
        }else if (itemOriginY_1st < itemOriginY_3rd) {
            
            _fallHeight = itemOriginY_3rd;
        }
    }
    
    fallHeight = _fallHeight;
    [self setFall:view];
    
    return fall;
}


组合上SBJSON 的模块基本就OK了。

主要思路:分三列,定义宽度,先读取前三个,按宽度进行长度的缩放,然后判断三列中的长度最短列,再添加的时候添加到该列,如此循环,写的不是很好,各位看客有好的思路和想法,欢迎评论,谢谢 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值