雜記-下滑關(guān)閉圖片

要實(shí)現(xiàn)下滑關(guān)閉圖片這個(gè)功能,可以將其分解為幾個(gè)需求:

  1. 向下滑動(dòng)圖片
  2. 圖片隨著往下滑動(dòng)會(huì)逐漸變小癣猾,往上滑動(dòng)則會(huì)還原至初始大小
  3. 往下滑動(dòng)背景越來越透明,往上滑動(dòng)則還原至不透明

滑動(dòng)圖片很簡(jiǎn)單烟具,添加一個(gè)拖拽手勢(shì)即可:

UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(photoPan:)];
pan.delegate = self;
[imageView addGestureRecognizer:pan];

然后就是實(shí)現(xiàn)滑動(dòng)過程中袄膏,圖片縮小放大動(dòng)畫以及背景色變化,實(shí)現(xiàn)代碼如下所示:

-(void)photoPan:(UIPanGestureRecognizer *)panGesture
{
    SDBrowserImageView *attchView = (SDBrowserImageView *)panGesture.view;
    CGPoint pointTrans = [panGesture translationInView:_scrollView];
    CGPoint point = [panGesture locationInView:_scrollView];

    NSLog(@"attchView.transform:%@",NSStringFromCGAffineTransform(attchView.transform));
    NSLog(@"x:%f , y:%f",point.x,point.y);

    if (panGesture.state == UIGestureRecognizerStateBegan)
    {
        [[UIApplication sharedApplication] setStatusBarHidden:NO];
        self.startPoint = point;
    }
    else if(panGesture.state == UIGestureRecognizerStateChanged)
    {
        CGFloat deviationY = point.y - _startPoint.y;
        CGFloat scaleTrans = 1 - pointTrans.y/SCREEN_HEIGHT;//縮放比例
        CGFloat scaleAlpha = (1 - deviationY/SCREEN_HEIGHT) > 0 ? (1 - deviationY/SCREEN_HEIGHT):0.2;//背景色變化比例
        self.backgroundColor = [UIColor colorWithWhite:0.1 alpha:scaleAlpha];

        if (deviationY > 0)
        {
            NSLog(@"scaleTrans : %.2f",scaleTrans);
            CGAffineTransform trans = CGAffineTransformMakeTranslation(pointTrans.x, pointTrans.y);
            CGAffineTransform scale = CGAffineTransformScale(attchView.transform, scaleTrans, scaleTrans);
            
            CGAffineTransform newTransform = CGAffineTransformConcat(trans, scale);
            attchView.transform = newTransform;
        }
        else
        {
            CGAffineTransform trans = CGAffineTransformTranslate(attchView.transform, pointTrans.x, pointTrans.y);
            attchView.transform = trans;
        }
    }
    else if(panGesture.state == UIGestureRecognizerStateEnded)
    {
        CGFloat deviationY = point.y - _startPoint.y;
        if (deviationY >= 60)
        {
             [self photoPanFinished:attchView];
        }
        else
        {
            [UIView animateWithDuration:0.2 animations:^{
                attchView.transform = CGAffineTransformIdentity;
            }];
        }
    }
    else if(panGesture.state == UIGestureRecognizerStateCancelled)
    {
        [[UIApplication sharedApplication] setStatusBarHidden:YES];
    }
    else if(panGesture.state == UIGestureRecognizerStateFailed)
    {
        [[UIApplication sharedApplication] setStatusBarHidden:YES];
    }
    //增量置為o
    [panGesture setTranslation:CGPointZero inView:attchView];
}

translationInView:是為了獲取每次拖拽間距甫煞,往下為正菇曲,往上為負(fù),往左為負(fù)抚吠,往右為正常潮。

startPoint是初始觸摸點(diǎn),locationInView: 是為了獲取相對(duì)于觸摸view的父視圖的移動(dòng)距離楷力。
CGAffineTransformMakeTranslation 是位移變換喊式。
CGAffineTransformScale 是縮放變換。
CGAffineTransformConcat 組合兩個(gè)動(dòng)畫弥雹。
CGAffineTransformIdentity 是動(dòng)畫初始狀態(tài)垃帅。

每次移動(dòng)一段距離都需要執(zhí)行setTranslation:方法,將增直量置為0剪勿,否則接下來的移動(dòng)會(huì)疊加之前距離贸诚。

