根據(jù)版本是否變動(dòng)來(lái)顯示對(duì)應(yīng)啟動(dòng)頁(yè)(Swift)

利用UICollectionView實(shí)現(xiàn)新特性啟動(dòng)頁(yè)缰盏。沒(méi)有新版本的情況下,程序運(yùn)行展示默認(rèn)啟動(dòng)圖淹遵。附帶跳過(guò)默認(rèn)啟動(dòng)圖口猜。

首次運(yùn)行或有新版本時(shí)
2017-01-11 13_52_45.gif
import UIKit

private let reuseIdentifier = "Cell"

class FcNewfeaturesCollectionVC: UICollectionViewController {

    fileprivate let pageCount = 4
    fileprivate var layout:UICollectionViewFlowLayout = NewfeaturesLayout()
    
    /** 指示器 */
    fileprivate lazy var page: UIPageControl = {
        let page = UIPageControl()
        page.pageIndicatorTintColor = UIColor.lightGray
        page.currentPageIndicatorTintColor = UIColor.red
        page.isUserInteractionEnabled = false
        return page
    }()
    
    // 初始化
    init() {
        super.init(collectionViewLayout: layout)
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        self.view?.addSubview(self.page)
        self.page.numberOfPages = self.pageCount
        self.page.frame = CGRect(x: (UIScreen.main.bounds.size.width - 100) / 2, y: UIScreen.main.bounds.size.height - 80, width: 100, height: 10)
        
        self.collectionView!.register(FcNewfeaturesCell.self, forCellWithReuseIdentifier: reuseIdentifier)
    }


// MARK: UICollectionViewDataSource
    override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return pageCount
    }

    override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath) as! FcNewfeaturesCell
        cell.imageIndex = indexPath.item
        return cell
    }

// MARK: UICollectionViewDelegate
    // 完全顯示cell之后調(diào)用
    override func collectionView(_ collectionView: UICollectionView, didEndDisplaying cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {
        // 1.拿到當(dāng)前顯示的cell對(duì)應(yīng)的索引
        let path = collectionView.indexPathsForVisibleItems.last!
        // 2、判斷是否是最后一個(gè)cell
        if path.item == (pageCount - 1) {
            // 拿到當(dāng)前索引對(duì)應(yīng)的cell
            let cell = collectionView.cellForItem(at: path) as! FcNewfeaturesCell
            // 讓cell執(zhí)行按鈕動(dòng)畫(huà)
            cell.startAnimation()
        }
    }
    
    // 監(jiān)聽(tīng)collectionView的滾到
    override func scrollViewDidScroll(_ scrollView: UIScrollView) {
        // 1透揣、獲取滾動(dòng)的偏移量 + scrollView.bounds.width * 0.5給偏移量加一半济炎,當(dāng)滑動(dòng)一般就滾動(dòng)pageControl的當(dāng)前選中
        let offsetX = scrollView.contentOffset.x + scrollView.bounds.width * 0.5
        // 2、計(jì)算pageContra的currentIndex
        page.currentPage = Int(offsetX / scrollView.bounds.width) % self.pageCount
    }
    
}


// MARK - Cell
class FcNewfeaturesCell: UICollectionViewCell {
    
