<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
廢話開篇:利用 CATransform3D 圖形變換及 UIScrollView 的一些方法實現一個六稜柱圖片瀏覽效果
1、在一個基礎 View 上新增六稜柱的六個側面檢視。
2、調整六稜柱的各個側面的旋轉角度及z軸數值。
3、基礎 View 放在 UIScrollView 上,通過監聽 UIScrollView 的滑動來設定基礎 View 的座標x值與與y軸的旋轉角度。
建立 PhotoDrumBrowseView 圖片瀏覽類檢視
#import "PhotoDrumBrowseView.h" @interface PhotoDrumBrowseView()<UIScrollViewDelegate> @property(nonatomic,strong) UIScrollView * baseScrollView; @property(nonatomic,strong) UIView * baseView; @property(nonatomic,assign) CGRect originalBaseViewFrame; @end @implementation PhotoDrumBrowseView - (instancetype)initWithFrame:(CGRect)frame { if (self = [super initWithFrame:frame]) { [self createUI]; [self addDrumBrowseImageView]; } return self; } - (void)createUI{ //捲動檢視其實主要是用來通過位置偏移進行計算旋轉的角度(通過偏移量與總寬度計算旋轉角度與一週2π的比值) self.baseScrollView = [[UIScrollView alloc] initWithFrame:self.bounds]; self.baseScrollView.showsHorizontalScrollIndicator = NO; [self addSubview:self.baseScrollView]; CGFloat cellWidth = self.frame.size.width * 5.0 / 6.0; CGFloat cellHeight = cellWidth / 0.618; //載入六稜柱六個面 self.baseView = [[UIView alloc] initWithFrame:CGRectMake((self.frame.size.width - cellWidth) / 2.0, (self.frame.size.height - cellHeight) * 1 / 3.0, cellWidth, cellHeight)]; self.originalBaseViewFrame = self.baseView.frame; [self.baseScrollView addSubview:self.baseView]; } //建立六稜柱面 - (void)addDrumBrowseImageView{ int num = 6; //一些角度計算 float radian = (M_PI * 2) / num; float cellWidth = self.baseView.frame.size.width / 2.0; float cellHeight = cellWidth / 0.618; //前後z軸偏移值 float needBFOff = cellWidth * sin(radian); //左右x軸偏移值 float needLROff = cellWidth / 2.0 * cos(radian) + cellWidth / 2.0; self.baseScrollView.contentSize = CGSizeMake(self.frame.size.width / 2.0 + self.baseView.frame.size.width * num, 0); self.baseScrollView.delegate = self; for (int i = 0; i < num; i ++) { UIImageView * imageView = [[UIImageView alloc] initWithFrame:CGRectMake((self.baseView.frame.size.width - cellWidth) / 2.0, (self.baseView.frame.size.height - cellHeight) / 2.0, cellWidth, cellHeight)]; imageView.contentMode = UIViewContentModeScaleAspectFill; imageView.clipsToBounds = YES; imageView.image = [UIImage imageNamed:[NSString stringWithFormat:@"fd%d",i % 3 + 1]]; [self.baseView addSubview:imageView]; switch (i) { case 0: { //前左 imageView.layer.transform = CATransform3DTranslate(imageView.layer.transform, -needLROff, 0,needBFOff / 2.0); imageView.layer.transform = CATransform3DRotate(imageView.layer.transform,- radian, 0, 1, 0); } break; case 1: { //前 imageView.layer.transform = CATransform3DTranslate(imageView.layer.transform, 0, 0, needBFOff); } break; case 2: { //前右 imageView.layer.transform = CATransform3DTranslate(imageView.layer.transform, needLROff, 0,needBFOff / 2.0); imageView.layer.transform = CATransform3DRotate(imageView.layer.transform, radian, 0, 1, 0); } break; case 3: { //前右 imageView.layer.transform = CATransform3DTranslate(imageView.layer.transform, needLROff, 0, - needBFOff / 2.0); imageView.layer.transform = CATransform3DRotate(imageView.layer.transform,- radian, 0, 1, 0); } break; case 4: { //後 imageView.layer.transform = CATransform3DTranslate(imageView.layer.transform, 0, 0, - needBFOff); } break; case 5: { //後左 imageView.layer.transform = CATransform3DTranslate(imageView.layer.transform, -needLROff, 0,- needBFOff / 2.0); imageView.layer.transform = CATransform3DRotate(imageView.layer.transform, radian, 0, 1, 0); } break; default: break; } } //同時設定六個面的透視引數 CATransform3D transformPerspective = CATransform3DIdentity; transformPerspective.m34 = -1.0f/800; self.baseView.layer.sublayerTransform = transformPerspective; } #pragma mark - 捲動進行圖形變換 - (void)scrollViewDidScroll:(UIScrollView *)scrollView { float offset = CGRectGetMinX(self.originalBaseViewFrame); //通過偏移量計算應該繞y軸旋轉的角度 float persent = (scrollView.contentOffset.x - offset) / (scrollView.contentSize.width - offset); //修改基礎檢視的frame,保持相對位置不變 self.baseView.frame = CGRectMake(self.originalBaseViewFrame.origin.x + scrollView.contentOffset.x, self.originalBaseViewFrame.origin.y, self.originalBaseViewFrame.size.width, self.originalBaseViewFrame.size.height); //進行y軸旋轉 CATransform3D transformR = CATransform3DMakeRotation(-(M_PI * 2) * persent, 0, 1, 0); CATransform3D transformPerspective = CATransform3DIdentity; transformPerspective.m34 = -1.0f/800; self.baseView.layer.sublayerTransform = CATransform3DConcat(transformR, transformPerspective); } @end
簡單的六稜柱圖片瀏覽就完成了,複雜的部分主要是計算六個面的位置及y軸旋轉角度,可以通過修改六個面的檢視,豐富一下內部的功能。view 在經過 transform 設定之後,它的 frame 的屬性值也會隨著修改,如果從擴充套件一些功能也是可以的。比如,有個菱形的按鈕,那麼,是不是可以將按鈕沿x軸、y軸都進行選擇得到一個菱形,這樣的菱形按鈕的點選範圍就會在其內部了。
以上就是UIScrollView實現六稜柱圖片瀏覽效果的詳細內容,更多關於UIScrollView 六稜柱圖片瀏覽的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45