在拖拽距離超過60,且松手后,會(huì)執(zhí)行photoPanFinished:方法以關(guān)閉圖片酱固。

在查看圖片時(shí)械念,實(shí)現(xiàn)下滑以關(guān)閉圖片過程中,碰到一個(gè)問題:Pan手勢(shì)與UIScrollView自帶的Pan手勢(shì)沖突运悲,只能相應(yīng)下滑關(guān)閉手勢(shì)龄减,不能相應(yīng)左右滑動(dòng)手勢(shì),解決辦法如下:

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer 
{
    if ([gestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]]) {
        
        UIPanGestureRecognizer *pan = (UIPanGestureRecognizer *)gestureRecognizer;
        CGPoint pos = [pan velocityInView:pan.view];
        if (pos.y > 0) {
            return YES;
        }
    }
    
    return NO;
}

其中velocityInView:是用來獲取滑動(dòng)速度的班眯,pos.y > 0 表示速度向下希停,反之向上。

這個(gè)方法還可以解決如下問題:

  1. 可以使得向下滑動(dòng)圖片時(shí)署隘,scollview不動(dòng)(只需要多加一行禁用scrollview的代碼)
    2.使圖片初始不能向上滑動(dòng)宠能,只能向下滑
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市磁餐,隨后出現(xiàn)的幾起案子违崇,更是在濱河造成了極大的恐慌,老刑警劉巖诊霹,帶你破解...
    沈念sama閱讀 218,682評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件羞延,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡脾还,警方通過查閱死者的電腦和手機(jī)伴箩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來荠呐,“玉大人赛蔫,你說我怎么就攤上這事∧嗾牛” “怎么了呵恢?”我有些...
    開封第一講書人閱讀 165,083評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)媚创。 經(jīng)常有香客問我渗钉,道長(zhǎng),這世上最難降的妖魔是什么钞钙? 我笑而不...
    開封第一講書人閱讀 58,763評(píng)論 1 295
  • 正文 為了忘掉前任鳄橘,我火速辦了婚禮,結(jié)果婚禮上芒炼,老公的妹妹穿的比我還像新娘瘫怜。我一直安慰自己,他們只是感情好本刽,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評(píng)論 6 392
  • 文/花漫 我一把揭開白布鲸湃。 她就那樣靜靜地躺著赠涮,像睡著了一般。 火紅的嫁衣襯著肌膚如雪暗挑。 梳的紋絲不亂的頭發(fā)上笋除,一...
    開封第一講書人閱讀 51,624評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音炸裆,去河邊找鬼垃它。 笑死,一個(gè)胖子當(dāng)著我的面吹牛烹看,可吹牛的內(nèi)容都是我干的国拇。 我是一名探鬼主播,決...
    沈念sama閱讀 40,358評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼惯殊,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼贝奇!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起靠胜,我...
    開封第一講書人閱讀 39,261評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎毕源,沒想到半個(gè)月后浪漠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,722評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡霎褐,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年址愿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片冻璃。...
    茶點(diǎn)故事閱讀 40,030評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡响谓,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出省艳,到底是詐尸還是另有隱情娘纷,我是刑警寧澤,帶...
    沈念sama閱讀 35,737評(píng)論 5 346
  • 正文 年R本政府宣布跋炕,位于F島的核電站赖晶,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏辐烂。R本人自食惡果不足惜遏插,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望纠修。 院中可真熱鬧胳嘲,春花似錦、人聲如沸扣草。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至白魂,卻和暖如春汽纤,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背福荸。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工蕴坪, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人敬锐。 一個(gè)月前我還...
    沈念sama閱讀 48,237評(píng)論 3 371
  • 正文 我出身青樓背传,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親台夺。 傳聞我的和親對(duì)象是個(gè)殘疾皇子径玖,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)、插件颤介、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,105評(píng)論 4 62
  • 木子手繪閱讀 203評(píng)論 0 4
  • People always think pregnancy is very easy and happy. ...
    Wu雪梨閱讀 242評(píng)論 2 0
  • “我喜歡太陽(yáng) 更喜歡你” 前幾天梳星,從通宵的D樓看出去,乏累的視覺讓地平面像站立了起來一般滚朵,仿佛看不到邊界冤灾。凌晨四點(diǎn)...
    陽(yáng)好閱讀 474評(píng)論 9 5