    /** icon */
    fileprivate lazy var iconView = UIImageView()
    /** 進(jìn)入按鈕 */
    fileprivate lazy var startButton: UIButton = {
        let button = UIButton()
        button.setBackgroundImage(UIImage(named: "new_feature_button"), for: .normal)
        button.setBackgroundImage(UIImage(named: "new_feature_button_highlighted"), for: .highlighted)
        button.isHidden = true
        button.addTarget(self, action:#selector(butClick), for: .touchUpInside)
        return button
    }()
    
    /** 保存圖片的索引 */
    fileprivate var imageIndex:Int = 0 {
        didSet{
            iconView.image = UIImage(named: "new_feature_\(imageIndex + 1)")
            startButton.isHidden = true
        }
    }
// MARK - 系統(tǒng)回調(diào)
    override init(frame: CGRect) {
        super.init(frame: frame)
        setupUI()
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    /** 設(shè)置UI */
    fileprivate func setupUI(){
        // 1.添加子控件到CollectionView上
        contentView.addSubview(iconView)
        iconView.frame = contentView.bounds
        // 2辐真、在最后一頁(yè)添加 “進(jìn)入按鈕”
        contentView.addSubview(startButton)
        startButton.frame = CGRect(x: (UIScreen.main.bounds.size.width - 150) / 2, y: 500, width: 150, height: 40)
    }
    
    /** 進(jìn)入按鈕點(diǎn)擊事件 */
    func butClick(){
        // 發(fā)送通知
        let notifyChat = NSNotification.Name(FcSwitchRootViewControllerKey)
        NotificationCenter.default.post(name: notifyChat, object: nil)
    }
    
    /** 讓按鈕開(kāi)始動(dòng)畫(huà)*/
    func startAnimation(){
        startButton.isHidden = false
        // 執(zhí)行動(dòng)畫(huà)
        startButton.transform = CGAffineTransform(scaleX: 0.0, y: 0.0)
        startButton.isUserInteractionEnabled = false
        // UIViewAnimationOptions(rawValue: 0) 等于 OC中 knilOptions
        UIView.animate(withDuration: 1.2, delay: 0.0, usingSpringWithDamping: 1.2, initialSpringVelocity: 6, options: UIViewAnimationOptions(rawValue: 0), animations: { () -> Void in
            // 還原须尚,清空形變
            self.startButton.transform = CGAffineTransform.identity
            
            }, completion: { (_) -> Void in
                self.startButton.isUserInteractionEnabled = true
        })
    }
}


// MARK - Layout
class NewfeaturesLayout: UICollectionViewFlowLayout {
    
    override func prepare() {
        // 1.設(shè)置layout布局
        itemSize = UIScreen.main.bounds.size
        minimumInteritemSpacing = 0
        minimumLineSpacing = 0
        scrollDirection = .horizontal
        // 2.設(shè)置CollectionView的屬性
        collectionView?.showsHorizontalScrollIndicator = false
        collectionView?.bounces = false
        collectionView?.isPagingEnabled = true
    }
}

無(wú)新特性展示默認(rèn)啟動(dòng)圖崖堤,自動(dòng)跳轉(zhuǎn)主頁(yè)

1、普通倒計(jì)時(shí)跳過(guò)


2017-01-11 12_58_16.gif
import UIKit
/** 倒計(jì)時(shí)總時(shí)間 */
private let kCountdownTime:Int = 5

class FcNormalWecomVC: UIViewController {
    
// MARK - 懶加載區(qū)
    /** 背景容器 */
    fileprivate lazy var bgView: UIView = {
        let view = UIView()
        view.backgroundColor = UIColor.white
        return view
    }()
    /** 啟動(dòng)圖 */
    fileprivate lazy var iconImageView: UIImageView = {
        let icon = UIImageView()
        icon.image = UIImage(named: "123")
        return icon
    }()
    /** 跳過(guò)按鈕 */
    fileprivate lazy var skipButton: UIButton = {
        let skipBut = UIButton()
        skipBut.layer.cornerRadius = 5
        skipBut.layer.borderWidth = 1
        skipBut.layer.borderColor = UIColor.red.cgColor
        skipBut.frame = CGRect(x: self.view.frame.size.width * 0.78, y: 20, width: 80, height: 25)
        skipBut.backgroundColor = UIColor.clear
        skipBut.setTitle("跳過(guò)(5s)", for: .normal)
        skipBut.setTitleColor(UIColor.red, for: .normal)
        skipBut.addTarget(self, action: #selector(normalButClick), for: .touchUpInside)
        return skipBut
    }()
    
// MARK - 屬性區(qū)
    /** 剩余時(shí)間 */
    var remainingTime: Int = 0 {
        willSet{
            skipButton.setTitle("跳過(guò)\(newValue)s", for: .normal)
            if newValue <= 0 {
                isCounting = false
            }
        }
    }
    /** 計(jì)時(shí)器 */
    var timer: Timer?
    /** 按鈕開(kāi)關(guān) */
    var isCounting:Bool = false {
        willSet {
            if newValue {
                /** 初始化計(jì)時(shí)器 */
                timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(updateTime), userInfo: nil, repeats: true)
                remainingTime = kCountdownTime
            }else {
                // 暫停且銷(xiāo)毀計(jì)時(shí)器
                timer?.invalidate()
                timer = nil
            }
        }
    }
    
// MARK - 系統(tǒng)回調(diào)
    override func viewDidLoad() {
        super.viewDidLoad()
        setupUI()
    }
    
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        // 延遲5秒執(zhí)行操作
        DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + Double(kCountdownTime)) {
            
            UIView .animate(withDuration: 0.6, animations: {
                self.bgView.alpha = 0.3
                self.bgView.transform = CGAffineTransform(scaleX: 2.0, y: 2.0)
                
                }, completion: { (bool) in
                    self.bgView.alpha = 0
                    let notifyChat = NSNotification.Name(FcSwitchRootViewControllerKey)
                    NotificationCenter.default.post(name: notifyChat, object: nil)
            })
        }
    }
}

