亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

iOS彈幕開發中遇到的問題匯總

2020-07-26 02:33:12
字體:
來源:轉載
供稿:網友

前言

彈幕在現在的各類視頻中都有,也是每位開發者們必須會的一個功能,最近在開發中就遇到了一些問題,下面簡單說說彈幕開發碰到的兩個小問題。

正文

  • 需求:實現一個彈幕容器,里面同時會有多行互不重疊的、運動中的彈幕 。每一條彈幕均需要支持點擊事件。
  • 用腳底板想的方法:在彈幕容器里面創建幾個 UIButton,并且 addTarget,增加點擊事件。最后利用 UIView 的 block API 實現動畫。
  • 結果:嗯...可惜的是,代碼運行起來,你會發現在 UIButton 運動過程,點擊事件并沒有響應,而且非常奇怪的是:為什么在 UIButton 動畫過程,去點擊 UIButton 動畫的終點,點擊事件竟然響應了??這是為什么呢?
  • Core Anmation 動畫過程原理的引用:

在iOS中,屏幕每秒鐘重繪60次。如果動畫時長比60分之一秒要長,Core Animation就需要在設置一次新值和新值生效之間,對屏幕上的圖層進行重新組織。這意味著CALayer除了“真實”值(就是你設置的值)之外,必須要知道當前顯示在屏幕上的屬性值的記錄。

每個圖層屬性的顯示值都被存儲在一個叫做呈現圖層的獨立圖層當中,他可以通過-presentationLayer方法來訪問。這個呈現圖層實際上是模型圖層的復制,但是它的屬性值代表了在任何指定時刻當前外觀效果。換句話說,你可以通過呈現圖層的值來獲取當前屏幕上真正顯示出來的值。

補充:模型圖層在動畫開始的那一刻就已經達到終點位置,響應點擊事件的也是它。

解決辦法:

重寫彈幕容器 view 的 touchesBegan 方法。代碼如下:

@interface ZYYBarrageView ()@property (nonatomic, strong) UIView *redView; // 將要做平移的 subview@end@implementation ZYYBarrageView- (instancetype)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) {  [self commonInit]; }   return self;}- (void)commonInit { self.redView = [[UIView alloc] initWithFrame:CGRectMake(0.f, 0.f, 30.f, 30.f)]; self.redView.backgroundColor = [UIColor redColor]; [self addSubview:self.redView];}- (void)touchesBegan:(NSSet<uitouch *> *)touches withEvent:(UIEvent *)event { // 重點開始!!UITouch 獲取在 barrageView 坐標系下的坐標 CGPoint touchPoint = [[touches anyObject] locationInView:self]; // 判斷觸摸點是否在 redView 的呈現樹的框框之中 if ([self.redView.layer.presentationLayer hitTest:touchPoint]) {  // 響應紅色塊點擊  return; } else { }}</uitouch *>

進一步的需求:在 ZYYBarrageView 的同一層級,但層次偏后會有 UIButton。正常情況下,因為 ZYYBarrageView 的存在,UIButton 是無法響應點擊事件的。代碼如下:

@property (nonatomic, strong) ZYYBarrageView *barrageView; // 彈幕 view 支持多行 view 在里面進行運動@property (nonatomic, strong) UIButton *yellowBtn; // 靠后的 UIButton- (void)viewDidLoad { [super viewDidLoad];  // self.yellowBtn 位于 self.barrageView 之后 [self.view addSubview:self.yellowBtn]; [self.view addSubview:self.barrageView];}- (ZYYBarrageView *)barrageView { if (!_barrageView) {  _barrageView = [[ZYYBarrageView alloc] initWithFrame:CGRectMake(0.f, 30.f, SCREEN_WIDTH, 30.f)];  _barrageView.backgroundColor = [UIColor clearColor]; }  return _barrageView;}- (UIButton *)yellowBtn { if (!_yellowBtn) {  _yellowBtn = [UIButton buttonWithType:UIButtonTypeCustom];  _yellowBtn.frame = CGRectMake(90.f, 30.f, 80.f, 30.f);  _yellowBtn.backgroundColor = [UIColor yellowColor];  [_yellowBtn setTitle:@"黃色按鈕" forState:UIControlStateNormal];  [_yellowBtn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];  [_yellowBtn addTarget:self action:@selector(onYellowBtn:) forControlEvents:UIControlEventTouchUpInside]; }   return _yellowBtn;}- (void)onYellowBtn:(id)sender { // 響應黃色按鈕}

怎么辦?

Responder Chain 原理講解:手指點擊屏幕,經過系統響應(之前過程省略不說,文末有參考鏈接),調用 UIApplication 的 sendEvent: 方法,將 UIEvent 傳給 UIWindow, 通過遞歸調用 UIView 層級的 hitTest(_:with:) ,結合 point(inside:with:) 找到 UIEvent 中每一個UITouch 所屬的 UIView(其實是想找到離觸摸事件點最近的那個 UIView)。這個過程是從 UIView 層級的最頂層往最底層遞歸查詢。同一層級的 UIView,會優先深度遍歷界面靠前的 UIView。找到最底層 UIView 后,沿著 Responder Chain 逐步向上傳遞(UIControl 子類默認會攔截傳遞)。

