最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

UIScrollView實(shí)現(xiàn)六棱柱圖片瀏覽效果

 更新時間:2022年07月19日 15:36:30   作者:頭疼腦脹的代碼搬運(yùn)工  
這篇文章主要為大家介紹了UIScrollView實(shí)現(xiàn)六棱柱圖片瀏覽效果示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

一、效果展示

廢話開篇:利用 CATransform3D 圖形變換及 UIScrollView 的一些方法實(shí)現(xiàn)一個六棱柱圖片瀏覽效果

二、實(shí)現(xiàn)原理

1、在一個基礎(chǔ) View 上添加六棱柱的六個側(cè)面視圖。

2、調(diào)整六棱柱的各個側(cè)面的旋轉(zhuǎn)角度及z軸數(shù)值。

3、基礎(chǔ) View 放在 UIScrollView 上,通過監(jiān)聽 UIScrollView 的滑動來設(shè)置基礎(chǔ) View 的坐標(biāo)x值與與y軸的旋轉(zhuǎn)角度。

三、代碼

創(chuàng)建 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{
    //滾動視圖其實(shí)主要是用來通過位置偏移進(jìn)行計(jì)算旋轉(zhuǎn)的角度(通過偏移量與總寬度計(jì)算旋轉(zhuǎn)角度與一周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];
}
//創(chuàng)建六棱柱面
- (void)addDrumBrowseImageView{
    int num = 6;
    //一些角度計(jì)算
    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;
        }
    }
    //同時設(shè)置六個面的透視參數(shù)
    CATransform3D transformPerspective = CATransform3DIdentity;
    transformPerspective.m34 = -1.0f/800;
    self.baseView.layer.sublayerTransform = transformPerspective;
}
#pragma mark - 滾動進(jìn)行圖形變換
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    float offset = CGRectGetMinX(self.originalBaseViewFrame);
    //通過偏移量計(jì)算應(yīng)該繞y軸旋轉(zhuǎn)的角度
    float persent = (scrollView.contentOffset.x - offset) / (scrollView.contentSize.width - offset);
    //修改基礎(chǔ)視圖的frame,保持相對位置不變
    self.baseView.frame = CGRectMake(self.originalBaseViewFrame.origin.x + scrollView.contentOffset.x, self.originalBaseViewFrame.origin.y, self.originalBaseViewFrame.size.width, self.originalBaseViewFrame.size.height);
    //進(jìn)行y軸旋轉(zhuǎn)
    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

四、總結(jié)與思考

簡單的六棱柱圖片瀏覽就完成了,復(fù)雜的部分主要是計(jì)算六個面的位置及y軸旋轉(zhuǎn)角度,可以通過修改六個面的視圖,豐富一下內(nèi)部的功能。view 在經(jīng)過 transform 設(shè)置之后,它的 frame 的屬性值也會隨著修改,如果從擴(kuò)展一些功能也是可以的。比如,有個菱形的按鈕,那么,是不是可以將按鈕沿x軸、y軸都進(jìn)行選擇得到一個菱形,這樣的菱形按鈕的點(diǎn)擊范圍就會在其內(nèi)部了。

以上就是UIScrollView實(shí)現(xiàn)六棱柱圖片瀏覽效果的詳細(xì)內(nèi)容,更多關(guān)于UIScrollView 六棱柱圖片瀏覽的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • iOS ScrollView嵌套tableView聯(lián)動滾動的思路與最佳實(shí)踐

    iOS ScrollView嵌套tableView聯(lián)動滾動的思路與最佳實(shí)踐

    這篇文章主要給大家介紹了關(guān)于ScrollView嵌套tableView聯(lián)動滾動的思路與最佳實(shí)踐,文中通過示例代碼介紹的非常詳細(xì),對各位iOS開發(fā)者們具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • iOS去除圖片背景顏色的方法

    iOS去除圖片背景顏色的方法

    本篇文章給大家分享一下iOS去除圖片中指定范圍內(nèi)顏色的三種方式,需要的朋友參考學(xué)習(xí)下吧。
    2017-12-12
  • Objective-C的NSOperation多線程類基本使用指南

    Objective-C的NSOperation多線程類基本使用指南

    這篇文章主要介紹了Objective-C的NSOperation多線程類基本使用指南,談到了Operations的執(zhí)行順序和并發(fā)量等設(shè)置操作,需要的朋友可以參考下
    2016-02-02
  • IOS中UIWebView的使用詳解

    IOS中UIWebView的使用詳解

    這篇文章主要介紹了IOS中UIWebView的使用詳解,涉及到初始化與三種加載方式,一些常用的屬性和變量及ios7中的一些新特征,本文介紹的非常詳細(xì),感興趣的朋友一起學(xué)習(xí)吧
    2016-02-02
  • iOS實(shí)現(xiàn)視頻壓縮上傳實(shí)例代碼

    iOS實(shí)現(xiàn)視頻壓縮上傳實(shí)例代碼

    本篇文章主要介紹了iOS實(shí)現(xiàn)視頻壓縮上傳實(shí)例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-04-04
  • IOS自適配利器Masonry使用指南

    IOS自適配利器Masonry使用指南

    如果說自動布局解救了多屏幕適配,那眾多三方庫的出現(xiàn)就解救了系統(tǒng)自動布局的寫法。Masonry就是其中一個。用法上也比較簡單靈活,很大程度上替代了傳統(tǒng)的NSLayoutConstraint布局方式。下面我們就來具體探討下吧
    2016-01-01
  • iOS中GCD定時器詳解

    iOS中GCD定時器詳解

    ?CADisplayLink、NSTimer是基于RunLoop機(jī)制的,如果RunLoop的任務(wù)過于繁重,有可能會導(dǎo)致前兩個定時器不準(zhǔn)時,這篇文章主要介紹了iOS中GCD定時器的相關(guān)知識,需要的朋友可以參考下
    2013-02-02
  • iOS開發(fā)中導(dǎo)航控制器的基本使用教程

    iOS開發(fā)中導(dǎo)航控制器的基本使用教程

    這篇文章主要介紹了iOS開發(fā)中導(dǎo)航控制器的基本使用教程,代碼基于傳統(tǒng)的Objective-C,需要的朋友可以參考下
    2015-11-11
  • 如何利用iCloud Drive同步Xcode配置詳解

    如何利用iCloud Drive同步Xcode配置詳解

    這篇文章主要給大家介紹了關(guān)于如何利用iCloud Drive同步Xcode配置的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-05-05
  • iOS實(shí)現(xiàn)UIScrollView的無限輪播功能(原理)詳解

    iOS實(shí)現(xiàn)UIScrollView的無限輪播功能(原理)詳解

    在現(xiàn)在的一些App中常常見到圖片輪播器,一般用于展示廣告、新聞等數(shù)據(jù),下面這篇文章主要給大家介紹了關(guān)于iOS實(shí)現(xiàn)UIScrollView的無限輪播功能(原理)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2018-09-09

最新評論

信丰县| 鹿邑县| 砀山县| 巴里| 卢氏县| 新密市| 衡东县| 贡山| 克东县| 峨山| 上饶县| 吉水县| 闽侯县| 麦盖提县| 白玉县| 莲花县| 滁州市| 若羌县| 石楼县| 前郭尔| 泸定县| 巴彦县| 宁德市| 沁源县| 吉水县| 滕州市| 岑溪市| 兴国县| 仙桃市| 大同县| 赫章县| 永寿县| 涟源市| 鄂尔多斯市| 磐石市| 萨嘎县| 赞皇县| 裕民县| 凤凰县| 固始县| 拉萨市|