Swift 類似于微信帶箭頭的View

前言: 學(xué)習(xí)Swift語法的同時, 加上一點點的小實踐. 囧~
OC版本帶箭頭的View
OC&Swift版本的Demo如果你想看看

  • 熟悉swift語法
  • Swift中的drawRect
  • 擴(kuò)展閱讀
  • Swift源碼推薦
  • 一如既往的圖文并茂
效果演示f

這里我只做了箭頭在上方中心位置作為演示, 如需要箭頭的位置改變可參照我上面提到的文章.

// 然而我還是定義了一個枚舉, 然而并沒有用 [大笑](就當(dāng)做熟悉一下語法好啦)
enum ArrowOfDirection {
    case XTUpCenter
}

構(gòu)造過程

var bgView = UIView()
    var origin = CGPoint()
    var height = 0.0
    var width = 0.0
    var arrow = ArrowOfDirection.XTUpCenter
    // 初始化方法
    required init(origin: CGPoint, width: Double, height: Double) {
        super.init(frame: CGRect.init(x: 0, y: 0, width: UIScreen.main.bounds.size.width, height: UIScreen.main.bounds.height))
        self.backgroundColor = UIColor.clear
        self.origin = origin
        self.width = Double(width)
        self.height = Double(height)
        let x = Double(origin.x)
        let y = Double(origin.y)
        bgView = UIView.init(frame: CGRect.init(x: x, y: y, width: width, height: height))
        self.addSubview(self.bgView)
    }
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

畫出一個箭頭

override func draw(_ rect: CGRect) {
        let context = UIGraphicsGetCurrentContext()
        
        let startX = self.origin.x
        let startY = self.origin.y
        
        context?.move(to: CGPoint.init(x: startX, y: startY))
        // 畫出兩條線
        context?.addLine(to: CGPoint.init(x: startX + 5.0, y: startY + 5.0))
        context?.addLine(to: CGPoint.init(x: startX - 5.0, y: startY + 5.0))
        
        context?.closePath()
        // 填充顏色
        self.bgView.backgroundColor?.setFill()
        self.backgroundColor?.setStroke()
        context?.drawPath(using: CGPathDrawingMode.fillStroke)
    }
func popView()->Void{
        // 創(chuàng)建keyWindow
        let window = UIApplication.shared.keyWindow
        window?.addSubview(self)
        self.bgView.frame = CGRect.init(x: self.origin.x, y: self.origin.y + 5.0, width: 0, height: 0)
        // 類型CGFloat -> Double
        let originX = Double(self.origin.x) - self.width / 2
        let originY = Double(self.origin.y) + 5.0
        let width = self.width
        let height = self.height
        // 這里為什么抽出一個方法呢, 如果有很多類型箭頭就方便很多, 可以看看OC版本
        self.updateFrame(x: originX, y: originY, width: width, height: height)
        
    }

調(diào)整Frame
touchesBegan這個方法完成點擊除黑色View以外的部分, 移除View操作

func updateFrame(x: Double, y: Double, width: Double, height: Double){
        self.bgView.frame = CGRect.init(x: x, y: y, width: width, height: height)
    }
    
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        // 這里遍歷包含UITouch的集合, 從中找到黑色View
        for touch: AnyObject in touches {
            let t:UITouch = touch as! UITouch
            if(!(t.view?.isEqual(self.bgView))!){
                self.dismiss()
            }
        }
    }

移除方法 , 順便感受一下Swift GCD 操作

func dismiss()->Void{
        let delay = DispatchTime.now() + DispatchTimeInterval.seconds(1)
        DispatchQueue.main.asyncAfter(deadline: delay) {
            // 延遲執(zhí)行
            let res = self.subviews
            for view in res {
                view.removeFromSuperview()
            }
            self.removeFromSuperview()
        }
    }

推薦閱讀 卓同學(xué)的文章
Swift 3必看:從使用場景了解GCD新API

源碼推薦
https://github.com/tristanhimmelman/HidingNavigationBar

介紹

  • 隱藏導(dǎo)航欄
  • 隱藏導(dǎo)航欄+ Extension View
  • 隱藏導(dǎo)航欄+ ToolBar
  • 隱藏導(dǎo)航欄+ TabBar
效果演示

如果可以 請給我點個喜歡 0.O
文 / 夏天然后
一個喜歡瞎折騰的偽文藝青年 如果對你有所幫助請點贊/關(guān)注我 摸摸d

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末最铁,一起剝皮案震驚了整個濱河市晴裹,隨后出現(xiàn)的幾起案子蛛勉,更是在濱河造成了極大的恐慌稽鞭,老刑警劉巖莲绰,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件呕乎,死亡現(xiàn)場離奇詭異荚斯,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)霉颠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進(jìn)店門对碌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蒿偎,你說我怎么就攤上這事朽们。” “怎么了诉位?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵骑脱,是天一觀的道長。 經(jīng)常有香客問我不从,道長惜姐,這世上最難降的妖魔是什么犁跪? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任椿息,我火速辦了婚禮歹袁,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘寝优。我一直安慰自己条舔,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布乏矾。 她就那樣靜靜地躺著孟抗,像睡著了一般。 火紅的嫁衣襯著肌膚如雪钻心。 梳的紋絲不亂的頭發(fā)上凄硼,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天,我揣著相機(jī)與錄音捷沸,去河邊找鬼摊沉。 笑死,一個胖子當(dāng)著我的面吹牛痒给,可吹牛的內(nèi)容都是我干的说墨。 我是一名探鬼主播,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼苍柏,長吁一口氣:“原來是場噩夢啊……” “哼尼斧!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起试吁,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤棺棵,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后熄捍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體律秃,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了挠唆。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瘫絮。...
    茶點故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖船惨,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情缕陕,我是刑警寧澤粱锐,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站扛邑,受9級特大地震影響怜浅,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一恶座、第九天 我趴在偏房一處隱蔽的房頂上張望搀暑。 院中可真熱鬧,春花似錦跨琳、人聲如沸自点。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽桂敛。三九已至,卻和暖如春溅潜,著一層夾襖步出監(jiān)牢的瞬間术唬,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工滚澜, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留碴开,地道東北人。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓博秫,卻偏偏與公主長得像潦牛,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子挡育,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,901評論 2 355

推薦閱讀更多精彩內(nèi)容