一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - IOS - iOS高仿微信文章懸浮球功能

iOS高仿微信文章懸浮球功能

2021-05-08 23:44yyuuzhu IOS

這篇文章主要介紹了iOS高仿微信文章懸浮球功能,本文給大家介紹的非常詳細,具有一定的參考解決價值,需要的朋友可以參考下

iOS高仿微信文章懸浮球功能

前言

微信在最新版本6.6.7,新加了一個文章懸浮球功能。當你正在閱讀文章的時候,突然有好友發來了緊急消息,你需要立即回復。又或者你剛好路過小吃店,需要臨時打開微信支付,等等臨時中斷閱讀的情況。以前只有退出文章詳情頁面,處理完事情之后,再挨著挨著找到原來的文章。對于我們這種重度微信使用者來說,每次遭遇這種情況,真的很蛋疼。所以,當這個功能推出的事情,立馬更新了最新版本,這個功能感覺就像遇到了知心人一樣,用起來十分順手。可以通過下面的動圖感受一下

iOS高仿微信文章懸浮球功能

其實懸浮球的概念早就有了。比如360助手的流量監控球,iphone自帶的assitivetouch(就是那個可愛的小白球)等等。

倉庫地址

github地址 喜歡就點顆:heart:

核心技術點

體驗過后,讓人手癢癢,情不自禁得想要模仿一把。如果你的app可以集成該功能,我覺得可以讓你的app逼格瞬間提升一個level。好了,下面讓我們來一一解剖,微信文章懸浮球的核心技術點:

1.懸浮球的出現

當我們通過屏幕邊緣手勢pop視圖的時候,右下角會有一個圓角提示圖,跟著手勢進度移動。

如何獲取到uiscreenedgepangesturerecognizer的進度呢?

因為系統自帶的interactivepopgesturerecognizer是被封裝起來的,它的action我們無法掛鉤拿到里面的手勢進度。所以,需要另辟蹊徑了。

首先,讓uinavigationcontroller的delegate等于自己,然后讓多個手勢可以同時響應。

?
1
2
3
4
5
self.interactivepopgesturerecognizer?.delegate = self
 
func gesturerecognizer(_ gesturerecognizer: uigesturerecognizer, shouldrecognizesimultaneouslywith othergesturerecognizer: uigesturerecognizer) -> bool {
  return true
 }

然后自己添加一個uiscreenedgepangesturerecognizer到uinavigationcontroller上面,用于獲取pop手勢的進度。

