成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

iOS半透明新手引導 手把手教你做

移動開發
這種類型的新手引導比較常見,用于告訴用戶某個按鈕的作用,或者提醒用戶可以進行某種交互操作。引導樣式是在界面上加了一個半透明的引導圖,高亮部分就是要突出的區域

一、效果展示

[[142842]]

這種類型的新手引導比較常見,用于告訴用戶某個按鈕的作用,或者提醒用戶可以進行某種交互操作。引導樣式是在界面上加了一個半透明的引導圖,高亮部分就是要突出的區域

二、怎么做?

方案有很多種,不同的方案有不同的優缺點,這里列舉兩種常見的方案

1. 方案一:生成整張引導圖

(1). 導出引導圖

讓設計師導出各個尺寸的引導圖,引導圖只包含指引部分,不包括背景,導出的引導圖樣式如下:

 

[[142843]]

需要導出iPhone4,iPhone5,iPhone6,iPhone6 plus 共4個尺寸,如果適配iPad,還需要導出iPad的

 

(2). 編碼

因為整張圖導出了,所以代碼部分就簡單了,不需要考慮布局問題,直接生成一個imageView放上去,然后給它添加個點擊事件即可

代碼如下:

  1. - (void)addGuideView { 
  2.     NSString *imageName = nil; 
  3.     if (DEVICE_IS_IPHONE5) { 
  4.         imageName = @"guide-568h"
  5.     } else { 
  6.         imageName = @"guide"
  7.     } 
  8.  
  9.     UIImage *image = [UIImage imageNamed:imageName]; 
  10.     UIImageView *imageView = [[UIImageView alloc] initWithImage:image]; 
  11.     imageView.frame = self.view.bounds; 
  12.     imageView.userInteractionEnabled = YES; 
  13.  
  14.     UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissGuideView)]; 
  15.     [imageView addGestureRecognizer:tap]; 
  16.  
  17.     [self.view addSubview:imageView]; 

這里需要特別注意:
@3x 的圖片需要iOS8以上的系統才能夠自動識別出來,如果要向前兼容,則圖片名那里需要自行判斷設備類型,然后指定對應的圖片名稱

(3). 優缺點

這種方案的優點是
a. 快速
只要設計師做好效果圖以后,把蒙層導出成各種規格即可,90%的工作量都在設計師身上,程序員只需要簡單地添加視圖和事件即可

b. 維護成本低
當界面發生變化,或者引導圖需要調整時,只需要設計師重新生成圖片,然后替換就可以了

但這種方案的缺點也很多:
a. 圖片占據空間大
每種設備一張圖片,圖片還是全屏規格的,可能還要適配橫屏,明顯會增加app安裝包的大小

b. 圖片無法復用
一張引導圖只能用于一個地方,其他地方不可能會用得上

2. 方案二:圖片拼接

圖片拼接的思路是這樣的,通過若干張圖片拼成一個遮罩層,然后再在上面放其他元素,如下圖所示

 

[[142844]]

(1). 準備圖片

 

這里需要準備3張圖片
a. 空心的橢圓遮罩層

 

[[142845]]

 

中間是透明,周圍是白色的,白色部分可以在遮罩過程中修改成任意的顏色

 

b. 小箭頭

 

[[142846]]

c. 確定按鈕

 

 

[[142847]]

#p#

(2). 編碼

 

這里只介紹部分代碼的編寫過程

a. 接口
接口的定義:

  • (void)showInView:(UIView )view maskBtn:(UIButton )btn;
    view:引導圖的父視圖
    btn:被遮罩的按鈕

