UICollectionView實現書本翻頁布局

2021-09-30 12:31:26 字數 3628 閱讀 6323

效果圖:

//初始化

- (instancetype)initwithframe:(cgrect)frame

return self;

}//預設自定義布局,布局圓角 和 中心線

//判斷cell的奇數偶數

if (layoutattributes.indexpath.item % 2 == 0) else

//圓角設定

uirectcorner corner = isrightpage ? uirectcornertopright | uirectcornerbottomright : uirectcornertopleft | uirectcornerbottomleft;

uibezierpath *bezier = [uibezierpath bezierpathwithroundedrect:self.b**iew.bounds byroundingcorners:corner cornerradii:cgsizemake(16, 16)];

//cashapelayer: 通過給定的貝塞爾曲線uibezierpath,在空間中作圖

cashapelayer *masklayer = [[cashapelayer alloc] init];

masklayer.frame = self.b**iew.bounds;

masklayer.path = bezier.cgpath;

self.b**iew.layer.mask = masklayer;

self.b**iew.clipstobounds = yes;

}@end

新建乙個

booklayout 布局類,繼承自

uicollectionviewlayout ,在這裡我們將實現關鍵的3個必須實現的布局方法:

1. preparelayout

2. collectionviewcontentsize

3.  layoutattributesforelementsinrect

關鍵思想,是在 layoutattributesforitematindexpath 方法中,實現空間布局,考慮到frame的變化,旋轉角度和旋轉比例的變化,以及cell的frame變化後,anchor點的重新設定等;

#import "booklayout.h"

@implementation booklayout

//定義cell的尺寸

static cgfloat pagewidth = 180;

static cgfloat pageheight = 280;

static cgfloat numberofpages = 0; //定義總的cell個數

- (void)preparelayout

//布局實時更新

- (bool)shouldinvalidatelayoutforboundschange:(cgrect)newbounds

//內容滾動區域設定

- (cgsize)collectionviewcontentsize

//每個cell的布局設定

- (uicollectionviewlayoutattributes *)layoutattributesforitematindexpath:(nsindexpath *)indexpath else if (ratio < -0.5)

//if ((ratio > 0 && indexpath.item % 2 == 1) || (ratio < 0 && indexpath.item % 2 == 0))

}//計算旋轉角度angle,設定3d旋轉

cgfloat newratio = min(max(ratio, -1), 1);

//計算m34

catransform3d transform = catransform3didentity;

transform.m34 = 1.0 / - 2000;

cgfloat angle = 0.0f;

if (indexpath.item % 2 == 0) else if (indexpath.item % 2 == 1)

angle += (indexpath.row % 2) / 1000;

transform = catransform3drotate(transform, angle, 0, 1, 0);

layoutattributes.transform3d = transform;

if (indexpath.row == 0)

return layoutattributes;

}//所有cell布局陣列

- (nsarray *)layoutattributesforelementsinrect:(cgrect)rect

}return array;

}@end

當布局完成後,我們就大功告成了,在

uicollectionview 中,實現**和資料來源就ok了

#import "bookview.h"

#import "bookcell.h"

#import "booklayout.h"

@implementation bookview

static nsstring *const reuseidentifier = @"cell";

- (instancetype)initwithframe:(cgrect)frame collectionviewlayout:(uicollectionviewlayout *)layout

return self;

}- (nsinteger)collectionview:(uicollectionview *)collectionview numberofitemsinsection:(nsinteger)section

- (uicollectionviewcell *)collectionview:(uicollectionview *)collectionview cellforitematindexpath:(nsindexpath *)indexpath

@end

#import "viewcontroller.h"

#import "bookview.h"

#import "booklayout.h"

#define kscreenwidth [uiscreen mainscreen].bounds.size.width

#define kscreenheight [uiscreen mainscreen].bounds.size.height

@inte***ce viewcontroller ()

@end

@implementation viewcontroller

- (void)viewdidload

@end

是不是感覺不可思議!

unity 製作書本 翻頁效果

unity 製作書籍翻頁效果 unity c 翻書效果 2d 真實翻頁 不使用外掛程式 自製 實現思路 將書本分為兩邊,一邊乙個翻頁實現 下圖為書本的右面,以oa為分界線,oab是下一面的如上圖的左下角,oac是下一面的如上圖的右下角 利用unity的mask可以實現,也就是,假設這一頁是1 左邊那...

UICollectionView自定義布局

這個和 uitableview 在用法上大體上差不多這裡只說明一下 uicollectionview 的布局。demo 這種布局方式是一種線性布局,他會先按照你設定的要求鋪慢一行,當不滿足指定條件的時候,會換行。我們可以通過 uicollectionviewdelegateflowlayout 來控...

UICollectionView自定義布局(二)

自定義布局 將該動畫分解,首先實現如下圖所示的效果。隨著collectionview的滑動,itermcell的frame的變化如下圖所示 itermcell分為三種型別 featuredcell 突出顯示的cell,高度為featuredheight。standardcell 標準狀態下的cell...