iOS 閱讀器功能小記——自動閱讀

一言不合先上效果:

自動閱讀GIF.gif

效果分析:

穿透效果:上層view局部變?yōu)橥该鞴矫瘢@示下層view尽楔。并非發(fā)生大小或位置上的改變投储。

實現(xiàn)思路:

直接上代碼:我是在superController(閱讀界面控制器)上添加一個子控制器視圖childController,以下代碼為childController中代碼阔馋。

@property (nonatomic, strong) CADisplayLink *link;//幀定時器
@property (nonatomic, strong) CAShapeLayer  *shapeLayer;
@property (nonatomic, strong) UIImageView  *backImage;
@property (nonatomic, strong) UIImageView  *shadowImage;

@property (nonatomic, assign) CGFloat topY;
@property (nonatomic, assign) CGFloat speed;

@property (nonatomic, assign) BOOL isPaused;
- (void)viewDidLoad {
    [super viewDidLoad];
    
    _backImage = [[UIImageView alloc] initWithFrame:self.view.frame];
    [self.view addSubview:_backImage];
    //創(chuàng)建mask需要的形狀
    _shapeLayer = [CAShapeLayer layer];
    _backImage.layer.mask = _shapeLayer;
    //陰影效果需要的圖片
    _shadowImage = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 5)];
    _shadowImage.image = [UIImage imageNamed:[self.dk_manager.themeVersion isEqualToString:DKThemeVersionNight] ? @"shadow_line_night":@"shadow_line_dawn"];
    [self.view addSubview:_shadowImage];
    //添加點擊手勢玛荞,暫停動畫
    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTap)];
    [self.view addGestureRecognizer:tap];
}

- (void)updateWithView:(UIImage *)image {
    _shapeLayer.path = [UIBezierPath bezierPathWithRect:self.view.frame].CGPath;
    self.backImage.image = image;
}

這里說明一下,backImage顯示的是superController的view呕寝,通過截屏的方式生成image勋眯。下面是截屏的代碼。

- (UIImage *)captureView:(UIView *)view {
    CGRect rect = view.bounds;
    UIGraphicsBeginImageContextWithOptions(rect.size, YES, 0.0f);
    CGContextRef context = UIGraphicsGetCurrentContext();
    [view.layer renderInContext:context];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return image;
}
開始做動畫:

需要注意的是mask只關注具體的形狀路徑下梢,和本身的顏色無關客蹋,所以掃描的陰影樣式我使用圖片來實現(xiàn)。

- (void)startAuto {
    if (_link == nil) {
        // 啟動定時調用
        _link = [CADisplayLink displayLinkWithTarget:self selector:@selector(getCurrent:)];
        [_link addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes];
    }
}

-(void)getCurrent:(CADisplayLink *)displayLink{
    self.isRunning = YES;
    if(_topY >= self.view.frame.size.height) {
        _topY = 0;
        self.shadowImage.center = CGPointMake(self.view.center.x, self.shadowImage.bounds.size.height/2);
        
        [_link invalidate];
        _link = nil;
        
        [_delegate finishReadPage:self];
        return;
    }
    _topY += _speed;
    [self setCurrentShadowLayer];
    [self setCurrentMaskLayer];
}

- (void)setCurrentMaskLayer {
    CGMutablePathRef path = CGPathCreateMutable();
    CGPathMoveToPoint(path, nil, 0, _topY);
    CGPathAddLineToPoint(path, nil, self.view.frame.size.width, _topY);
    CGPathAddLineToPoint(path, nil, self.view.frame.size.width, self.view.frame.size.height);
    CGPathAddLineToPoint(path, nil, 0, self.view.frame.size.height);
    CGPathCloseSubpath(path);
    
    _shapeLayer.path = path;
    CGPathRelease(path);
}

