真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

iOS彈幕開發(fā)中遇到的問題有哪些

小編給大家分享一下iOS彈幕開發(fā)中遇到的問題有哪些,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

公司主營(yíng)業(yè)務(wù):網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)、移動(dòng)網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。創(chuàng)新互聯(lián)公司是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)公司推出無棣免費(fèi)做網(wǎng)站回饋大家。

正文

  • 需求:實(shí)現(xiàn)一個(gè)彈幕容器,里面同時(shí)會(huì)有多行互不重疊的、運(yùn)動(dòng)中的彈幕 。每一條彈幕均需要支持點(diǎn)擊事件。

  • 用腳底板想的方法:在彈幕容器里面創(chuàng)建幾個(gè) UIButton,并且 addTarget,增加點(diǎn)擊事件。最后利用 UIView 的 block API 實(shí)現(xiàn)動(dòng)畫。

  • 結(jié)果:嗯...可惜的是,代碼運(yùn)行起來,你會(huì)發(fā)現(xiàn)在 UIButton 運(yùn)動(dòng)過程,點(diǎn)擊事件并沒有響應(yīng),而且非常奇怪的是:為什么在 UIButton 動(dòng)畫過程,去點(diǎn)擊 UIButton 動(dòng)畫的終點(diǎn),點(diǎn)擊事件竟然響應(yīng)了??這是為什么呢?

  • Core Anmation 動(dòng)畫過程原理的引用:

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

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

補(bǔ)充:模型圖層在動(dòng)畫開始的那一刻就已經(jīng)達(dá)到終點(diǎn)位置,響應(yīng)點(diǎn)擊事件的也是它。

解決辦法:

重寫彈幕容器 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 *)touches withEvent:(UIEvent *)event {
 // 重點(diǎn)開始!!UITouch 獲取在 barrageView 坐標(biāo)系下的坐標(biāo)
 CGPoint touchPoint = [[touches anyObject] locationInView:self];
 // 判斷觸摸點(diǎn)是否在 redView 的呈現(xiàn)樹的框框之中
 if ([self.redView.layer.presentationLayer hitTest:touchPoint]) {
  // 響應(yīng)紅色塊點(diǎn)擊
  return;
 } else {
 }
}

進(jìn)一步的需求:在 ZYYBarrageView 的同一層級(jí),但層次偏后會(huì)有 UIButton。正常情況下,因?yàn)?ZYYBarrageView 的存在,UIButton 是無法響應(yīng)點(diǎn)擊事件的。代碼如下:

@property (nonatomic, strong) ZYYBarrageView *barrageView; // 彈幕 view 支持多行 view 在里面進(jìn)行運(yùn)動(dòng)
@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 {
 // 響應(yīng)黃色按鈕
}

怎么辦?

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

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

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

以上是“iOS彈幕開發(fā)中遇到的問題有哪些”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!


文章標(biāo)題:iOS彈幕開發(fā)中遇到的問題有哪些
鏈接URL:http://weahome.cn/article/pjohgo.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部