Flutterで端末のOSを判定する

Flutterで端末のOSを判定するには、dart.ioにあるPlatformクラスを使う。 import 'dart:io' show Platform; if (Platform.isIOS) { // iOSなら } if (Platform.isAndroid) { // Androidなら } 他にもisWindows, isFuchsia, isLinux, isMacOSがある。 ちなみ…

SwiftエンジニアのためのDartのFunctionの任意引数

kitoko552.hatenablog.com これのおまけ。Swiftエンジニア向け版です。 Swiftでの任意引数 Swiftではメソッドの引数を任意にしたい場合はデフォルト値を設定する。 // Swift fun hoge(isFuga: Bool = false) { // } hoge() // hoge(isFuga: false)と同義 Dar…

DartのFunctionで任意の引数をとる2種類の方法

はじめに 公式のLanguage Tourを読んだ方が正確です。特にOptional parameters章を。 この記事は日本語かつ自分の言葉で残したいが故の記事です。 DartのFunctionの基本 Dartでは普通にFunctionを定義するとその引数は必須になる。 String say(String from, …

SwiftエンジニアのためのDart変数定義解説(var/final/const)

kitoko552.hatenablog.com この記事のおまけ。Swift書いてる人向けの別バージョン。 自分がiOSエンジニアでずっとSwiftを書いていた人間だったので、同じような人にわかりやすく説明できたらなという記事です。 雰囲気だけ伝わればと思っているので、細かい…

Dartの変数宣言(var/final/const)の違い

はじめに 当たり前ですが、基本公式のLanguage Tourを読む方が正確。 この記事はLanguate Tour + αを日本語かつ自分の言葉でまとめたものです。 var varは代入が何回でも可能な変数を定義する時に使う。 var name = 'apple'; name = 'google'; print(name); …

Haptic Feedbackを実装する

Haptic Feedbackとは ユーザーの何かしらのアクションに対して「ドゥッ」とiPhoneをバイブさせるアレ。 スタートトゥデイさんの記事の説明を拝借すると、 iPhone 6s 以降に搭載された Taptic Engineというハードウェアによる振動で、ユーザーのアクションに…

UICollectionView(UITableView)でpull to refreshを実装する

pull to refreshとは UICollectionViewやUITableViewを下に引っ張ってrefreshするあれ。 Twitterやinstagram等フィード型のアプリでよく使われている。 実装方法 iOS 10からUIScrollViewにrefreshControlというプロパティが使える。 @available(iOS 10.0, *)…

Elementが非OptionalのObservableでエラー時にnextを流す

解決したい課題 Elementが非OptionalのObservableでエラーを無視したい時がある。 Observableはエラーが流れてきたらcompleted状態になりもう二度とnextで値が流れてくることがなくなってしまうため、大抵無視したい時はcatchError(_:)やcatchErrorJustRetur…

AVPlayerの再生ステータス(playing/pause/end)を取得する

play or pause 再生中かどうかの判定にはAVPlayer.rateとAVPlayer.errorを使う。 var isPlaying: Bool { return player.rate != 0 && player.error == nil } end 再生が終わったかどうかの判定には、NotificationCenterにAVPlayerItemDidPlayToEndTimeのobse…

radiusが入った三角形のCGPathを作る

rect(四角形)であればUIBezierPathを使えば簡単に生成できる。 三角形の場合はCGMutablePathを使って生成する(三角形でなく他の多角形でも可能)。 下は右向きの三角形のpathを作る例。 // 各頂点を定義 let top = CGPoint(x: 22, y: 18) let right = CGP…

CAShapeLayer.pathに複数のUIBezierPathを指定する

UIBezierPathのappend(_:)を使う。 let leftRect = CGRect(origin: leftOrigin, size: size) let originalPath = UIBezierPath(roundedRect: leftRect, cornerRadius: 1) let rightRect = leftRect.offsetBy(dx: 12, dy: 0) let rightPath = UIBezierPath(ro…

UISliderのカスタマイズ

thumb(丸いやつ)はsetThumbImage(_:for)、thumbより左のプログレスはsetMinimumTrackImage(_:for)、thumbより右のプログレスはsetMaximumTrackImage(_:for)でそれぞれカスタマイズできる。 let thumbImage = UIColor.white.circleImage(width: 16, height:…

UIColorからUIImageに変換する

個人的には以下のようなメソッドをUIColorのextensionとして宣言している。 extension UIColor { /// 四角 func rectImage(width: CGFloat, height: CGFloat) -> UIImage { let rect = CGRect(x: 0, y: 0, width: width, height: height) UIGraphicsBeginIma…

observeValue(forKeyPath:of:change:context:)を使わないKVO

KVOでお馴染みのobserveValue(forKeyPath:of:change:context:)がSwift 3.2以降からdeprecatedになるらしい。 上記をoverrideして定義すると、 Block Based KVO Violation: Prefer the new block based KVO API with keypaths when using Swift 3.2 or later.…

YouTube動画のm3u8URLを取得する

https://www.youtube.com/get_video_info?video_id={videoId} 上記URLのvideo_idパラーメタに該当するYouTube動画のvideoIDを与えると、以下のような{key}={value}&が連続する形でレスポンスが返ってくる hl=ja_JP&timestamp=1520407725&... この中にhlsvpと…