extension FcNormalWecomVC {
    
    /** 設(shè)置UI */
    func setupUI() {
        view.backgroundColor = UIColor.white
        view.addSubview(bgView)
        self.bgView.frame = view.bounds
        self.bgView.addSubview(iconImageView)
        self.iconImageView.frame = self.bgView.bounds
        self.bgView.addSubview(skipButton)
        isCounting = true
    }
}

extension FcNormalWecomVC {
    
    /** 跳過(guò)按鈕點(diǎn)擊事件 */
    func normalButClick(){
        UIView .animate(withDuration: 0.6, animations: {
            self.bgView.alpha = 0.3
            self.bgView.transform = CGAffineTransform(scaleX: 2.0, y: 2.0)
            
            }, completion: { (bool) in
                self.bgView.alpha = 0
                // 發(fā)送通知
                let notifyChat = NSNotification.Name(FcSwitchRootViewControllerKey)
                NotificationCenter.default.post(name: notifyChat, object: nil)
        })
    }
    
    /** 更新時(shí)間 */
    func updateTime(timer: Timer){
        remainingTime -= 1
    }
}

2耐床、帶進(jìn)度條倒計(jì)時(shí)跳過(guò)


2017-01-11 16_29_10.gif
import UIKit
/** 倒計(jì)時(shí)總時(shí)間 */
private let kCountdownTime:Int = 8
/** 線(xiàn)寬 */
private let kLineWidth:CGFloat = 2.0

class FcNormalWecomVC: UIViewController {
    /** 帶進(jìn)度按鈕計(jì)時(shí)器 */
    var countView: CountDownView?
    
    /** 背景容器 */
    fileprivate lazy var bgView: UIView = {
        let view = UIView()
        view.backgroundColor = UIColor.white
        return view
    }()
    /** 啟動(dòng)圖 */
    fileprivate lazy var iconImageView: UIImageView = {
        let icon = UIImageView()
        icon.image = UIImage(named: "123")
        return icon
    }()

// MARK:- 系統(tǒng)回調(diào)
    override func viewDidLoad() {
        super.viewDidLoad()
        setupUI()
    }
    
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        // 延遲5秒執(zhí)行操作
        DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + Double(kCountdownTime)) {
            
            UIView .animate(withDuration: 0.6, animations: {
                self.bgView.alpha = 0.3
                self.bgView.transform = CGAffineTransform(scaleX: 2.0, y: 2.0)
                
                }, completion: { (bool) in
                    self.bgView.alpha = 0
                    let notifyChat = NSNotification.Name(FcSwitchRootViewControllerKey)
                    NotificationCenter.default.post(name: notifyChat, object: nil)
            })
        }
    }
}

// MARK:- 設(shè)置UI
extension FcNormalWecomVC {
    
    fileprivate func setupUI() {
        view.backgroundColor = UIColor.white
        view.addSubview(bgView)
        self.bgView.frame = view.bounds
        self.bgView.addSubview(iconImageView)
        self.iconImageView.frame = self.bgView.bounds
        
        // 跳過(guò)按鈕
        let progressBut = UIButton()
        progressBut.frame = CGRect(x: self.view.frame.size.width - 50 - 35 , y: 20, width: 50, height: 25)
        progressBut.titleLabel?.font = UIFont.systemFont(ofSize: 15)
        progressBut.setTitleColor(UIColor.red, for: .normal)
        progressBut.setTitle("跳 過(guò)", for: .normal)
        progressBut.backgroundColor = UIColor.clear
        progressBut.addTarget(self, action: #selector(progressButtonCilck), for: .touchUpInside)
        self.bgView.addSubview(progressBut)

        // 圈圈
        let viewFrame = CGRect(x: self.view.frame.size.width - 35, y: 20, width: 25, height: 25)
        let countDownView = CountDownView(frame: viewFrame, totalTime: kCountdownTime, lineWidth: kLineWidth, lineColor: UIColor.red, textFontSize: 2, startFinishCallback: {
            progressBut.isHidden = false
            
            }, completeFinishCallback: {
                progressBut.isHidden = true
        })
        self.bgView.addSubview(countDownView)
        // 開(kāi)始倒計(jì)時(shí)
        countDownView.startTheCountDown()
    }
}

// MARK:- 事件處理
extension FcNormalWecomVC {
    
