【iOS】關於 UICollectionView 的自定義佈局
閒來沒事,做了個 UICollectionView 的圓形佈局,效果圖如下
#控制器程式碼如下
//
// ViewController.m
// CollectionViewTest
//
// Created by 黃瑞 on 2017/5/24.
// Copyright © 2017年 CoderHuang. All rights reserved.
//
#import "ViewController.h"
#import "MyLayout.h"
#import "MyCollectionView.h"
@interface ViewController () <UICollectionViewDelegate, UICollectionViewDataSource>
{
NSInteger count;
}
@property (weak, nonatomic) IBOutlet UICollectionView *collectionView;
// 方塊個數
@property (weak, nonatomic) IBOutlet UISlider *countSlider;
// 起始位置
@property (weak, nonatomic) IBOutlet UISlider *originSlider;
// 方塊個數Label
@property (weak, nonatomic) IBOutlet UILabel *countLabel;
// 顏色陣列
@property (nonatomic, strong) NSArray <UIColor *> *colors;
@end
@implementation ViewController
#pragma mark - View did load
- (void)viewDidLoad {
[super viewDidLoad];
count = (NSInteger)self.countSlider.value;
self.countLabel.text = [NSString stringWithFormat:@"%ld", (long)count];
self.colors = @[
[UIColor redColor],
[UIColor orangeColor],
[UIColor yellowColor],
[UIColor greenColor],
[UIColor blueColor],
[UIColor magentaColor],
[UIColor purpleColor],
];
}
#pragma mark - Slider click
- (IBAction)valueChange:(UISlider *)sender {
if (sender == self.countSlider) {
NSInteger nCount = (NSInteger)self.countSlider.value;
if (nCount != count) {
count = nCount;
self.countLabel.text = [NSString stringWithFormat:@"%ld", (long)count];
[self.collectionView reloadData];
}
} else {
MyLayout *layout = (MyLayout *)self.collectionView.collectionViewLayout;
layout.origin = sender.value;
[self.collectionView reloadData];
}
}
// 和 UITableView 類似,UICollectionView也是有 Section 和 Row 的
#pragma mark - Delegate
#pragma mark - Collection view delegate
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
return count;
}
- (__kindof UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
// 已經在 StoryBoard 中設定了ReuseIdentifier
UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"Cell" forIndexPath:indexPath];
cell.backgroundColor = self.colors[indexPath.row % self.colors.count];
return cell;
}
@end
#StoryBoard
如圖
注意,要將 CollectionView 的 Layout 改為 Custom 然後選擇自定義類 MyLayout,它必須繼承自 UICollectionViewLayout 類。
#MyLayout.h
//
// MyLayout.h
// CollectionViewTest
//
// Created by 黃瑞 on 2017/5/24.
// Copyright © 2017年 CoderHuang. All rights reserved.
//
#import <UIKit/UIKit.h>
@interface MyLayout : UICollectionViewLayout
// 起始的角度
@property (nonatomic, assign) CGFloat origin;
@end
#MyLayout.m
//
// MyLayout.m
// CollectionViewTest
//
// Created by 黃瑞 on 2017/5/24.
// Copyright © 2017年 CoderHuang. All rights reserved.
//
#import "MyLayout.h"
@interface MyLayout ()
{
// item的數量
NSInteger count;
// 圓形佈局的中心
CGPoint center;
// 圓形佈局的半徑
CGFloat radius;
}
@end
@implementation MyLayout
// 重寫父類的四個方法
- (void)prepareLayout {
count = [self.collectionView numberOfItemsInSection:0];
center = CGPointMake(self.collectionView.frame.size.width / 2, self.collectionView.frame.size.height / 2);
radius = 150;
}
// 返回 ContentSize
- (CGSize)collectionViewContentSize {
return self.collectionView.frame.size;
}
// 對於每一個 Item 都有一個 UICollectionViewLayoutAttributes 物件與它對應,這個物件僅僅包含了Item的佈局資訊。
- (NSArray<UICollectionViewLayoutAttributes *> *)layoutAttributesForElementsInRect:(CGRect)rect {
NSMutableArray *arr = [NSMutableArray array];
for (NSInteger i = 0; i < count; i++) {
[arr addObject:[self layoutAttributesForItemAtIndexPath:[NSIndexPath indexPathForRow:i inSection:0]]];
}
return arr;
}
// 根據 indexPath 來建立 Item 的佈局屬性物件
- (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath {
NSLog(@"%s", __func__);
UICollectionViewLayoutAttributes *attr = [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:indexPath];
CGFloat angle = 2 * M_PI / count * indexPath.row + M_PI_2 * self.origin;
CGFloat x = center.x + cos(angle) * radius;
CGFloat y = center.y - sin(angle) * radius;
attr.center = CGPointMake(x, y);
attr.size = CGSizeMake(30, 30);
return attr;
}
@end
相關文章
- UICollectionView自定義佈局(二)UIView
- UICollectionView自定義佈局(一)UIView
- iOS UICollectionView 橫向分頁佈局iOSUIView
- 多佈局的自定義AdapterAPT
- 自定義流式佈局:ViewGroup的測量與佈局View
- 谷歌開發者工具自定義佈局谷歌
- Flutter自定義佈局-CustomMultiChildLayoutFlutter
- 深入解析Android的自定義佈局Android
- UICollectionView左對齊流水佈局、右對齊流水佈局UIView
- Android 自定義氣泡佈局Android
- 自定義佈局管理器-FormLayoutORM
- [iOS]自定義UICollectionView 2-1–CollectionView的實現(定義與初始化)iOSUIView
- iOS 關於viewController自定義的轉場動畫iOSViewController動畫
- CSS關於flex佈局CSSFlex
- Android自定義View(四)側滑佈局AndroidView
- android自定義佈局——城市選擇介面Android
- WPF自定義FixedColumnGrid佈局控制元件控制元件
- 關於flex佈局的應用Flex
- 關於自定義 Alert
- 關於聖盃佈局和雙飛翼佈局
- iOS開發之自定義表情鍵盤(元件封裝與自動佈局)iOS元件封裝
- iOS導航欄佈局相關iOS
- iOS開發之窺探UICollectionViewController(三) :使用UICollectionView自定義瀑布流iOSUIViewController
- 關於rem佈局問題REM
- Swift 專案總結 03 自定義 CollectionView 佈局SwiftView
- objc系列譯文(3.3):自定義Collection View佈局OBJView
- 關於佈局以及rem的小結REM
- 關於響應式佈局,你必須要知道關於響應式佈局的幾件事
- 關於RecyclerView.ItemDecoration的自定義View
- 關於微信小程式佈局排列微信小程式
- [筆記]關於blade佈局的使用筆記
- iOS開發自定義View佈局子控制元件iOSView控制元件
- 關於自定義標籤庫
- android 實現FlowLayout 流線佈局(自定義ViewGroup)AndroidView
- 自定義CollectionView UICollectionViewLayout實現橫向佈局分頁EmojiViewUI
- iOS自定義的PickViewiOSView
- win10桌面佈局設定成自定義_windows10桌面圖示如何自定義Win10Windows
- Android獲取dialog自定義佈局中的控制元件Android控制元件