?
1
2
3
let gesture = uiscreenedgepangesturerecognizer(target: self, action: #selector(handlenavigationtransition(gesture:)))
gesture.edges = .left
self.view.addgesturerecognizer(gesture)

這樣子,有兩個uiscreenedgepangesturerecognizer可以同時響應,系統自帶的依然保持原有邏輯不動,我們新增的用于獲取pop手勢進度,兩者井水不犯河水,其樂融融。

2.懸浮球全局置頂

既然懸浮球可以在懸浮在任何一個頁面,必然是放在一個新的uiwindow上面。比如系統的鍵盤彈出的時候,就是一個uiremotekeyboardwindow在承載。

然后這個window的生命周期不依賴某一個頁面,所以用單例實現比較好。這塊代碼比較分散,直接看源碼就可以了解

3.事件響應

懸浮uiwindow的事件傳遞

只要事件位置沒有在圓球和右下角上,就不響應

?
1
2
3
4
5
6
7
8
9
10
11
override func point(inside point: cgpoint, with event: uievent?) -> bool {
  let roundentryviewpoint = self.convert(point, to: roundentryview)
  if roundentryview.point(inside: roundentryviewpoint, with: event) == true {
   return true
  }
  let collectviewpoint = self.convert(point, to: collectview)
  if collectview.point(inside: collectviewpoint, with: event) == true {
   return true
  }
  return false
 }

右下角四分之一圓,事件響應

可以看到微信,只有當手指移動進右下角圓內,才能進行懸浮。而不是按著視圖的frame來響應。

首先,通過uibezierpath畫一個四分之一圓,然后用cgpath的contains(point)方法判斷。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
func updatebglayerpath(issmall: bool) {
  var ratio:cgfloat = 1
  if !issmall {
   ratio = 1.3
  }
  let path = uibezierpath()
  path.move(to: cgpoint(x: viewsize.width, y: (1 - ratio)*viewsize.height))
  path.addline(to: cgpoint(x: viewsize.width, y: viewsize.height))
  path.addline(to: cgpoint(x: (1 - ratio)*viewsize.width, y: viewsize.height))
  path.addarc(withcenter: cgpoint(x: viewsize.width, y: viewsize.height), radius: viewsize.width*ratio, startangle: cgfloat(double.pi), endangle: cgfloat(double.pi*3/2), clockwise: true)
  path.close()
  bglayer.path = path.cgpath
 }
 override func point(inside point: cgpoint, with event: uievent?) -> bool {
  return bglayer.path!.contains(point)
 }

4.自定義轉場動畫

可以看到點擊懸浮球打開的文章,是通過一個自定義轉場動畫實現的,從懸浮球的位置開始展開。

有許多文章都有講解如何自定義轉場動畫,但是我推薦你看這篇文章 幾句代碼快速集成自定義轉場效果+ 全手勢驅動

實現效果

iOS高仿微信文章懸浮球功能

總結

微信的懸浮球,用到的技術點相對比較多,代碼也比較分    散,如果你的app要集成該功能,需要認真封裝代碼。

相對于如何實現,我認為如何設計好一個需求更重要。我在模仿的過程中,發現其中有許多細節的邏輯,彼此環環相扣,最終就呈現出了你正在使用的懸浮球功能。

都說程序員和產品經理是相愛相殺,在這里我要為該功能的產品經理點個贊

倉庫地址

如果代碼中有任何問題,否則你有任何疑問,都可以反饋給我,我將第一時間處理。

github地址 喜歡就點顆:heart:

總結

以上所述是小編給大家介紹的ios高仿微信文章懸浮球功能,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對服務器之家網站的支持!

原文鏈接:http://www.cocoachina.com/ios/20180816/24588.html

延伸 · 閱讀

精彩推薦
  • IOSiOS開發之視圖切換

    iOS開發之視圖切換

    在iOS開發中視圖的切換是很頻繁的,獨立的視圖應用在實際開發過程中并不常見,除非你的應用足夠簡單。在iOS開發中常用的視圖切換有三種,今天我們將...

    執著丶執念5282021-01-16
  • IOSiOS中UILabel實現長按復制功能實例代碼

    iOS中UILabel實現長按復制功能實例代碼

    在iOS開發過程中,有時候會用到UILabel展示的內容,那么就設計到點擊UILabel復制它上面展示的內容的功能,也就是Label長按復制功能,下面這篇文章主要給大...

    devilx12792021-04-02
  • IOSiOS開發技巧之狀態欄字體顏色的設置方法

    iOS開發技巧之狀態欄字體顏色的設置方法

    有時候我們需要根據不同的背景修改狀態欄字體的顏色,下面這篇文章主要給大家介紹了關于iOS開發技巧之狀態欄字體顏色的設置方法,文中通過示例代碼...

    夢想家-mxj8922021-05-10
  • IOSiOS中滑動控制屏幕亮度和系統音量(附加AVAudioPlayer基本用法和Masonry簡單使用)

    iOS中滑動控制屏幕亮度和系統音量(附加AVAudioPlayer基本用法和

    這篇文章主要介紹了iOS中滑動控制屏幕亮度和系統音量(附加AVAudioPlayer基本用法和Masonry簡單使用)的相關資料,需要的朋友可以參考下...

    CodingFire13652021-02-26
  • IOS詳解iOS中多個網絡請求的同步問題總結

    詳解iOS中多個網絡請求的同步問題總結

    這篇文章主要介紹了詳解iOS中多個網絡請求的同步問題總結,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧...

    liang199111312021-03-15
  • IOSiOS自定義UICollectionViewFlowLayout實現圖片瀏覽效果

    iOS自定義UICollectionViewFlowLayout實現圖片瀏覽效果

    這篇文章主要介紹了iOS自定義UICollectionViewFlowLayout實現圖片瀏覽效果的相關資料,需要的朋友可以參考下...

    jiangamh8882021-01-11
  • IOSiOS中MD5加密算法的介紹和使用

    iOS中MD5加密算法的介紹和使用

    MD5加密是最常用的加密方法之一,是從一段字符串中通過相應特征生成一段32位的數字字母混合碼。對輸入信息生成唯一的128位散列值(32個字符)。這篇文...

    LYSNote5432021-02-04
  • IOSiOS實現控制屏幕常亮不變暗的方法示例

    iOS實現控制屏幕常亮不變暗的方法示例

    最近在工作中遇到了要將iOS屏幕保持常亮的需求,所以下面這篇文章主要給大家介紹了關于利用iOS如何實現控制屏幕常亮不變暗的方法,文中給出了詳細的...

    隨風13332021-04-02
主站蜘蛛池模板: 99热国产在线观看 | 青草国产福利视频免费观看 | 国产香蕉国产精品偷在线观看 | 亚洲欧美色综合图小说 | 草草视频在线免费观看 | 99久久99热久久精品免费看 | 特黄特黄一级片 | 美女裆部 | 成人影院在线观看视频 | 99这里只有精品66视频 | 免费看片黄 | 出差上的少妇20p | 婷婷影院在线观看 | 国产高清ujzzujzz | 女仆色永久免费网站 | 亚洲视频一区二区在线观看 | beeg最新 | 国产精品日本一区二区三区在线看 | 二次元美女互摸隐私互扒 | 欧美黑人ⅹxxx片 | 图片专区亚洲欧美另类 | 免费在线观看亚洲 | 亚洲第一在线播放 | 国产suv精品一区二区四区三区 | 日本哺乳期网站xxxx | 成人啪精品视频免费网站 | 四虎免费在线视频 | 牛牛在线观看 | 九九热视频 这里有精品 | 欧美粗黑巨大gay | 日本免费一区二区三区四区五六区 | 国产一区二区三区水野朝阳 | 99热久久这里只有精品23 | 亚洲图片综合区 | 精品国产免费久久久久久婷婷 | 私人影院在线播放 | 91专区 | 国产色司机在线视频免费观看 | gogort人体的最新网站 | 岛国虐乳紧缚媚药调教 | 久久青草费线频观看国产 |