亚洲免费不卡_在线视频精品_国产尤物精品_久久久久网址_久久精品91_欧美va天堂在线_狠狠入ady亚洲精品_亚洲午夜精品福利_国产精品草草_午夜精品久久99蜜桃的功能介绍

iOS開發UI篇—實現一個簡單的手勢解鎖應用
來源:易賢網 閱讀:7232 次 日期:2015-05-08 14:24:13
溫馨提示:易賢網小編為您整理了“iOS開發UI篇—實現一個簡單的手勢解鎖應用”,方便廣大網友查閱!

一、實現效果

實現效果圖:

名單

二、 手勢解鎖應用 分析

1.監聽手指在view上的移動,首先肯定需要自定義一個view,重寫touch began,touch move等方法,當手指移動到圈上時,讓其變亮。可以通過button按鈕來實現。

2.界面搭建

背景圖片(給控制器的view添加一個imageview,設置屬性背景圖片)

九個按鈕(把九個按鈕作為一個整體,使用一個大的view來管理這些小的view,這些小的view就是9個button。如果使用手動拖控件的方式實現頁面搭建,那么9個按鈕需要拖拽九次,且需要對齊,不靈活,這里選擇使用以【九宮格】代碼的方式創建9個按鈕)。

3.新建一個類,對自定義的view進行管理,這個view是從storyboard創建出來的,會調用aweakframe方法和initwithcoder方法,后者先調用因此把創建按鈕的代碼寫在這個方法中。

部分代碼:

1 //界面搭建

2 - (id)initWithFrame:(CGRect)frame

3 {

4 self = [super initWithFrame:frame];

5 if (self) {

6 [self setup];

7 }

8 return self;

9 }

10

11 -(id)initWithCoder:(NSCoder *)aDecoder

12 {

13 if (self=[super initWithCoder:aDecoder]) {

14 [self setup];

15 }

16 return self;

17 }

18 //在界面上創建9個按鈕

19 -(void)setup

20 {

21 //1.創建9個按鈕

22 for (int i=0; i<9; i++) {

23 UIButton *btn=[UIButton buttonWithType:UIButtonTypeCustom];

24 //2.設置按鈕的狀態背景

25 [btn setBackgroundImage:[UIImage imageNamed:@"gesture_node_normal"] forState:UIControlStateNormal];

26 [btn setBackgroundImage:[UIImage imageNamed:@"gesture_node_highlighted"] forState:UIControlStateSelected];

27 //3.把按鈕添加到視圖中

28 [self addSubview:btn];

29 //4.禁止按鈕的點擊事件

30 btn.userInteractionEnabled=NO;

31 }

32 }

注意點: 在initwithcoder:方法中一定要先對父類進行初始化。

說明: 當視圖從xib或storyboard中創建出來會調用initwithcoder:方法,如果視圖是通過代碼創建出來的,那么就會調用initwithFrame:方法。

提示: 使用代碼創建視圖,即便是調用init方法而不是直接調用nitwithFrame:方法,init方法內部也會調用nitwithFrame:方法。

建議: 如果重寫view的話,建議同時重寫這兩個方法。調用,【self setup】

三、實現基本連線

步驟:

1.創建按鈕

2.設置按鈕的背景圖片(默認狀態——選中狀態)

3.添加按鈕到view

提示: 不要在構造方法中設置按鈕的frame,因為這個方法是在構造方法中調用的,而在構造方法中獲取不了frame。

4.在layoutSubviews中設置按鈕的frame。(提示:一定要先調用父類的layoutSubviews)

4.1取出對應位置的按鈕

4.2設置每個按鈕的frame

5.監聽手指的移動。分析程序,應該監聽手指的移動,而不是按鈕的點擊,當手指移動到按鈕的范圍內時,讓按鈕變亮。

5.1重寫touchesbegan...方法

(1)獲取按下的點

(2)判斷觸摸的位置是否在按鈕的范圍內(使用超級for循環)

提示: 一個判斷點是否在指定范圍內的方法——CGRectContainsPoint(,);