- (void)setCurrentShadowLayer {
    [UIView animateWithDuration:0.1 animations:^{
        CGPoint pos = self.shadowImage.center;
        pos.y += _speed;
        self.shadowImage.center = pos;
    }];
}
控制暫停
- (void)singleTap {
    _isPaused ^= 1;
    [_link setPaused:_isPaused];
}

小結:

我是通過水波動畫的實現(xiàn)想到這樣實現(xiàn)的孽江,通過CADisplayLink修改shapeLayer的path從而實現(xiàn)view的局部透明效果讶坯。可能我的方案不是最佳方案岗屏,如果大家有更好的方案可以留言給我辆琅,一起學習,謝謝担汤。

補充:

看到評論區(qū)很多朋友問我有沒有demo涎跨,所以我做了一個簡單的demo放在GitHub上。希望用到覺得可以的朋友給我點個star或喜歡崭歧。謝謝大家隅很。
下載地址:https://github.com/rabbitmouse/ZQAutoReadBookDemo

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市率碾,隨后出現(xiàn)的幾起案子叔营,更是在濱河造成了極大的恐慌,老刑警劉巖所宰,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件绒尊,死亡現(xiàn)場離奇詭異,居然都是意外死亡仔粥,警方通過查閱死者的電腦和手機婴谱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來躯泰,“玉大人谭羔,你說我怎么就攤上這事÷笙颍” “怎么了瘟裸?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長诵竭。 經(jīng)常有香客問我话告,道長兼搏,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任沙郭,我火速辦了婚禮佛呻,結果婚禮上,老公的妹妹穿的比我還像新娘棠绘。我一直安慰自己件相,他們只是感情好,可當我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布氧苍。 她就那樣靜靜地躺著,像睡著了一般泛范。 火紅的嫁衣襯著肌膚如雪让虐。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天罢荡,我揣著相機與錄音赡突,去河邊找鬼。 笑死区赵,一個胖子當著我的面吹牛惭缰,可吹牛的內容都是我干的。 我是一名探鬼主播笼才,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼漱受,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了骡送?” 一聲冷哼從身側響起昂羡,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎摔踱,沒想到半個月后虐先,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體耕漱,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡摩桶,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年屉符,在試婚紗的時候發(fā)現(xiàn)自己被綠了畦徘。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片萧福。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡耻矮,死狀恐怖忧吟,靈堂內的尸體忽然破棺而出慎宾,到底是詐尸還是另有隱情潜支,我是刑警寧澤甸赃,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站冗酿,受9級特大地震影響埠对,放射性物質發(fā)生泄漏络断。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一项玛、第九天 我趴在偏房一處隱蔽的房頂上張望貌笨。 院中可真熱鬧,春花似錦襟沮、人聲如沸锥惋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽膀跌。三九已至,卻和暖如春固灵,著一層夾襖步出監(jiān)牢的瞬間捅伤,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工巫玻, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留丛忆,地道東北人。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓仍秤,卻偏偏與公主長得像熄诡,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子诗力,可洞房花燭夜當晚...
    茶點故事閱讀 44,779評論 2 354

推薦閱讀更多精彩內容

  • 發(fā)現(xiàn) 關注 消息 iOS 第三方庫凰浮、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,102評論 4 62
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,111評論 25 707
  • 很遺憾覺得學習了這么多年寫作一直是我的弱項姜骡,我會悄悄的回避导坟,但是總覺得回避是不對的,希望能慢慢培養(yǎng)寫作的能力圈澈,不再害怕惫周。
    亨利來了閱讀 266評論 1 1
  • 數(shù)據(jù)庫鍵空間 Redis 是一個鍵值對(key-value pair)數(shù)據(jù)庫服務器, 服務器中的每個數(shù)據(jù)庫都由一個...
    顏灝_2181閱讀 647評論 0 1
  • 我有一個夢想康栈。 大家都知道的递递。 你有什么夢想? 是….. 是…… 是…… 是…… 是……
    心之物語閱讀 161評論 0 0