解決思路:重寫 ZYYBarrageView 的 hitTest(_:with:) 方法。代碼如下:

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { BOOL isPointInsideSubview = [self.redView.layer.presentationLayer hitTest:point]; if (isPointInsideSubview == NO) {  // 如果沒有點擊在移動的 redView 上,返回 nil  // 系統會去遍歷位于 ZYYBarrageView 后面的 UIButton,UIButton 能得到響應  return nil; } else {  return [super hitTest:point withEvent:event]; }}

如此,可以完美解決啦~

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對武林網的支持。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美亚洲午夜视频在线观看| 国产91精品久久久| 成人午夜激情网| 日韩成人激情视频| 亚洲 日韩 国产第一| 欧美一级淫片丝袜脚交| 亚洲大尺度美女在线| 国产精品久久久久久久久久久久| 国产亚洲美女精品久久久| 日韩av成人在线| 狠狠躁夜夜躁人人躁婷婷91| 色偷偷888欧美精品久久久| 欧美成人精品一区二区| 国产婷婷97碰碰久久人人蜜臀| www欧美xxxx| 成人欧美一区二区三区在线| 国外成人在线播放| 亚洲欧美三级伦理| 日韩在线视频一区| 久久精品免费电影| 日韩欧美在线视频日韩欧美在线视频| 欧美日韩国产影院| 日本一区二区三区在线播放| 精品亚洲va在线va天堂资源站| 国产中文字幕亚洲| 高跟丝袜欧美一区| 成人午夜小视频| 欧美成人精品激情在线观看| 国产深夜精品福利| 国产精品美乳在线观看| 2018中文字幕一区二区三区| 午夜精品久久久久久久男人的天堂| 日本最新高清不卡中文字幕| 伊人久久免费视频| 欧美日韩国产一区二区三区| 欧美午夜丰满在线18影院| 伊人成人开心激情综合网| 国产日韩精品电影| 奇米四色中文综合久久| 国产日韩中文字幕| 国产精品xxx视频| 精品久久久香蕉免费精品视频| 久久综合九色九九| 亚洲国产欧美在线成人app| 欧美性猛交xxxx乱大交3| 亚洲最新视频在线| 精品国产一区二区三区四区在线观看| 欧美国产亚洲精品久久久8v| 国产高清在线不卡| 国产精品观看在线亚洲人成网| 按摩亚洲人久久| 国产精品网红直播| 中文字幕日韩欧美精品在线观看| 成人国产精品色哟哟| 国产97在线观看| 亚洲国产黄色片| 国产精品最新在线观看| 欧美日韩国产区| 国产精品h片在线播放| 亚洲国产天堂久久综合| 在线观看日韩专区| 欧美午夜www高清视频| 欧美成人午夜影院| 奇米成人av国产一区二区三区| 亚洲级视频在线观看免费1级| 日av在线播放中文不卡| 九九热r在线视频精品| 91高清视频在线免费观看| 国产精品久久久久久久app| 一区二区欧美激情| 欧美激情第一页xxx| 2020久久国产精品| 亚洲国产成人久久| 日韩三级成人av网| 国产99视频精品免视看7| 久久精品中文字幕免费mv| 色综久久综合桃花网| 亚洲韩国日本中文字幕| 亚洲欧美色婷婷| 成人福利视频网| 性欧美长视频免费观看不卡| 岛国视频午夜一区免费在线观看| 岛国av一区二区三区| 欧美日韩一区二区三区在线免费观看| 亚洲欧洲成视频免费观看| 国产亚洲视频在线观看| 中文字幕在线成人| 欧美视频在线视频| 97碰在线观看| 国产欧美精品日韩精品| 欧美在线观看www| 欧美日韩久久久久| 日韩av在线网页| 热久久美女精品天天吊色| 国产精品视频网址| 久久久久久久久国产精品| 日韩精品高清视频| 日韩经典中文字幕| xxav国产精品美女主播| 国产欧美日韩91| 久久久精品美女| 日韩高清电影免费观看完整| 欧美日韩亚洲视频| 亚洲视频电影图片偷拍一区| 97久久精品人人澡人人爽缅北| 日韩欧美亚洲一二三区| 国产精品极品美女在线观看免费| 中文字幕久久精品| 91日本在线视频| 成人av.网址在线网站| 日韩在线观看免费高清| 国产精品久久久久久久久久ktv| 国产视频在线观看一区二区| 日本电影亚洲天堂| 欧美日韩在线免费观看| 国产精品久久久久av免费| 综合国产在线观看| 亚洲图片欧美日产| 亚洲国产美女精品久久久久∴| 久久躁狠狠躁夜夜爽| 亚洲第一页在线| 精品偷拍各种wc美女嘘嘘| 久久大大胆人体| 日韩高清电影免费观看完整版| 欧美韩国理论所午夜片917电影| 欧美精品久久久久久久免费观看| 日韩专区在线播放| 国产精品视频导航| 在线日韩日本国产亚洲| 色悠久久久久综合先锋影音下载| 亚洲人免费视频| 欧美黄色片视频| 欧美精品福利视频| 亚洲理论在线a中文字幕| 国产成人精品999| 77777少妇光屁股久久一区| 美女久久久久久久久久久| 午夜精品久久久久久久男人的天堂| 日韩电影网在线| 日韩国产激情在线| 一区二区三区回区在观看免费视频| 日韩av在线看| 成人做爽爽免费视频| 国产福利成人在线| 久久久精品亚洲| 成人在线国产精品| 国产日本欧美一区二区三区在线| 一区二区av在线| 精品国产福利视频| 久久久最新网址| 亚洲美女又黄又爽在线观看| 久久91精品国产91久久久| 欧美激情第6页| 国外视频精品毛片| 日韩成人在线视频| 欧美一区三区三区高中清蜜桃| 91网站在线免费观看| 欧美成人激情图片网| 精品国产一区二区三区在线观看| 亚洲欧洲自拍偷拍| 亚洲片在线资源| 国产一区二区三区高清在线观看| 国产精品羞羞答答| 国产精品久久久久久av福利|