5.2重新touchesmoved...方法

說明: 當手指移動到按鈕上的時候,按鈕變亮,因此需要重寫touchesmoved方法。

(1)獲取觸摸的點

(2)判斷觸摸的點是否在按鈕的范圍內。

提示: 可以把上面兩個功能分別進行封裝,在使用的時候直接調用即可。

封裝代碼:

1 //對功能點進行封裝

2 -(CGPoint)getCurrentPoint:(NSSet *)touches

3 {

4 UITouch *touch=[touches anyObject];

5 CGPoint point=[touch locationInView:touch.view];

6 return point;

7 }

8

9 -(UIButton *)getCurrentBtnWithPoint:(CGPoint)point

10 {

11 for (UIButton *btn in self.subviews) {

12 if (CGRectContainsPoint(btn.frame, point)) {

13 return btn;

14 }

15 }

16 return Nil;

17 }

整理:

(1)獲取按下的點

(2)獲取觸摸的按鈕

(3)(存儲按鈕)設置觸摸按鈕的狀態

(4)通知view繪制線段

四、繪制線段

思路: 獲取為選中狀態的按鈕,并把它們存到一個數組中,重寫drawRect方法,從數組中取出所有的按鈕,連接所有按鈕的中點。

注意: 數組中不能存空值,在存儲之前需要先進行判斷。

新的問題:已經被連過的按鈕,不能再連線。(在存儲按鈕的時候判斷,如果該按鈕已經被連線,那么就不再添加到數組中)。

解決代碼:

1 if (btn && btn.selected != YES) {

2 //設置按鈕的選中狀態

3 btn.selected=YES;

4 //把按鈕添加到數組中

5 [self.buttons addObject:btn];

6 }

繪制線段

(1)獲取上下文

(2)取出按鈕(起點和終點)

(3)渲染

代碼:

1 //重寫drawrect:方法

2 -(void)drawRect:(CGRect)rect

3 {

4 //獲取上下文

5 CGContextRef ctx=UIGraphicsGetCurrentContext();

6 //繪圖(線段)

7 for (int i=0; i<self.buttons.count; i++) {

8 UIButton *btn=self.buttons[i];

9 if (0==i) {

10 //設置起點(注意連接的是中點)

11 // CGContextMoveToPoint(ctx, btn.frame.origin.x, btn.frame.origin.y);

12 CGContextMoveToPoint(ctx, btn.center.x, btn.center.y);

13 }else

14 {

15 // CGContextAddLineToPoint(ctx, btn.frame.origin.x, btn.frame.origin.y);

16 CGContextAddLineToPoint(ctx, btn.center.x, btn.center.y);

17 }

18 }

19 //渲染

20 //設置線條的屬性

21 CGContextSetLineWidth(ctx, 10);

22 CGContextSetRGBStrokeColor(ctx, 20/255.0, 107/255.0, 153/255.0, 1);

23 CGContextStrokePath(ctx);

24 }

五、附錄

實現的完整代碼

1 //

2 // YYLockView.m

3 // 01-手勢解鎖(基本)

4 //

5 // Created by apple on 14-6-18.

6 // Copyright (c) 2014年 itcase. All rights reserved.

7 //

8

9 #import "YYLockView.h"

10

11 @interface YYLockView ()

12 @property(nonatomic,strong)NSMutableArray *buttons;

13 @end

14 @implementation YYLockView

15

16 #pragma mark-懶加載

17 -(NSMutableArray *)buttons

18 {

19 if (_buttons==nil) {

20 _buttons=[NSMutableArray array];

21 }

22 return _buttons;

23 }

24

25 //界面搭建

26 - (id)initWithFrame:(CGRect)frame

27 {

28 self = [super initWithFrame:frame];

29 if (self) {

30 [self setup];

31 }

32 return self;

33 }

34

35 -(id)initWithCoder:(NSCoder *)aDecoder

36 {

37 if (self=[super initWithCoder:aDecoder]) {

38 [self setup];

39 }

40 return self;

41 }

42 //在界面上創建9個按鈕

43 -(void)setup