    func progressButtonCilck(){
        UIView .animate(withDuration: 0.6, animations: {
            self.bgView.alpha = 0.3
            self.bgView.transform = CGAffineTransform(scaleX: 2.0, y: 2.0)
            
            }, completion: { (bool) in
                self.bgView.alpha = 0
                // 發(fā)送通知
                let notifyChat = NSNotification.Name(FcSwitchRootViewControllerKey)
                NotificationCenter.default.post(name: notifyChat, object: nil)
        })
    }
}

(PS:帶進(jìn)度按倒計(jì)時(shí)涉及到另外一個(gè)自定義類(lèi),代碼如下)

import UIKit

class CountDownView: UIView {

    // MARK:- 屬性定義
    var startBack: (() -> ())?
    var completeBack: (() -> ())?
    var progressLineWidth: CGFloat?
    var progressLineColor: UIColor?
    var countLb: UILabel?
    var totalTimes: NSInteger = 0
    var isCountDown:Bool = false
    
    // MARK:- 懶加載
    fileprivate lazy var progressLayer:CAShapeLayer = {
        let progress = CAShapeLayer()
        let kWidth = self.frame.size.width
        let kHeight = self.frame.size.height
        progress.frame = CGRect(x: 0, y: 0, width: kWidth, height: kHeight)
        progress.position = CGPoint(x: kWidth/2.0, y: kHeight/2.0)
        let point = CGPoint(x: kWidth/2.0, y: kHeight/2.0)
        progress.path = UIBezierPath(arcCenter: point, radius: (kWidth - self.progressLineWidth!)/2.0, startAngle: 0, endAngle: CGFloat(M_PI * 2), clockwise: true).cgPath
        progress.fillColor = UIColor.clear.cgColor
        progress.lineWidth = self.progressLineWidth!
        progress.strokeColor = self.progressLineColor!.cgColor
        progress.strokeEnd = 0
        progress.strokeStart = 0
        progress.lineCap = kCALineCapRound
        return progress
    }()

    fileprivate lazy var rotateAnimation:CABasicAnimation = {
        let rotateAnima = CABasicAnimation(keyPath: "transform.rotation.z")
        rotateAnima.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseOut)
        rotateAnima.fromValue = CGFloat(2 * M_PI)
        rotateAnima.toValue = CGFloat(0)
        rotateAnima.duration = CFTimeInterval(self.totalTimes)
        rotateAnima.isRemovedOnCompletion = false
        return rotateAnima
    }()
    
