どこかで見たことあるアニメーションを自作してみました。

IMG_0986.TRIM

UIViewのExtensionに波紋を表示するためのメソッド

extension UIView {

    func 波紋(touch: UITapGestureRecognizer) {
       
        // ①: タップされた場所にlayerを置き、半径200の円を描画
        let location = touch.location(in: self)
        let layer = CAShapeLayer.init()
        self.layer.addSublayer(layer)
        layer.frame = CGRect.init(x: location.x, y: location.y, width: 100, height: 100)
        layer.position = CGPoint.init(x: location.x, y: location.y)
        layer.contents = {
            let size: CGFloat = 200.0
            UIGraphicsBeginImageContext(CGSize.init(width: size, height: size))
            let context = UIGraphicsGetCurrentContext()!
            context.saveGState()
            context.setFillColor(UIColor.clear.cgColor)
            context.fill(self.frame)
            let r = CGFloat.init(size/2-10)
            let center = CGPoint.init(x: size/2, y: size/2)
            let path : CGMutablePath = CGMutablePath()
            path.addArc(center: center, radius: r, startAngle: 0, endAngle: CGFloat(Double.pi*2), clockwise: false)
            context.addPath(path)
            context.setFillColor(UIColor.lightGray.cgColor)
            context.setStrokeColor(UIColor.lightGray.cgColor)
            context.drawPath(using: .fillStroke)
            let image = UIGraphicsGetImageFromCurrentImageContext()
            context.restoreGState()
            return image!.cgImage
        }()

        // ②: 円を拡大しつつ透明化するAnimationを用意
        let animationGroup: CAAnimationGroup = {
            let animation: CABasicAnimation = {
                let animation = CABasicAnimation(keyPath: "transform.scale")
                animation.timingFunction = CAMediaTimingFunction(name:kCAMediaTimingFunctionEaseOut)
                animation.duration = 0.5
                animation.isRemovedOnCompletion = false
                animation.fillMode = kCAFillModeForwards
                animation.fromValue = NSNumber(value: 0.5)
                animation.toValue = NSNumber(value: 5.0)
                return animation
            }()
           
            let animation2: CABasicAnimation = {
                let animation = CABasicAnimation(keyPath: "opacity")
                animation.duration = 0.5
                animation.isRemovedOnCompletion = false
                animation.fillMode = kCAFillModeForwards
                animation.fromValue = NSNumber(value: 0.5)
                animation.toValue = NSNumber(value: 0.0)
                return animation
            }()
           
            let group = CAAnimationGroup()
            group.beginTime = CACurrentMediaTime()
            group.animations = [animation, animation2]
            group.isRemovedOnCompletion = false
            group.fillMode = kCAFillModeBackwards
            return group
        }()
       
        // ③: layerにAnimationを適用
        CATransaction.setAnimationDuration(5.0)
        CATransaction.setCompletionBlock({
            layer.removeFromSuperlayer()
        })
        CATransaction.begin()
        layer.add(animationGroup, forKey: nil)
        layer.opacity = 0.0
        CATransaction.commit()
    }
}

使い方:

override func awakeFromNib() {
    super.awakeFromNib()

    let tapGesture = UITapGestureRecognizer.init(target: self, action: #selector(self.tapContentView(touch:)))
    self.contentView.addGestureRecognizer(tapGesture)
}

@objc func tapContentView(touch: UITapGestureRecognizer) {

    self.contentView.波紋(touch: touch)
}

どの画面から呼んでも大丈夫!

・Viewのモーダル表示

UIApplication.shared.keyWindow?.addSubview(view)
UIApplication.shared.keyWindow?.bringSubview(toFront: view)

・消し方(表示したViewの閉じるイベントで呼ぶ)

self.removeFromSuperview()

こんにちは、かっしー@茨城です。

サーバレス界隈で最近盛り上がりを見せているServerless Frameworkを試してみました。

今回は導入から新規テンプレートプロジェクトのデプロイまでの手順を説明します。

Read More →

株式会社プラスアールでは、iOS ( or Android or PHP ) のエンジニアを募集しています。
http://www.plusr.co.jp/recruit

今回も下の問題が解けたら書類選考なしにいたします。さらに、面接の際にバックジョイをプレゼントしちゃいます。

image_backjoy

求人への応募はしないという方でも、問題が解けた&弊社まで景品をとりに来ていただけるようでしたら、先着10名様に限りバックジョイをプレゼントいたします。

こぞってご応募ください。

[問題]

以下の表はそのマスとその周囲8マスに含まれている爆弾の個数を表しています。フィールドに含まれている爆弾の位置を(x,y)としたとき、その積k(=x*y)が小さい順にアルファベットを並べるとある単語が完成します。

マインスイーパの説明

解けた方は次のメールアドレスまでご連絡ください!
[完成したメッセージ]-[kの総和]@plusr.co.jp
※[]は要りません。
※作成したプログラムのGithubへのリンク又は、プログラムを添付してください。
※面接の日程についてはメールで調整致します。

求人に応募しない方は、”解けた!”というご連絡だけでも構いません。
景品だけ希望の場合はその旨ご記載ください。
例:「景品ほしい」

よろしくお願いいたします!

※求人の定員に達し次第終了しますので、解けた方はすぐにご連絡下さい。

1 2 3 4 5 6
1  1 i  2 p  2 a  1 g  1 x  1 u
2  1 c  2 t  2 e  2 h  2 r  2 a
3  1 g  2 q  1 i  2 r  3 n  3 z
4  2 r  2 d  2 g  2 o  3 e  2 o
5  2 v  2 n  2 o  1 w  3 y  2 s
6  2 b  2 t  2 r  1 p  2 w  1 a
7  2 g  2 u  2 i  1 x  3 q  2 u
8  2 e  2 t  2 s  1 m  2 x  1 n

流用できる資産は定期的に探さないとなと。

———————————-
しま
 ちょっとした小話です:日本の行政機関が公開中のAPIについてのまとめ
 この記事にある「国土交通省が提供する位置参照情報を取得できるAPI。街区レベル、大字・町丁目レベルの情報を取得できる。」が結構衝撃でした。カラダノートの病院データを作る際に、XX市XX町からXキロ圏内の病院のリストを作るといった感じのページがあってですね・・・病院情報は住所でしか情報がなかったので、経度緯度で変換する必要があり当時はyahoo APIを利用して変換していたものでした。制限があったので数日かけてやった記憶が。これならもっとスムーズに作れますね

まさ
 ほーーー

せい
 ↑のAPIを使えば、例えば区まで指定すると区内の建物の住所と位置情報がセットで取れる?
 病院以外も取れるとそこから病院情報を抽出するのが大変そうなイメージ

しま
 APIはわからんけどcsvは住所と経度緯度は紐付いてましたね


しま web
まさ 調整
せい android