44 {

45 //1.創建9個按鈕

46 for (int i=0; i<9; i++) {

47 UIButton *btn=[UIButton buttonWithType:UIButtonTypeCustom];

48 //2.設置按鈕的狀態背景

49 [btn setBackgroundImage:[UIImage imageNamed:@"gesture_node_normal"] forState:UIControlStateNormal];

50 [btn setBackgroundImage:[UIImage imageNamed:@"gesture_node_highlighted"] forState:UIControlStateSelected];

51 //3.把按鈕添加到視圖中

52 [self addSubview:btn];

53 //4.禁止按鈕的點擊事件

54 btn.userInteractionEnabled=NO;

55 }

56 }

57

58 //4.設置按鈕的frame

59 -(void)layoutSubviews

60 {

61 //4.1需要先調用父類的方法

62 [super layoutSubviews];

63 for (int i=0; i<self.subviews.count; i++) {

64 //4.2取出按鈕

65 UIButton *btn=self.subviews[i];

66

67 //4.3九宮格法計算每個按鈕的frame

68 CGFloat row = i/3;

69 CGFloat loc = i%3;

70 CGFloat btnW=74;

71 CGFloat btnH=74;

72 CGFloat padding=(self.frame.size.width-3*btnW)/4;

73 CGFloat btnX=padding+(btnW+padding)*loc;

74 CGFloat btnY=padding+(btnW+padding)*row;

75 btn.frame=CGRectMake(btnX, btnY, btnW, btnH);

76 }

77 }

78

79 //5.監聽手指的移動

80 -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

81 {

82 CGPoint starPoint=[self getCurrentPoint:touches];

83 UIButton *btn=[self getCurrentBtnWithPoint:starPoint];

84

85 if (btn && btn.selected != YES) {

86 btn.selected=YES;

87 [self.buttons addObject:btn];

88 }

89 }

