行转列

2019-07-24  本文已影响0人  Leon1024

针对类似 UICollectionView当横向滚动时,显示顺序保持竖向滚动时的排序转换方法

OC


- (void)viewDidLoad {
    [super viewDidLoad];
   // 示例数组
    NSMutableArray *array = [@[] mutableCopy];
    
    for (int i = 0; i < 23; i++) {
        [array addObject:@(i)];
    }
    
    NSArray *list = [self convertSortRowToColumnWithArray:array columns:5 rows:3];
    for (NSNumber *num in list) {
        NSLog(@">>%ld", [num integerValue]);
    }
}

- (NSArray *)convertSortRowToColumnWithArray:(NSArray *)list columns:(NSInteger)column rows:(NSInteger)row {
    if (column < 2 || row < 2 || list.count < 3) {
        return list;
    }
    
    // 分页
    NSInteger count = list.count;
    NSInteger pages = count / (column * row);
    NSInteger remainder = count % (column * row);
    if (remainder) {
        pages += 1;
    }
    
    NSMutableArray *result = [@[] mutableCopy];
    NSInteger length = column * row;
    for (int i = 0; i < pages; i++) {
        
        NSInteger location = i * length;
        if (i == pages - 1) {
            length = count - location;
        }
        NSArray *segment = [list subarrayWithRange:NSMakeRange(location, length)];
        // 重排序
        segment = [self sortByColumnWithArray:segment columns:column rows:row];
        [result addObjectsFromArray:segment];
    }
    
    return [result copy];
}

- (NSArray *)sortByColumnWithArray:(NSArray *)list columns:(NSInteger)column rows:(NSInteger)row {
    NSInteger count = list.count;
    NSMutableArray *array = [@[] mutableCopy];
    
    // 先计算能排多少列
    NSInteger realColumn = count / row;
    NSInteger remainder = count % row;
    if (remainder) {
        realColumn += 1;
    }
    
    for (int i = 0; i < realColumn; i++) {
        NSMutableArray *columnArray = [NSMutableArray arrayWithCapacity:row];
        for (int j = 0; j < row; j++) {
            NSInteger index = i + j * realColumn;
            if (index < count) {
                [columnArray addObject:list[index]];
            }
        }
        [array addObjectsFromArray:columnArray];
    }
    return [array copy];
}

Swift

// 当 UICollectionView 横向分页时,item默认排序是竖向排序,此方法转化为横向排序
    static func convertSortRowToColumn(list: [Any], columns column:Int, rows row:Int) -> [Any] {
        if (column < 2 || row < 2 || list.count < 3) { return list }
        
        // 分页
        let count = list.count;
        var pages = count / (column * row)
        let remainder = count % (column * row)
        if (remainder > 0) { pages += 1 }
        
        var result: [Any] = []
        var length = column * row
        for i in 0..<pages {
            let location = i * length
            if (i == pages - 1) { length = count - location }
            var segment: [Any] = []
            for index in 0..<count {
                if index >= location && index < (location + length) {
                    segment.append(list[index])
                }
            }
            // 重排序
            segment = LENTools.sortByColumn(list: segment, columns: column, rows: row)
            result += segment
        }
        return result
    }
    
    private static func sortByColumn(list: [Any], columns column:Int, rows row:Int) -> [Any] {
        let count = list.count
        var array: [Any] = []
        
        // 先计算能排多少列
        var realColumn = count / row
        let remainder = count % row
        if (remainder > 0) { realColumn += 1 }
        
        for i in 0..<realColumn {
            var columnArray: [Any] = []
            for j in 0..<row {
                let index = i + j * realColumn;
                if (index < count) { columnArray.append(list[index]) }
            }
            array += columnArray
        }
        return array
    }
上一篇下一篇

猜你喜欢

热点阅读