接口的實現:

  1. (void)showInView:(UIView )view maskBtn:(UIButton )btn { 
  2. self.parentView = view; 
  3. self.maskBtn = btn; 
  4.  
  5. self.alpha = 0
  6. [view addSubview:self]; 
  7. [UIView animateWithDuration:0.2 animations:^{ 
  8.  
  9.   self.alpha = 1
  10. } completion:nil]; 

b. 修改遮罩層
加載空心的橢圓圖片后,先對白色區域進行處理,把它改成黑色半透明
UIImage image = [UIImage imageNamed:@"whiteMask"];
image = [image maskImage:[[UIColor blackColor] colorWithAlphaComponent:0.71]];
UIImageView imageView = [[UIImageView alloc] initWithImage:image];

  1. (UIImage )maskImage:(UIColor )maskColor 
  2. CGRect rect = CGRectMake(00, self.size.width, self.size.height); 
  3.  
  4. UIGraphicsBeginImageContext(rect.size); 
  5.  
  6. CGContextRef context = UIGraphicsGetCurrentContext(); 
  7. CGContextTranslateCTM(context, 0, rect.size.height); 
  8. CGContextScaleCTM(context, 1.0, -1.0); 
  9. CGContextClipToMask(context, rect, self.CGImage); 
  10. CGContextSetFillColorWithColor(context, maskColor.CGColor); 
  11. CGContextFillRect(context, rect); 
  12.  
  13. UIImage *smallImage = UIGraphicsGetImageFromCurrentImageContext(); 
  14.  
  15. UIGraphicsEndImageContext(); 
  16.  
  17. return smallImage; 
  • 這里會將圖片中白色的部分改成任意的顏色,我們要將空心的橢圓圖片變成這樣

     

    [[142848]]

     

    c. 生成上下左右4個黑色半透明視圖

    分別放在空心橢圓圖片的上、下、左、右四個方位

     

    1. (UIView *)topMaskView { 
    2. if (!_topMaskView) { 
    3.  
    4.   UIView *view = [[UIView alloc] init]; 
    5.   view.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.71]; 
    6.   _topMaskView = view; 
    7. return _topMaskView; 
    1. (UIView *)bottomMaskView { 
    2. if (!_bottomMaskView) { 
    3.  
    4.   UIView *view = [[UIView alloc] init]; 
    5.   view.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.71]; 
    6.   _bottomMaskView = view; 
    7. return _bottomMaskView; 
    1. (UIView *)leftMaskView { 
    2. if (!_leftMaskView) { 
    3.  
    4.   UIView *view = [[UIView alloc] init]; 
    5.   view.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.71]; 
    6.   _leftMaskView = view; 
    7. return _leftMaskView; 
    1. (UIView *)rightMaskView { 
    2. if (!_rightMaskView) { 
    3.  
    4.   UIView *view = [[UIView alloc] init]; 
    5.   view.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.71]; 
    6.   _rightMaskView = view; 
    7. return _rightMaskView; 

d. 視圖布局
這里有幾個需要注意的地方:
c-1. 被拼接的視圖的 x,y,width,height 的值需要取整,因為浮點數可能會導致銜接部位出現白邊,尤其是在iPhone6 plus上,原因是手機的分辨率問題,所以這里***使用整數

c-2. 在 layoutSubviews 函數中進行布局,這里布局的好處是橫豎屏適配都能夠平滑過渡,而且不需要手動更新

布局代碼如下:

  1. (void)layoutSubviews { 
  2. [super layoutSubviews]; 
  3. self.frame = _parentView.bounds; 
  4. _maskBg.frame = self.bounds; 
  5. _btnMaskView.center = [_maskBtn.superview convertPoint:_maskBtn.center toView:_maskBtn.superview]; 
  6.  
  7. CGRect btnMaskRect = _btnMaskView.frame; 
  8. btnMaskRect.size = CGSizeMake(floor(btnMaskRect.size.width), floor(btnMaskRect.size.height)); 
  9. btnMaskRect.origin = CGPointMake(floor(btnMaskRect.origin.x), floor(btnMaskRect.origin.y)); 
  10. _btnMaskView.frame = btnMaskRect; 
  11.  
  12. _topMaskView.left = 0
  13. _topMaskView.top = 0
  14. _topMaskView.height = _btnMaskView.top; 
  15. _topMaskView.width = self.width; 
  16.  
  17. _bottomMaskView.left = 0
  18. _bottomMaskView.top = _btnMaskView.bottom; 
  19. _bottomMaskView.width = self.width; 
  20. _bottomMaskView.height = self.height - _bottomMaskView.top; 
  21.  
  22. _leftMaskView.left = 0
  23. _leftMaskView.top = _btnMaskView.top; 
  24. _leftMaskView.width = _btnMaskView.left; 
  25. _leftMaskView.height = _btnMaskView.height; 
  26.  
  27. _rightMaskView.left = _btnMaskView.right; 
  28. _rightMaskView.top = _btnMaskView.top; 
  29. _rightMaskView.width = self.width - _rightMaskView.left; 
  30. _rightMaskView.height = _btnMaskView.height; 
  31.  
  32. _arrwoView.right = _btnMaskView.left + 24
  33. _arrwoView.bottom = _btnMaskView.top - 8
  34. _tipsLabel.right = _arrwoView.left - 6
  35. _tipsLabel.bottom = _arrwoView.top + 10
  36.  
  37. _okBtn.centerX = self.width/2
  38. _okBtn.bottom = _btnMaskView.top - 80
(3). 優缺點

優點:
a. 節約空間
一般就只需要幾個小圖,然后就可以組裝成一張引導圖了

b. 圖片可重用
按鈕、橢圓圖、小箭頭這一類的圖片可能被其他引導圖繼續使用

缺點:
a. 編碼時間較長
每一個界面元素都需要通過編碼來實現,每一次改動也需要調整代碼

三、總結

***種方案比較適合小項目,主要是速度快,適合快速迭代
第二種方案適合長期更新的項目,節約app空間
Demo地址:
https://github.com/sunljz/demo/tree/master/GuideDemo

【編輯推薦】

 

  1. iOS開發基礎知識:Core Animation(核心動畫)
  2. iOS開發的一些奇巧淫技
  3. iOS開發的一些奇巧淫技2
  4. iOS開發知識體系
  5. 關于iOS多線程,你看我就夠了

 

【責任編輯:倪明 TEL:(010)68476606】

責任編輯:倪明 來源: 簡書
相關推薦

2017-05-18 12:45:35

數據分析數據理解數據

2025-04-08 08:28:13

RetrofitKtor網絡庫

2020-07-23 14:39:28

系統權限設計

2011-01-10 14:41:26

2011-05-03 15:59:00

黑盒打印機

2025-05-07 00:31:30

2021-04-06 22:48:41

數據集工具Python

2015-07-28 14:27:44

2021-07-14 09:00:00

JavaFX開發應用

2011-03-28 16:14:38

jQuery

2011-02-22 13:46:27

微軟SQL.NET

2021-02-26 11:54:38

MyBatis 插件接口

2021-12-28 08:38:26

Linux 中斷喚醒系統Linux 系統

2021-10-03 20:26:56

系統模塊標簽

2023-04-26 12:46:43

DockerSpringKubernetes

2022-01-08 20:04:20

攔截系統調用

2022-03-14 14:47:21

HarmonyOS操作系統鴻蒙

2022-07-27 08:16:22

搜索引擎Lucene

2022-12-07 08:42:35

2020-10-13 11:21:57

框架自動化開發
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 男人天堂视频在线观看 | 羞羞色网站 | 狠狠亚洲| 日本久久久一区二区三区 | 在线观看免费国产 | 欧美综合一区 | 在线黄色网 | 在线视频中文字幕 | 一级毛片视频在线观看 | 欧美一区二区三区久久精品 | 91日韩| 欧美一卡二卡在线观看 | 欧美在线观看一区二区 | 亚洲一区二区三区在线视频 | 久久国产亚洲 | 一区二区三区国产精品 | 亚洲精品久久久久久一区二区 | 久久精品91久久久久久再现 | 日韩一区和二区 | 精品国产一区二区三区久久影院 | 精品亚洲一区二区三区 | 精品免费视频一区二区 | 国产精选一区 | 久久久www成人免费无遮挡大片 | 亚洲狠狠丁香婷婷综合久久久 | 国产四区| www国产亚洲精品 | 在线中文字幕视频 | 国产日韩精品一区 | 国产精品久久久久久久久久久免费看 | 国产一区 | 久久精品免费 | 欧美日韩久久 | 免费a网站 | 国产精品不卡 | 91在线观看网址 | 99国产视频 | 狠狠av | 欧美激情一区二区三区 | 亚洲永久入口 | 视频一区二区三区中文字幕 |