90 -(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event

91 {

92 CGPoint movePoint=[self getCurrentPoint:touches];

93 UIButton *btn=[self getCurrentBtnWithPoint:movePoint];

94 //存儲按鈕

95 //已經連過的按鈕,不可再連

96 if (btn && btn.selected != YES) {

97 //設置按鈕的選中狀態

98 btn.selected=YES;

99 //把按鈕添加到數組中

100 [self.buttons addObject:btn];

101 }

102 //通知view重新繪制

103 [self setNeedsDisplay];

104 }

105 //對功能點進行封裝

106 -(CGPoint)getCurrentPoint:(NSSet *)touches

107 {

108 UITouch *touch=[touches anyObject];

109 CGPoint point=[touch locationInView:touch.view];

110 return point;

111 }

112

113 -(UIButton *)getCurrentBtnWithPoint:(CGPoint)point

114 {

115 for (UIButton *btn in self.subviews) {

116 if (CGRectContainsPoint(btn.frame, point)) {

117 return btn;

118 }

119 }

120 return Nil;

121 }

122

123 //重寫drawrect:方法

124 -(void)drawRect:(CGRect)rect

125 {

126 //獲取上下文

127 CGContextRef ctx=UIGraphicsGetCurrentContext();

128 //繪圖(線段)

129 for (int i=0; i<self.buttons.count; i++) {

130 UIButton *btn=self.buttons[i];

131 if (0==i) {

132 //設置起點(注意連接的是中點)

133 // CGContextMoveToPoint(ctx, btn.frame.origin.x, btn.frame.origin.y);

134 CGContextMoveToPoint(ctx, btn.center.x, btn.center.y);

135 }else

136 {

137 // CGContextAddLineToPoint(ctx, btn.frame.origin.x, btn.frame.origin.y);

138 CGContextAddLineToPoint(ctx, btn.center.x, btn.center.y);

139 }

140 }

141 //渲染

142 //設置線條的屬性

143 CGContextSetLineWidth(ctx, 10);

144 CGContextSetRGBStrokeColor(ctx, 20/255.0, 107/255.0, 153/255.0, 1);

145 CGContextStrokePath(ctx);

146 }

147 @end

更多信息請查看IT技術專欄

更多信息請查看技術文章
由于各方面情況的不斷調整與變化,易賢網提供的所有考試信息和咨詢回復僅供參考,敬請考生以權威部門公布的正式信息和咨詢為準!
關于我們 | 聯系我們 | 人才招聘 | 網站聲明 | 網站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機站點

版權所有:易賢網

亚洲免费不卡_在线视频精品_国产尤物精品_久久久久网址_久久精品91_欧美va天堂在线_狠狠入ady亚洲精品_亚洲午夜精品福利_国产精品草草_午夜精品久久99蜜桃的功能介绍
一区二区日韩免费看| 国产精品最新自拍| 99精品视频免费| 亚洲精品日韩久久| 夜久久久久久| 久久国产精品久久精品国产| 老牛嫩草一区二区三区日本 | 国内精品福利| 久久天天综合| 亚洲大胆av| 久久av在线| 亚洲电影成人| 欧美福利在线| 国产一区二区三区成人欧美日韩在线观看 | 国产精品乱码| 欧美理论在线| 国产视频在线观看一区| 欧美视频1区| 国产精品一区二区三区观看| 欧美日韩天天操| 亚洲一区二区精品在线| 亚洲午夜久久久久久尤物| 久久福利精品| 国产精品免费区二区三区观看| 欧美日韩在线精品| 久久精品毛片| 亚洲综合激情| 亚洲日本成人| 欧美一区=区| 亚洲日本免费| 亚洲天堂黄色| 久久高清国产| 亚洲网址在线| 欧美日韩亚洲一区二区三区四区| 国产精品丝袜xxxxxxx| 欧美视频一区| 欧美91福利在线观看| 国产一区91| 久久亚洲二区| 亚洲视屏一区| 国产精品乱子乱xxxx| 蘑菇福利视频一区播放| 国产欧美日本在线| 亚洲无吗在线| 欧美视频1区| 午夜精品亚洲| 午夜视频精品| 欧美1区免费| 久久综合网络一区二区| 欧美亚洲视频| 久久精品九九| 老司机午夜精品视频在线观看| 国产九九精品| 亚洲欧美大片| 小嫩嫩精品导航| 亚洲在线成人| 久久精品女人天堂| 久热这里只精品99re8久| 久久精品盗摄| 欧美高清视频一区二区三区在线观看| 久久精品一区二区国产| 欧美1区2区3区| 99国产精品私拍| 先锋影音一区二区三区| 国产日韩一区欧美| 国产精品社区| 亚洲一区二区动漫| 老鸭窝91久久精品色噜噜导演| 久久资源av| 久久综合导航| 黄色在线一区| 亚洲精品护士| 亚洲影院在线| 狼狼综合久久久久综合网| 午夜亚洲福利| 在线观看亚洲| 在线综合亚洲| 你懂的网址国产 欧美| 亚洲欧美影院| 亚洲国产日韩在线| 久久精品盗摄| 亚洲国产91| 久久国产福利| 黄色精品网站| 亚洲一区二区毛片| 欧美激情精品久久久六区热门| 国内成人在线| 亚洲一区在线免费| 欧美日韩免费观看一区=区三区| 国产精品99一区二区| 亚洲私人影院| 99在线热播精品免费99热| 亚洲欧美日韩精品在线| 欧美激情国产日韩| 99精品99久久久久久宅男| 久久精品日韩欧美| 亚洲三级影院| 午夜精品久久| 在线视频精品| 欧美日韩影院| 乱人伦精品视频在线观看| 狠狠综合久久| 你懂的成人av| 亚洲综合精品四区| 亚洲精品激情| 国产精品国产精品| 久久综合狠狠| 亚洲一区三区视频在线观看| 亚洲国产91| 国产综合第一页| 久久精品在线| 一本一本a久久| 在线播放日韩| 亚洲午夜激情| 国产一区二区三区自拍| 欧美在线高清| 久久xxxx精品视频| 亚洲一区二区动漫| 制服诱惑一区二区| 亚洲精品国产日韩| 亚洲国产清纯| 在线成人黄色| 亚洲一本视频| 国内成+人亚洲| 午夜精品剧场| 欧美日韩免费高清| 午夜日韩av| 久久资源av| 老司机精品久久| 欧美99在线视频观看| 久久久精彩视频| 久久精品主播| 欧美成人高清| 国产一区美女| 伊人久久婷婷| 激情一区二区| 黄色综合网站| 亚洲午夜电影| 一区二区三区我不卡| 亚洲国产精品www| 伊人激情综合| 亚洲人成毛片在线播放女女| 1024日韩| 亚洲综合不卡| 欧美成人国产| 精品91在线| 亚洲精品1区2区| 91久久久久| 久久精品一区二区国产| 红桃视频欧美| 亚洲视频狠狠| 99精品国产一区二区青青牛奶| 在线观看欧美一区| 99国产精品视频免费观看一公开| 国产一区白浆| 你懂的国产精品| 亚洲婷婷在线| 国产欧美三级| 你懂的一区二区| 国内精品久久久久久久97牛牛 | 亚洲黄页一区| 国产一区二区黄色| 欧美一区二区三区在线免费观看| 国产一区二区三区四区hd| 欧美日韩一卡| aa亚洲婷婷| 欧美高清视频一区| 9色精品在线| 一本一本久久| 欧美午夜免费影院| 国产伦精品一区二区三区照片91 | 亚洲国产专区校园欧美| 国产伦理一区| 激情亚洲成人| 久久精品综合一区| 一区二区三区偷拍| 国产中文一区| 性感少妇一区| 亚洲精品一区二| 欧美日韩在线一二三| 亚洲一区二区三区四区中文| 激情久久久久久久| 欧美黄色精品| 久久国产一区| 国产精品视频| 亚洲日本精品国产第一区| 欧美三级小说| 欧美一区国产在线| 亚洲一区bb| 日韩亚洲不卡在线| 好看不卡的中文字幕| 美女久久网站| 亚洲免费婷婷| 国产一区二区精品| 99国产精品久久久久久久| 伊人婷婷久久| 亚洲激情综合| 日韩一级免费| 国产一区二区你懂的| 99伊人成综合| 国产日韩久久| 亚洲少妇诱惑| 欧美三级网页| 亚洲综合激情| 亚洲综合欧美| 久久国产精品亚洲va麻豆| 午夜亚洲福利在线老司机| 午夜在线一区二区| 久久男女视频| 欧美激情视频一区二区三区在线播放| 久久精品日韩欧美| 欧美1级日本1级| 欧美午夜一区| 在线精品一区| 亚洲伦理一区| 国产视频欧美| 久久男女视频| 欧美视频二区| 国内精品美女在线观看| 国内精品一区二区| 日韩一级不卡| 免费中文字幕日韩欧美| 老牛影视一区二区三区| 午夜欧美精品久久久久久久| 欧美日韩岛国| 亚洲国产婷婷| 国产精品一级久久久| 久久国产精品一区二区三区| 久久一本综合频道| 激情久久久久久| 99精品99久久久久久宅男| 欧美日韩精品免费观看| 亚洲欧美精品在线观看| 久久精品国产99精品国产亚洲性色| 美女久久一区| 国内久久视频| 国产亚洲一区二区三区在线播放| 亚洲欧美成人综合| 欧美成人日本| 亚洲午夜精品一区二区| 国产精品乱子乱xxxx| 欧美激情无毛| 国产日韩免费| 国产精品草草| 亚洲在线观看| 亚洲小说欧美另类婷婷| 国产精品日韩欧美一区二区| 欧美精品色网| 亚洲欧美高清| 亚洲三级影院| 欧美黄色精品| 国产婷婷精品| 亚洲成人在线| 欧美日韩一区二区高清| 翔田千里一区二区| 亚洲美女色禁图| 国产精品久久国产三级国电话系列| 久久xxxx精品视频| 99精品国产高清一区二区| 午夜日韩激情| 久久久久网址| 午夜亚洲性色福利视频| 亚洲久久成人| 在线观看不卡| 激情成人综合| 国内在线观看一区二区三区| 午夜精品免费| 久久中文精品| 麻豆成人小视频| 国产精品夜夜夜| 亚洲乱码久久| 亚洲国产精品一区二区第四页av| 欧美另类一区| 欧美精品尤物在线| 久久影院亚洲| 国内精品久久久久久久97牛牛| 亚洲高清成人| 国内精品久久久久久久影视蜜臀| 美女精品在线观看| 亚洲一区影院| 新67194成人永久网站| av不卡在线看| 欧美日韩免费高清| 午夜欧美精品| 欧美精品午夜| 欧美日韩国产亚洲一区| 欧美福利精品| 午夜精品久久久久99热蜜桃导演| 久久婷婷一区| 久久亚洲高清| 欧美激情第六页| 欧美日一区二区在线观看| 欧美日韩无遮挡| 亚洲国产精品一区制服丝袜 | 国产综合欧美在线看| 极品中文字幕一区| 亚洲人成人一区二区三区| 中日韩视频在线观看| 久久精品欧洲| 国产中文一区| 中文在线一区| 久久综合九色99| 伊甸园精品99久久久久久| 一区二区三区四区国产| 久久激情视频| 精品99视频| 亚洲影视在线| 欧美日韩综合| 一区二区三区视频在线播放| 亚洲综合精品四区| 国产精品久久7| 国产精品久久国产愉拍| 欧美精品福利| 国产精品一区二区三区四区五区 | 韩日午夜在线资源一区二区| 99香蕉国产精品偷在线观看 | 欧美在线亚洲| 亚洲精品欧洲| 欧美 日韩 国产一区二区在线视频 | 午夜视频一区| 国产欧美日本| 伊人激情综合| 国产日韩1区| 国产精品久久| 亚洲影音先锋| 黄色一区二区三区四区| 免费亚洲网站| 99热精品在线| 激情综合视频| 欧美凹凸一区二区三区视频| 日韩亚洲视频| 韩国亚洲精品| 久久精品一区二区三区中文字幕 | 免费日韩一区二区| 亚洲另类自拍| 蜜桃久久av| 午夜亚洲视频| 亚洲精品三级| 狠狠色狠狠色综合日日tαg| 蜜桃av综合| 亚洲欧美不卡| 国产精品久久一区二区三区| 亚洲国产片色| 永久域名在线精品| 好看的av在线不卡观看| 欧美日韩久久| 欧美日韩免费精品| 激情欧美一区| 午夜亚洲福利| av不卡在线| 好吊一区二区三区| 午夜视频一区| 欧美精品aa| 欧美日韩精品一本二本三本| 国产毛片一区| 久久一区激情| 精品动漫av| 亚洲一区二区三区免费观看 | 欧美日本亚洲韩国国产| 美日韩免费视频| 国产精品三区www17con| 国产日韩一区二区| 亚洲影音先锋| 久久久精品日韩| 欧美1区2区3区| 欧美日韩中文| 雨宫琴音一区二区在线| 日韩一级大片| 久久av二区| 欧美午夜不卡影院在线观看完整版免费| 欧美在线三级| 亚洲午夜激情| 国产偷自视频区视频一区二区| 国产精品试看| 欧美88av| 国产精品久久久对白| 欧美日韩精品综合| 在线日韩av| 国产美女在线精品免费观看| 久久狠狠久久综合桃花| 欧美人与禽猛交乱配视频| 在线观看视频日韩| 亚洲一区日韩在线| 欧美日韩网址| 欧美网站在线| 久久国产精品久久精品国产| 午夜欧美精品| 亚洲毛片一区| 亚洲欧美日韩国产一区| 欧美二区不卡| 99一区二区| 欧美一区二区三区在线免费观看| 国产精品二区三区四区| 中文亚洲字幕| 欧美日本一区| 亚洲一区三区视频在线观看| 欧美日韩一区在线观看视频| 亚洲黄色影片| 欧美日韩国产综合网| 香蕉久久夜色精品国产|