    fileprivate lazy var strokeAnimationEnd:CABasicAnimation = {
        let strokeAnimation = CABasicAnimation(keyPath: "strokeEnd")
        strokeAnimation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseOut)
        strokeAnimation.duration = CFTimeInterval(self.totalTimes)
        strokeAnimation.fromValue = CGFloat(1)
        strokeAnimation.toValue = CGFloat(0)
        strokeAnimation.speed = Float(1.0)
        strokeAnimation.isRemovedOnCompletion = false
        return strokeAnimation
    }()
    
    fileprivate lazy var animationGroup:CAAnimationGroup = {
        let group = CAAnimationGroup()
        group.animations = [self.strokeAnimationEnd, self.rotateAnimation]
        group.duration = CFTimeInterval(self.totalTimes)
        return group
    }()
    
    /**
     *  初始化定時(shí)器
     frame         位置
     totalTime     總時(shí)間
     lineWidth     線(xiàn)寬
     lineColor     線(xiàn)色
     fontSize      字體大忻茚!(控件的寬度/多少)
     startFinishCallback    開(kāi)始閉包
     completeFinishCallback 完成閉包
     */
    init(frame: CGRect, totalTime: NSInteger, lineWidth:CGFloat, lineColor:UIColor, textFontSize:CGFloat, startFinishCallback:@escaping () -> (), completeFinishCallback:@escaping () -> ()) {
        super.init(frame: frame)
        startBack = startFinishCallback
        completeBack = completeFinishCallback
        progressLineWidth = lineWidth
        progressLineColor = lineColor
        totalTimes = totalTime
        layer.addSublayer(progressLayer)
        createLabel(textFontSize: textFontSize)
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

// MARK:- 邏輯處理
extension CountDownView {
    
    /** 創(chuàng)建label */
    fileprivate func createLabel(textFontSize: CGFloat) {
        let label = UILabel()
        label.frame = self.bounds
        label.textColor = self.progressLineColor
        label.font = UIFont.systemFont(ofSize: self.frame.size.width / textFontSize)
        label.textAlignment = .center
        addSubview(label)
        countLb = label
    }
    
    /** 創(chuàng)建定時(shí)器 */
    fileprivate func createTimer() {
        weak var weakSelf = self
        if totalTimes > 0 {
            var timeout = totalTimes
            // 1、獲取一個(gè)全局隊(duì)列
            let queue = DispatchQueue.global()
            // 2撩轰、創(chuàng)建間隔定時(shí)器
            let time = DispatchSource.makeTimerSource(flags: [], queue: queue)
            time.scheduleRepeating(deadline: .now(), interval: .seconds(1), leeway: .microseconds(100))
            time.setEventHandler(handler: {
                if timeout <= 0 {
                    // 2.1定時(shí)器取消
                    time.cancel()
                    // 2.2主線(xiàn)程刷新UI
                    DispatchQueue.main.async(execute: {
                        weakSelf?.isCountDown = false
                        weakSelf?.isHidden = true
                        weakSelf?.stopCountDown()
                    })
                }else {
                    weakSelf?.isCountDown = true
                    let seconds = timeout % 60
                    DispatchQueue.main.async(execute: {
                        self.countLb?.text = "\(String(seconds))s"
                    })
                    timeout -= 1
                }
            })
            // 3胯甩、復(fù)原定時(shí)器
            time.resume()
        }
    }
    
    /** 開(kāi)始倒計(jì)時(shí) */
    func startTheCountDown(){
        self.isHidden = false
        isCountDown = true
        if (startBack != nil) {
            startBack!()
        }
        createTimer()
        progressLayer.add(animationGroup, forKey: "group")
    }
    
    /** 停止倒計(jì)時(shí) */
    fileprivate func stopCountDown(){
        progressLayer.removeAllAnimations()
        if completeBack != nil {
            completeBack!()
        }
    }
}

普通、帶進(jìn)度條按鈕都支持點(diǎn)擊 跳過(guò) 進(jìn)行跳轉(zhuǎn)
2017-01-11 12_58_59.gif

APPdelegate中代碼
import UIKit
// 切換控制器通知
let FcSwitchRootViewControllerKey = "FcSwitchRootViewControllerKey"

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        
        // 接收通知
        NotificationCenter.default.addObserver(self, selector: #selector(switchRootViewController(notify:)), name: NSNotification.Name( FcSwitchRootViewControllerKey), object: nil)
                
        window = UIWindow(frame: UIScreen.main.bounds)
        window?.backgroundColor = UIColor.white
        window?.rootViewController = defaultController()
        window?.makeKeyAndVisible()
        
        isNewUpdate()
        return true
    }
    
    /** 實(shí)現(xiàn)通知方法 */
    func switchRootViewController(notify: NSNotification) {
        window?.rootViewController = ViewController()
    }
    
    /** 銷(xiāo)毀通知 */
    deinit {
        NotificationCenter.default.removeObserver(self)
    }
    
    /** 用于獲取默認(rèn)顯示界面 */
    fileprivate func defaultController() -> UIViewController {
        return isNewUpdate() ? FcNewfeaturesCollectionVC() : FcNormalWecomVC()
    }
    
    
    /** 檢查是否有新版本 */
    // 此修飾詞作用為消除 "Result of call to ‘isNewUpdate()’is unused" 沒(méi)有使用返回結(jié)果的警告钧敞。
    @discardableResult
    fileprivate func isNewUpdate() -> Bool {
        let key = "CFBundleShortVersionString"
        // 1.獲取應(yīng)用程序 -> 當(dāng)前版本 info.plist
        let currentVersion = Bundle.main.infoDictionary![key] as! String
        //        print("當(dāng)前版本 -> \(currentVersion)")
        // 2.獲取沙河應(yīng)用程序版本 -> 從本地文件讀壤(以前自己存儲(chǔ))  String ?? "0.0" 如果String是空,則取 0.0
        let sandboxVersion = UserDefaults.standard.value(forKey: key) as? String ?? "0.0"
        //        print("老版本 -> \(sandboxVersion)")
        // 3.利用當(dāng)前版本 和 以前版本比較
        // 2.0                     1.0                                  降序
        if currentVersion.compare(sandboxVersion) == ComparisonResult.orderedDescending{
            // 3.1如果有新版本, 將新版本保存
            let defaults = UserDefaults.standard
            defaults.setValue(currentVersion, forKey: key)
            // iOS 7.0 之后溉苛,就不需要同步了镜廉,iOS 6.0 之前,如果不同步不會(huì)第一時(shí)間寫(xiě)入沙盒
            defaults.synchronize()
            // 4.返回時(shí)候有新版本
            return true
        }
        return false
    }

當(dāng)版本號(hào)增加之后運(yùn)行才能再次看到新特性
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末愚战,一起剝皮案震驚了整個(gè)濱河市娇唯,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌寂玲,老刑警劉巖塔插,帶你破解...
    沈念sama閱讀 217,907評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異拓哟,居然都是意外死亡想许,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)断序,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)流纹,“玉大人,你說(shuō)我怎么就攤上這事违诗∈” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,298評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵诸迟,是天一觀的道長(zhǎng)茸炒。 經(jīng)常有香客問(wèn)我,道長(zhǎng)阵苇,這世上最難降的妖魔是什么壁公? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,586評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮绅项,結(jié)果婚禮上贮尖,老公的妹妹穿的比我還像新娘。我一直安慰自己趁怔,他們只是感情好湿硝,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著润努,像睡著了一般关斜。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上铺浇,一...
    開(kāi)封第一講書(shū)人閱讀 51,488評(píng)論 1 302
  • 那天痢畜,我揣著相機(jī)與錄音,去河邊找鬼鳍侣。 笑死丁稀,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的倚聚。 我是一名探鬼主播线衫,決...
    沈念sama閱讀 40,275評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼惑折!你這毒婦竟也來(lái)了授账?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,176評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤惨驶,失蹤者是張志新(化名)和其女友劉穎白热,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體粗卜,經(jīng)...
    沈念sama閱讀 45,619評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡屋确,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了续扔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片攻臀。...
    茶點(diǎn)故事閱讀 39,932評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖测砂,靈堂內(nèi)的尸體忽然破棺而出茵烈,到底是詐尸還是另有隱情,我是刑警寧澤砌些,帶...
    沈念sama閱讀 35,655評(píng)論 5 346
  • 正文 年R本政府宣布呜投,位于F島的核電站,受9級(jí)特大地震影響存璃,放射性物質(zhì)發(fā)生泄漏仑荐。R本人自食惡果不足惜纵东,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評(píng)論 3 329
  • 文/蒙蒙 一粘招、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧偎球,春花似錦洒扎、人聲如沸辑甜。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,871評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)磷醋。三九已至,卻和暖如春胡诗,著一層夾襖步出監(jiān)牢的瞬間邓线,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,994評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工煌恢, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留骇陈,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,095評(píng)論 3 370
  • 正文 我出身青樓瑰抵,卻偏偏與公主長(zhǎng)得像你雌,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子谍憔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評(píng)論 2 354

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,129評(píng)論 25 707
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理匪蝙,服務(wù)發(fā)現(xiàn),斷路器习贫,智...
    卡卡羅2017閱讀 134,656評(píng)論 18 139
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)逛球、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,103評(píng)論 4 62
  • 7月12日《鼓起勇氣,開(kāi)始整理》 【day122盈盈】 在沒(méi)看這本書(shū)之前祟身,我一直以為收拾和整理是同一個(gè)意思奥务,其實(shí)并...
    蘇小盈閱讀 121評(píng)論 0 0
  • 摔跤吧 敬愛(ài)的爸爸 這世界 滿(mǎn)是謊話(huà) 惟有 無(wú)邊的痛苦 是真實(shí)的表達(dá) 局外人 永遠(yuǎn)看不清 社會(huì)的復(fù)雜 不完美的父愛(ài)...
    小白楊老師閱讀 478評(píng)論 1 5