
Outline
- 1. はじめに
- 2. 今回のサンプル概要について
- 3. チュートリアル画面の実装でのステップインジケーターを表示する「FlexibleSteppedProgressBar」の実装解説
- 4. フォトギャラリーの様な動きを表現する「FSPagerView」及び奥行きのあるレイアウトのUICollectionViewを実現する「VegaScrollFlowLayout」の実装解説
- 5. スクロールに合わせて画像のパララックス表現をする「ParallaxHeader」及びNavigationBarの折りたたみを表現する「AMScrollingNavbar」を組み合わせた実装解説
- 6. レーティング表示部分「Cosomos」及びハッシュタグ・リンク等の表示をしやすくする「ActiveLabel」の実装解説
- 7. あとがき
1. はじめに
皆様お疲れ様です。Swift AdventCalendarの9日目を担当させて頂きます、fumiyasac(Fumiya Sakai)と申します。何卒よろしくお願い致します。
以前に作成した記事で、できるだけUI系のライブラリを用いないでアニメーションを盛り込んだサンプルの実装に関する紹介をしたのですが、今回の記事はその番外編として動きやアニメーションが美しいライブラリを活用してUIを構築した際の事についての紹介記事になります。
できるだけ、Swift4にすでに対応したUI系のライブラリを組み合わせて作成してみました。(記事の内容に関してはあとで少し手直しする予定です)
Githubでのサンプルコード:
サンプルの全体的な動きの動画:
※こちらのサンプルはPullRequestやIssue等はお気軽にどうぞ!
2. 今回のサンプル概要について
以前にも書いた記事「Swiftで便利なライブラリやUIパーツに工夫を凝らしてUIを彩るサンプル例(ライブラリ選定とベース作成)」と同様に、iOSのライブラリを紹介しているサイトやGithubのREADMEやライブラリに収録されているサンプルソースを調べて、Swift4にも対応がされておりかつStoryboardでもなるべく扱いやすく実装がシンプルそうなものを組み合わせてみました。全体のレイアウトや動きに関わる部分のライブラリに加えて、UIのワンポイントになりそうな部分のライブラリも使用しています。
※ 今回の紹介するサンプルは特に非同期処理の通信やデータの登録等は行なっていません。
サンプルのキャプチャ画像その1:
サンプルのキャプチャ画像その2:
環境やバージョンについて:
- Xcode9.1
- Swift4.0
- MacOS Sierra (Ver10.12.6)
使用ライブラリ:
ライブラリ名 | ライブラリの機能概要 |
---|---|
FlexibleSteppedProgressBar | チュートリアルでよくあるステップインジケーターを表示するライブラリ |
VegaScrollFlowLayout | 奥行きのあるようなスクロールをするUICollectionViewのFlowLayoutをカスタマイズしたライブラリ |
FSPagerView | 様々なスクロール表現をするライブラリ |
ParallaxHeader | UITableViewのヘッダー部分をスクロール量に応じてパララックス表示をするライブラリ |
AMScrollingNavbar | スクロールの変化量に合わせてNavigationBarを折りたたむ表現をするライブラリ |
Cosmos | 評価のレーティング表示を扱いやすくするライブラリ |
ActiveLabel | URLやハッシュタグのリンク表示を扱いやすくするライブラリ |
FontAwesome.swift | 「Font Awesome」アイコンの利用 |
Podfile内の設定は下記のようになります。(FontAwesome.swift
及びActiveLabel
に関しては該当リポジトリのSwift4系の対応を行っているブランチのものを直接取得をしています)
# Uncomment the next line to define a global platform for your project
# platform :ios, '9.0'
target 'MixedUILibrariesSample' do
# Comment the next line if you're not using Swift and don't want to use dynamic frameworks
use_frameworks!
# Pods for MixedUILibrariesSample
# UILaibrary
pod 'FlexibleSteppedProgressBar'
pod 'VegaScrollFlowLayout'
pod 'FSPagerView'
pod 'ParallaxHeader', '~> 2.0.0'
pod 'AMScrollingNavbar'
pod 'Cosmos', '~> 12.0'
pod 'ActiveLabel', :git => 'git@github.com:optonaut/ActiveLabel.swift.git', :branch => 'master'
pod 'FontAwesome.swift', :git => 'https://github.com/thii/FontAwesome.swift', :branch => 'swift-4.0'
end
今回紹介したライブラリについては、ライブラリのリポジトリに使用サンプルやリファレンス等が詳細に表示されているものが多いので、この記事で紹介した形のUI以外でも活用できると思います。
3. チュートリアル画面の実装でのステップインジケーターを表示する「FlexibleSteppedProgressBar」の実装解説
チュートリアルの動きに合わせて、今どの位置にいるかというインジケーターを表示する部分については、アニメーションを伴う部分の細かな部分までDIYするのはなかなか大変なので、UIPageViewControllerの動きに合わせてライブラリを組み合わせた実装をしました。
インジケーター部分は「FlexibleSteppedProgressBar」を利用しており、インジケーターの初期設定や動いた際の設定に関しては、下記のような形でFlexibleSteppedProgressBarDelegate
を活用することができます。
import UIKit
import FlexibleSteppedProgressBar
class MainViewController: UIViewController {
//ステップインジケータ表示用部品のOutlet
@IBOutlet weak var stepIndicator: FlexibleSteppedProgressBar!
・・・(省略)・・・
//ContainerViewにEmbedしたUIPageViewControllerのインスタンスを保持する
fileprivate var pageViewController: UIPageViewController?
//ページングして表示させるViewControllerを保持する配列
fileprivate var tutorialControllerLists = [TutorialBaseViewController]()
//チュートリアル画面に表示する要素
private let tutorialContents: [Tutorial] = Tutorial.getSampleData()
override func viewDidLoad() {
super.viewDidLoad()
・・・(省略)・・・
setupStepIndicator()
・・・(省略)・・・
}
・・・(省略)・・・
//ステップインジケータ表示の初期表示に関するセッティングをするメソッド
private func setupStepIndicator() {
stepIndicator.delegate = self
//ステップインジケータの表示数を設定する
stepIndicator.numberOfPoints = 3
//ステップインジケータの線幅を設定する
stepIndicator.lineHeight = 4
//ステップインジケータの配色及び外枠を設定する
stepIndicator.selectedOuterCircleLineWidth = 4.0
stepIndicator.selectedOuterCircleStrokeColor = UIColor.orange
stepIndicator.currentSelectedCenterColor = UIColor.white
//ステップインジケータのアニメーション秒数を設定する
stepIndicator.stepAnimationDuration = 0.26
//ステップインジケータの現在位置を設定する
stepIndicator.currentIndex = 0
}
・・・(省略)・・・
}
・・・(省略)・・・
// MARK - FlexibleSteppedProgressBarDelegate
extension MainViewController: FlexibleSteppedProgressBarDelegate {
//ステップインジケータを選択した際に実行されるメソッド
func progressBar(_ progressBar: FlexibleSteppedProgressBar,
didSelectItemAtIndex index: Int) {
stepIndicator.currentIndex = index
}
//ステップインジケータを選択の選択可否を設定するメソッド
func progressBar(_ progressBar: FlexibleSteppedProgressBar,
canSelectItemAtIndex index: Int) -> Bool {
return false
}
//ステップインジケータに表示される文言を表示するメソッド
func progressBar(_ progressBar: FlexibleSteppedProgressBar,
textAtIndex index: Int, position: FlexibleSteppedProgressBarTextLocation) -> String {
//特に必要ない場合にはカラッポの文字列にする
return ""
}
}
ちなみにFlexibleSteppedProgressBar
は下記のようにInterfaceBuilderで配色やインジケーターの大きさ、一緒に表示する文言なども設定できるので、上手に活用することでデザイン面でも綺麗にこだわったインジケーターができるかと思います。
その一例として、今回の実装ではインジケーター部分の番号表示は削除をして対応をしています。
FlexibleSteppedProgressBarのInterfaceBuilder上での見え方:
初回起動画面をはじめとするような部分については、綺麗なアニメーションやUIがあるとかなり目を引くポイントになるので色々と動きに彩りのあるライブラリ等を活用することで、良い動きを工夫してみても面白いかもしれませんね。
4. フォトギャラリーの様な動きを表現する「FSPagerView」及び奥行きのあるレイアウトのUICollectionViewを実現する「VegaScrollFlowLayout」の実装解説
フォトギャラリーで良く見かける様な動きやUICollectionViewやUITableViewを拡張して心地の良い変化やアニメーションの実装はUIを構築する上では、こだわりたい部分の1つだと思います。今回はCoverFlowの様な表現のフォトギャラリー部分とコンテンツの表示に一工夫を加えた動きを演出するために「FSPagerView」と「VegaScrollFlowLayout」を活用した実装をしてみました。
また、コンテンツ一覧の表示部分のViewControllerとフォトギャラリー部分のViewControllerについては、今回のサンプルではContainerViewを用いて分割しています。
FSPagerView及びVegaScrollFlowLayout導入時のInterfaceBuilderでの見え方:
1.FSPagerViewを活用したフォトギャラリー部分の実装:
基本的にはUICollectionViewを取り扱う時と同様な実装で実現ができます。
フォトギャラリーの動きをライブラリを変更したい場合は、coverFlowSliderView.transformer = FSPagerViewTransformer(type: .coverFlow)
のFSPagerViewTransformer(type: .coverFlow)
に設定するenum値を変更することで実現ができます。
補足)FSPagerViewとUICollectionViewの類似点についての大まかなまとめ:
import UIKit
import FSPagerView
class CoverFlowSliderViewController: UIViewController {
//カバーフロー形式のギャラリーを表示するためのFSPagerView
@IBOutlet weak fileprivate var coverFlowSliderView: FSPagerView! {
didSet {
self.coverFlowSliderView.register(FSPagerViewCell.self, forCellWithReuseIdentifier: "cell")
}
}
fileprivate var coverflowContents: [Coverflow] = [] {
didSet {
self.coverFlowSliderView.reloadData()
}
}
override func viewDidLoad() {
super.viewDidLoad()
setupCoverFlowSliderView()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
//MARK: - Private Functions
private func setupCoverFlowSliderView() {
//UICollectionViewとほとんど同じ感じで設定ができる
coverFlowSliderView.delegate = self
coverFlowSliderView.dataSource = self
coverFlowSliderView.isInfinite = true
coverFlowSliderView.itemSize = CGSize(width: 180, height: 120)
coverFlowSliderView.interitemSpacing = 16
coverFlowSliderView.transformer = FSPagerViewTransformer(type: .coverFlow)
coverflowContents = Coverflow.getSampleData()
}
}
//MARK: - FSPagerViewDataSource, FSPagerViewDelegate
extension CoverFlowSliderViewController: FSPagerViewDataSource, FSPagerViewDelegate {
func numberOfItems(in pagerView: FSPagerView) -> Int {
return coverflowContents.count
}
func pagerView(_ pagerView: FSPagerView, cellForItemAt index: Int) -> FSPagerViewCell {
let cell = pagerView.dequeueReusableCell(withReuseIdentifier: "cell", at: index)
let coverflow = coverflowContents[index]
cell.contentView.layer.shadowOpacity = 0.4
cell.contentView.layer.opacity = 0.86
cell.imageView?.image = coverflow.thumbnail
cell.imageView?.contentMode = .scaleAspectFill
cell.imageView?.clipsToBounds = true
return cell
}
func pagerView(_ pagerView: FSPagerView, didSelectItemAt index: Int) {
pagerView.deselectItem(at: index, animated: true)
pagerView.scrollToItem(at: index, animated: true)
}
}
2.VegaScrollFlowLayoutを活用した奥行きのある動きをするUICollectionViewの実装:
こちらも前述した「FSPagerView」と同様に、基本的にはUICollectionViewを取り扱う時と同様な実装で実現ができます。
注意点としては、InterfaceBuilder上のUICollectionViewFlowLayout
の部分にはVegaScrollFlowLayout
を設定しておくことを忘れないでください。
「FSPagerView」と比べて独自に作成したセルクラスを適用することもできます。
import UIKit
import VegaScrollFlowLayout
class ListViewController: UIViewController {
//UI部品の配置
@IBOutlet weak var listCollectionView: UICollectionView!
fileprivate var listContents: [List] = [] {
didSet {
self.listCollectionView.reloadData()
}
}
//CollectionView表示の隙間やサイズに関する設定
private let itemHeight: CGFloat = 180
private let lineSpacing: CGFloat = 15
private let spaceInset: CGFloat = 15
private let topInset: CGFloat = 10
override func viewDidLoad() {
super.viewDidLoad()
setupNavigationBar()
setupListCollectionViewCell()
setupListCollectionViewLayout()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
//MARK: - Private Functiom
private func setupNavigationBar() {
removeBackButtonText()
self.navigationController?.navigationBar.tintColor = UIColor.white
self.navigationItem.title = "クリスマスに食べたいディナー"
}
private func setupListCollectionViewCell() {
listCollectionView.delegate = self
listCollectionView.dataSource = self
listCollectionView.registerCustomCell(ListCollectionViewCell.self)
//リスト用のUICollectionViewの下部をセルの高さ分マージンを開ける
listCollectionView.contentInset.bottom = itemHeight
listContents = List.getSampleData()
}
private func setupListCollectionViewLayout() {
//表示するセルのサイズや隙間に関する値の設定をする
guard let layout = listCollectionView.collectionViewLayout as? VegaScrollFlowLayout else { return }
layout.minimumLineSpacing = lineSpacing
layout.sectionInset = UIEdgeInsets(top: topInset, left: 0, bottom: 0, right: 0)
let itemWidth = UIScreen.main.bounds.width - 2 * spaceInset
layout.itemSize = CGSize(width: itemWidth, height: itemHeight)
listCollectionView.collectionViewLayout.invalidateLayout()
}
}
//MARK: - UICollectionViewDataSource, UICollectionViewDelegate
extension ListViewController: UICollectionViewDataSource, UICollectionViewDelegate {
func collectionView(_ collectionView: UICollectionView,
cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCustomCell(with: ListCollectionViewCell.self, indexPath: indexPath)
let list = listContents[indexPath.row]
cell.setCell(list)
return cell
}
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return listContents.count
}
func numberOfSections(in collectionView: UICollectionView) -> Int {
return 1
}
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
performSegue(withIdentifier: "ToArticleViewController", sender: self)
}
}
今回紹介したライブラリの他にもスクロール時の動きやフォトギャラリーの様な表現をするライブラリは数多くありますので色々と調べたり、READMEを追いかけていくと素敵かつ作ろうとしているアプリのUI表現にぴったりの物に出会えるかもしれませんね。
NavigationBarの折りたたみ開閉部分と併せてのUITableViewHeaderのパララックス表現に関しては、自前で実装する際にはNavigationBarや特にSafeAreaの考慮を意識しないと思わぬUI上の不具合を作ってしまいやすい部分です。また、Viewが込み入った実装になりやすい部分なので、できるだけパララックス表現の実装とNavigationBarの実装を理解しやすい状態にするのもなかなか大変です。
できるだけUI系のライブラリを用いないアニメーションを盛り込んだサンプル実装まとめ(前編) でも紹介した動きと似た様な表現ができるライブラリの1つに「ParallaxHeader」があるのでこちらを活用して行きます。また手軽にNavigationBarの折りたたみ表現をするライブラリには「AMScrollingNavbar」を使用しました。
「ParallaxHeader」に関しては、ライブラリを該当のViewControllerにインポートするとUITableViewに.parallaxHeader
というプロパティができるので下記のような形でサイズやパララックスの状態・配色などを設定していきます。スクロール中に発火させたい処理等がある場合にはparallaxHeaderDidScrollHandler
のクロージャー内に処理を記述する形になります。
private func setupParallaxTableViewHeader() {
let imageView = UIImageView()
imageView.image = UIImage(named: "article_main")
imageView.contentMode = .scaleAspectFill
articleTableView.parallaxHeader.view = imageView
articleTableView.parallaxHeader.view.backgroundColor = UIColor.black
articleTableView.parallaxHeader.height = 240
articleTableView.parallaxHeader.minimumHeight = 0
articleTableView.parallaxHeader.mode = .centerFill
articleTableView.parallaxHeader.parallaxHeaderDidScrollHandler = { parallaxHeader in
parallaxHeader.view.alpha = parallaxHeader.progress
}
}
「AMScrollingNavbar」に関しては、まずは下記のような形でStoryboardのrootViewControllerになっているNavigationControllerをScrollingNavigationControllerクラスに差し替えておき、ScrollingNavigationControllerにつなげてあるNavigationBarの折りたたみ表現を行いたいViewControllerに対して下記のような処理をつけてあげればOKです。
(スクロール状態で異なる処理を行いたい場合についてはScrollingNavigationControllerDelegate
を活用するような形になります。)
AMScrollingNavbar導入時のInterfaceBuilderでの見え方:
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
if let navigationController = navigationController as? ScrollingNavigationController {
navigationController.followScrollView(articleTableView, delay: 44.0)
//MEMO: ScrollingNavigationControllerDelegateを利用する際に必要な宣言
//navigationController.scrollingNavbarDelegate = self
}
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
if let navigationController = self.navigationController as? ScrollingNavigationController {
navigationController.stopFollowingScrollView()
}
}
この動きも様々なアプリのUIでよくお目にかかる動きではありますが、このような形でライブラリを活用していくことで「実装の見通しを良くできる」または「少ない労力で手早く実装ができる」というメリットもあるので、仕様や要件に合わせてUI表現をフルスクラッチ or ライブラリの活用の判断をすることでより選択肢が広がっていくのではないかと思います。
6. レーティング表示部分「Cosomos」及びハッシュタグ・リンク等の表示をしやすくする「ActiveLabel」の実装解説
評価を表示する★型のレーティング表示はボタンを並べて表示するなどの方法がありますが、3.5等の小数点表示をする時に★の部分を半分だけ表示したり等の細かな点まで表現したい時に自前だと結構面倒な部分です。その際に役立ちそうなライブラリの1つに「Cosmos」があります。
まずは下準備として、@IBOutlet weak private var ratingStarView: CosmosView!
でStoryboardとの接続をしておき、ratingStarView
に対してのセッティングを行うようにします。
private func setupListCollectionViewCell() {
・・・(省略)・・・
//タップすると星型レーティングの値を更新するか否かの判定
ratingStarView.settings.updateOnTouch = false
//星型レーティングのサイズ
ratingStarView.settings.starSize = 20
//星型レーティングの間隔サイズ
ratingStarView.settings.starMargin = 5
//星型レーティングの塗りつぶしのモード(今回は小数点の場合は比率表示にする)
ratingStarView.settings.fillMode = .precise
}
このライブラリについては、デフォルトのレーティングの形は星型ですが星型以外の形を設定することはもちろん、配色などの細部に関してもデザインの調整がしやすことやInterfaceBuilder上で上記の様なサイズ等に関する設定することも可能なので、意外と使い所はありそうなライブラリかなと感じています。
CosmosViewのInterfaceBuilder上での見え方:
またWebページのテキストの中にリンクがあるような形と同様に、UILabelに表示するテキストの中にURLやハッシュタグを混ぜた状態にする場合も「ActiveLabel」を利用すると、このような場合でも便利に扱うことができます。
こちらも同様に下準備として、@IBOutlet weak private var articleHashtagLabel: ActiveLabel!
でStoryboardとの接続をしておき、articleHashtagLabel
に対してのセッティングを行うようにします。(ここではハッシュタグの例になりますが、URLや@に関しても同様に扱うことができるのでなかなか便利です)
func setCell(_ article: Article) {
let hashtagString = article.hashTags.joined(separator: " ")
//ハッシュタグの行の高さを調節する
let hashtagParagraphStyle = NSMutableParagraphStyle.init()
hashtagParagraphStyle.minimumLineHeight = 20
let hashtagAttributedText = NSMutableAttributedString.init(string: hashtagString)
hashtagAttributedText.addAttribute(NSAttributedStringKey.paragraphStyle, value: hashtagParagraphStyle, range: NSMakeRange(0, hashtagAttributedText.length))
//リンク表示にするラベルの種類を設定する
articleHashtagLabel.enabledTypes = [.hashtag]
//ハッシュタグを表示する
articleHashtagLabel.attributedText = hashtagAttributedText
//それぞれのハッシュタグをクリックした時に発火するアクションを設定する
articleHashtagLabel.handleHashtagTap { hashtag in
print("押されたハッシュタグ:\(hashtag)")
}
}
上記2つのライブラリはUIのレイアウトやアニメーションに関する部分とは異なるライブラリの活用例になりますが、このようなDIYだとなかなか対応がしにくい部分にピンポイントで活用していくと実装もシンプルにできる時があるのではないかと思います。
7. あとがき
今回は前に前編・後編の2本立てでお送りした「できるだけUI系のライブラリを用いないアニメーションを盛り込んだサンプル実装まとめ」の番外編として、この記事で紹介しているサンプル実装に類似した動きをSwift4系に対応したUIライブラリを活用して実装をした事例の紹介になります。
導入の手順や実装に関してもさほど大きく既存のUIKitの実装に乖離しないものを選んで実装したつもりなので、皆様の参考になれば嬉しく思います。
そして記事の公開がギリギリになってしまって大変申し訳ございませんでした。引き続き様々な綺麗かつコンテンツにびったしと合う様なUIの研究に今後も精進していきたいと思いますので、何卒よろしくお願い致します。
UIまわりの実装は迷うことや組み合わせで迷う部分が多々ある部分でもありますし、またUIへの細部のこだわりによって結果的に冗長なコードになってしまうデメリットもあるかもしれません。しかしながら、ライブラリの特性や使い方を理解した上で活用することで彩りのある気持ちの良いUI作成の一助にできるケースも数多くあるので、その点を踏まえてのライブラリの精査や検証を行う事でより楽しいUI開発ができると考えております。
- FirebaseのデータをObjectMapperを用いてデータ構造を管理する方法
- Metal逆引きレシピ
- 1年遅れのWWDC 2015 Tour
- Swiftの静的コード解析ツールTailorの使い方
- Swift3でFacebook SDKを使う
- UITableViewのデリゲートメソッドまとめ
- iOS コーディングガイドライン
- Notification的にRxSwiftをクラス間の通知に使う
- React NativeでObjective-C/SwiftのAPIを扱う(Native Component編)
- Firebase Notificationを使用してiOS端末にPush通知を送信する
- Metalの恩恵は受けつつCore Imageで「手軽に」画像処理
- Swiftでのローカル通知・リモート通知の実装メモ
- UINavigationControllerと座標ズレの小ネタ
- [swift] Firebase Realtime Databaseのリスナーについて
- モジュール結合度について
- FacebookやTwitterのアプリで気になった表現を自分なりにトレースした際の実装ポイントまとめ(タイルレイアウトがサムネイル画像の枚数に応じて変わる表現)
- Widgets(Today Extension)のまとめ
- iOSアプリに審査なしでパッチを当てるライブラリを作ってみた
- Swift Evolution の Commonly Proposed がすごい勉強になる
- AndroidとiOSの実装を徹底比較する
- CALayer概要
- [Swift]0から作るXmasカウントダウンアプリ
- 猿でもできるKituraでJSONを生成する方法
- Visual Format Languageを使う【Swift3.0】
- User登録画面で活用できそうなProtocolを活用したDesignPattern3選
- RxSwift スレッドクイズ (解答・解説編)
- Kickstarter-iOSのViewModelの作り方がウマかった
- Swift で 2つの線分の交点を求める
- Metalでカメラからの動画入力をリアルタイム処理する
- iOSアプリ開発でアニメーションするなら押さえておきたい基礎
- iOS標準の写真アプリのように画像をズームしながら遷移させる
- プロトコル指向言語としてのSwift – OOPからPOPへのパラダイムシフトと注意点
- Actionを使って快適なViewModel生活を🏄
- 【Swift】最前面のUIViewControllerを取得する方法
- UIFeedbackGeneratorをiOS10未満対応アプリで楽に書けるUtility
- ViewControllerをObservableとして考える
- 【swift】イラストで分かる!具体的なDelegateの使い方。
- iPod20台を通信/制御/連携してみた【Max × Swift × OSC】
- iOSのMPSCNNによる手書き数字認識のサンプルを読む – 前編
- swift3でCGFloat.min, CGFloat.maxを利用したい
- Objective-CからSwiftへの移行でバグりやすいポイント
- コードレビューをチームにリクエストするSlack BotをSwift実装したお話🚢
- 誰でもわかるプログラミング入門を目指し隊〜Swift編〜
- Metal で 三角形を組み合わせて 2D の線を描く
- Swift中間言語の、ひとまず入り口手前まで
- MetalでiOSアプリに宿る生命
- Xcode 8.2, Swift 3.0でTwitterの認証を通してタイムラインを取得するまで
- Swift 3 以降の NotificationCenter の正しい使い方
- Windows 10でSwift開発環境構築 with Atom
- Observable.just()からはじめるRxSwift
- `as AnyObject` で何が起こるのか
- まだiOS Clean Architecture で消耗してるの? 爆速開発ツールを作ったのでご紹介
- Swiftにおけるアニメーションの世界観を掴む
- [Swift] [iOS] Watson Visual Recognitionを使って顔解析アプリを作ってみた
- 【Swift】いまさらですがiOS10でプッシュ通知を実装したサンプルアプリを作ってみた
- 【Swift3】日本語を含むURLをNSURLに
- スワイプすると出てくるメニューをSwiftで作る
- 脱・文字列ハードコーディング
- Objective-C の循環的複雑度を計測する
- 続:いろんなところでsushiを流す話
- iOSのMetalで畳み込みニューラルネットワーク – MPSCNNを用いた手書き数字認識の実装
- [iOS10] カメラを触ってみる
- ビルドで待たないための、Simulator 上で実行中の view をいじる方法
- Swift での UI テストの雑なまとめ
- iOSの新規プロジェクトでClean Architecture + Application Coordinatorの構成にした理由と感触
- [Swift] バリデーションチェックは、正規表現で!
- MkMapViewの使い方(swift版)
- UIKitにある機能でWebで見かけるようなUI達を作る
- Swift 3でSwiftBondを使ってMVVMしちゃおう
- [Swift] サンプルを見ながら、リファクタリングを勉強する
- Swift製のコマンドラインツールをbrewでインストールできるようにする
- 【Swift】アプリからメーラーを起動する方法
- Swiftで日記アプリを作ろう 〜その1 カレンダー表示編〜
- Carthageを使っていて”$(SRCROOT)/Carthage/Build/iOS/*.framework”を打ち飽きた方へ
- AWS + Nginx + Node.js + iOS(Swift) でリアルタイムチャットアプリを作ろう
- 【Xcode 8対応版】Xcodeプラグイン Alcatrazを導入しよう
- SwiftのAddress/Thread Sanitizer
- iOSで指先またはペン先の動きを記録
- Swiftで日記アプリを作ろう 〜その2 Realm導入編〜
- IBM OpenWhiskというサーバーレス実行環境を用いて、Swiftでおみくじ🎍
- 初心者のためのSprite Kit入門
- 【Swift】Realm BrowserでRealm Mobile Databaseの中身を確認する
- Swiftで日記アプリを作ろう 〜その3 Realm活用編〜
- iOSプロジェクトのテストバンドルに存在するファイルを取得する
- Swift3でDocumentディレクトリのファイルにアクセスする
- RxSwiftでUITextFiledのtextのオブザーバーがSwift3から変わっていた
- 【Swift】UITextFieldのカーソル非表示&コピー・ペーストを不可にする方法
- Alamofire, URLSessionの通信処理をMethod Swizzlingでスタブに置き換える
- 冬休みの8日間を使って、ダンス動画アプリを作った
- Swift で計算して Bezier 曲線を描く
- Swiftで小学生の頃ハマった定規でぐるぐるするやつを描く
- iOSアプリが何回もリジェクトされた後にAppleからフォローアップされる件
- ジェスチャーやカスタムトランジションを利用して入力時やコンテンツ表示時に一工夫を加えたUIの実装ポイントまとめ
- Xcodeの旧バージョンをインストールする方法
- Share Extensionでデータを共有する
- 【iOS10】Firebaseでサイレント通知を行う
- iOSで音声/ビデオ通話をWebRTCを使って実現する(調査編)
- iOSアプリ向け通信スタブの使い方
- Swift3.0対応 CoreGraphicsでPieを描く
- 【iOS】Tinder的アニメーション
- Instagramライクな画像フィルタライブラリをCocoaPodsで公開してみた
- SceneKitで扱える3Dモデルのフォーマット/アニメーションつき3DモデルをSceneKitで使う
- UITabBarにcustomなバッジをつける
- SwiftとJavascriptの変数宣言の比較
- RxSwiftをサクッと勉強してみた
- そういえばMacでAndroidアプリつくるために必要な準備ってなんだっけ?
- 吹き出しのようなViewを作ってみる
- Swiftのエラー4分類が素晴らしすぎるのでみんなに知ってほしい
- Swiftの型の限界を超える
- SwiftのString(文字列) APIとの付き合い方
- 恐怖!忍び寄るライブラリへのロックイン
- 関数型プログラミングの実際のところ
- Never GiveUp というタイトルで Swift Tweets で発表しました。 #swtws
- Clean Architecture 開発ツールの話
- iOSにおけるクリーンアーキテクチャよもやま話 #swtws
- 型推論のビルドが遅いらしいから調べてみる
- iOSエンジニアの正規表現入門
- UIViewPropertyAnimatorの基本まとめ①
- Swift3での日時に関する処理
- プッシュ通知を究める!その①〜普通のプッシュ通知の実装の仕方〜
- プッシュ通知を究める!その②〜リッチ通知(メディア付き)の実装の仕方〜
- KickStarter iOSアプリのStoryboardのenumでの管理のしかたに感動した
- iOSアプリからFirebase Cloud Messaging経由でプッシュ通知を送る
- Swift で Elixir のパイプ演算子を実装してみる
- Swiftの値型と参照型、値渡しと参照渡し
- Swiftのクロージャにおける循環参照
- [Swift] Validatorというライブラリを使ってValidationする
- KituraでWebSocketを動かす
- iOSアプリ開発基礎ハンズオン
- 素晴らしいSwiftのポインタ型の解説
- Swiftのメモリレイアウトを調べる
- Storyboard を使わずコードだけで画面を生成、遷移をしてみる
- DispatchQueueでthrottle/debounceを実現する
- Swiftのenumのメモリレイアウトの最適化が凄い
- RxSwiftでの実装練習の記録ノート(前編:Observerパターンの例とUITableViewの例)
- [Swift3]SegmentedControlでViewを切り替える
- SwiftLintのバージョンを固定する方法
- iOS 10.3で追加されたアプリレビューを投稿できるSKStoreReviewControllerを試してみた
- UIViewControllerAnimatedTransitioning によるカスタムトランジション
- CFSocket を使って iOS で socket 通信した話
- 画像をダブルタップとピンチイン・ピンチアウトで拡大・縮小する Swift3編
-
iOS 10.3からアプリ内レーティングが可能に!- SKStoreReviewController – - Swift3による自動更新購読のアプリ内課金(In-App Purchase)の実装 for 月額課金
- 【Swift】AppStoreのレビューフォームを開くパラメーターが新登場 – action=write-review –
- Swift EvolutionのAcceptedステータスまとめ (2017.1.27) – Protocol-oriented integers, Permit where clauses to constrain associated types, …etc
- 【Swift3.0】xibを使ったカスタムビューの作り方
- iOSの審査に関するまとめ
- Apple Watch に Core Motion を使って色々なデータを取得して表示させてみる
- [macOS]macOS Cocoaプログラミングをはじめる
- 値渡しと参照渡しと参照の値渡しと
- 【iOS】UILabelにPaddingをつける(Swift3対応)
- 【AutoLayout】UILabelの幅を文字列の長さに合わせて可変にする方法
- 【Swift3】ToDoアプリを作る【CoreData】
- Cloud9で始めるServer Side Swift (Vapor)
- UIViewPropertyAnimatorの基本まとめ②
- #Swift fastlaneの次に来る? Sourcery🔮でメタプログラミングする
- iOSのMetal Performance Shadersでニューラルネットを実行する際のモデルの渡し方
- iOSアプリ開発時に使う小ネタ
- 2点間の距離計算 (C, Clojure, Go, Haskell, Java, LOGO, OCaml, Ruby, Rust, Scratch, Swift)
- SwiftでBase64 Encode / Decodeする
- Today Extensionについて
- [Swift 3.0] ViewController単位で画面の向きを制御する
- RxSwiftでの実装練習の記録ノート(後編:DriverパターンとAPIへの通信を伴うMVVM構成のサンプル例)
- swiftのguardを使ってみる
- 乾電池型IoT”MaBeee”を使って簡単なおもちゃ制御アプリを作ってみる
- ReactiveSwift 基本要素の使い方 Signal / SignalProducer編
- [Swift|Kotlin]+Rxで作ったネイティブアプリのコードの違い
- 1行で全てのUIButton(UIView)の同時押しを無効にする
- ありそうでなかったSwiftでのPostリクエストの投げ方
- Swiftによるシリーズアプリの共通部分を切り出して一括管理する
- [iOS] Google VR SDK の代替案としての MetalScope
- iOS アプリの Unit Test – Swift 編
- Swift で Quadratic Bezier 曲線の長さを計算する
- 脳波でスカートをめくるP-WAVEを開発した話
- 今更聞けない?Struct と Class の使い分け方(補足)
- わーい、すごーい
- Swiftで「サクッと使える」通信ライブラリ【RapidFire】
- Swift GPUImage2で画像の平均色を抽出する
- 【Swift x PHP】iOS端末とPHPサーバでHTTP通信
- Auto Layout を使わずにわかりやすいコードでレイアウトが組めるフレームワーク NotAutoLayout
- Carthageで管理しているライブラリのライセンスをまとめてくれるスクリプト
- 【Swift 3】処理の完了を待ってから後続処理を行う
- 【Swift x Ruby】iOS端末とRuby on RailsサーバでHTTP通信
- Swift:UIColorを16進数カラーコードで初期化する
- SwiftLintのRules全まとめ
- Xcode 不使用リソースを抽出する
- ios10 シャッタースピードやホワイトバランスなどiPhoneカメラに特殊機能を実装する方法
- RxSwiftとAlamofireとObject Mapperで
- UITextViewにタップ可能なリンクを挿入する
- web制作者にもわかる、Swift 3が++と–を削除した理由
- iOSのMPSCNNに渡すモデルパラメータのフォーマット / TensorFlowからの書き出し
- [Swift] 三角形のボタンを作る
- [Swift]segueを使った画面遷移、segueを使わない画面遷移
- SwiftにおけるMethod Dispatchについて
- ZIG SIMが送信するセンサの種類とデータ構造について
- TwitterAPIとSwiftを使ってiOSアプリを作ろう! – 前編 – #dotsgirls
- TwitterAPIとSwiftを使ってiOSアプリを作ろう! – 後編 – #dotsgirls
- TwitterAPIとSwiftを使ってiOSアプリを作ろう! – カスタマイズ編 – #dotsgirls
- Google画像検索APIをiOSで利用する
- Apple公式のiPhoneアプリチュートリアルやってみた①(Build a Basic UI)
- Swift3対応をこれからする人が役立ちそうなこと!
- tableView(_:didSelectRowAt:)にて、modalなSegueをperformSegueすると描画が遅い件は、DispatchQueue.main.asyncで解決できる
- Custom URL Schemeでアプリ内の任意のページを表示する
- Swiftの強力な機能であるstaticメソッド制約の紹介と、Kotlin, TypeScript, Java, Scala, C++との比較
- [iOS] Swift + Kannaでtableをスクレイピング
- 激安NSAttributedString
- lazy var の遅延参照?という面白い動き
- UIButtonの画像をUIButtonに対してAspectFitする方法
- iOS の時間関数の精度
- [Swift] count == 0 より isEmpty を使うべき理由
- [swift] InterfaceBuilderで多角形のボタンを作る
- Swift3で消費型アプリ内課金(In-App-Purchase)を実装してみた
- UIStackViewを使って詳細ページの実装をシンプルにする
- Swift 3のUIScrollViewでカルーセルUI(ページング/画像などをスワイプで行き来できるView)をつくる
- iOS(Swift)でアラート画面のようにViewの背景透過をする
- Concourse CIでiOSアプリのCIを行う
- VO, DTO, POSO, DAO, Entity の違い
- Swift の文字列の長さ
- モックオブジェクトをより便利にする (Try! Swift2017)
- よくわかるUIGestureRecognizerDelegate
- Swift,iOS,Xcodeの設計についてメモ
- サーバサイドSwiftの現状考察 #tryswiftconf
- Try! Swift 2017のまとめ
- TableViewで複数セルを一気に複数削除する
- 新しいアプリを作るときによく使うSwift Extension集
- ユニットテストにも可読性を持たせる (Four Phase Test)
- try! Swift 2017 Tokyo 参加レポート
- UIImageのリサイズ方法と注意点
- 始めて見よう! SwiftでWebアプリ開発(基礎編)
- try! Swift Tokyo 2017 に参加した&リンク集
- 2017年におけるObjective-Cコミュニティの動向
- SpriteKitの衝突処理について(categoryBitMask collisionBitMask contactTestBitMask 使い方)
- 猿がようやく理解したSwiftのdeferの使いどころ
- [Swift3.0][iOS][SpriteKit]SpriteKitでテキストを落としたり、ぶっ飛ばしたりした!
- SwiftはどのようにJavaの検査例外を改善したか
- iOS 10以降のNotificationの基本
- 猿がついに理解できたSwiftのthrow・do・try・catchの意味
- print()やNSLogを書かずにconsoleにメッセージを出力する方法
- 猿がもがきまくって理解したSwiftのデリゲート(Delegate)という仕組み
- iOS Test Night_#3に参加できず悲しいのでまとめた
- iOS Test Night #3
- Firebase Cloud Messagingで画像つきプッシュ通知を送信する
- TypeというiOS用のMarkdownエディタを作った
- iOSのCIにモバイル向けCI、Bitriseを導入する(CocoaPods, GitHub Privateレポジトリ対応版)
- RxSwift 3.3.0で追加された3つのUnit(Single, Maybe, Completable)
- CAMPFIRE iOS #1 参加レポート
- 【iOS】ViewControllerを汚さずにUITableViewの下部からCellを追加する実装
- [Swift3]文字列が人名かどうかをバリデーションする方法
- [Swift] シンプルなカウントアップでSequenceに強くなる
- LINQライブラリまとめ
- iOSのBackground Transferがよくわからない人用に整理した
- [iOS][Swift]UITableViewのヘッダーとフッターを設定する方法
- 【Git】 project.pbxprojのコンフリクトの直し方
- Swiftのmutatingキーワードについて
- アプリにApple Payを導入する – 商品購入のハードルを下げる –
- Swiftでasync/awaitな書き方もできるPromiseライブラリHydra
- Playground で Carthage ライブラリを import する
- キリスト教の牧師(見習い)からWebエンジニアに転職した話
- [Swift 3.0]NSLayoutAnchorを用いたコードによるAuto Layout
- 俺の俺による俺のための iOS プログラム設計
- 和暦に関するメモ
- Interface Builderとソースコードで共通のカラーパターンを利用する方法
- SwiftyBeaver でアプリケーションログをメール送信しデバッグしやすい環境を作る
- [MVVM] kickstarter/ios-oss での画面遷移のやり方
-
図解 MemoryLayout
で解き明かす型のメモリー構成 - iOSのビルド高速化 7つの方法
- LINE NEWS風のUI実装
- カメラロールのようなシンプルなイメージピッカーの作成
- swiftLint 導入
- Instagramライクなパン/ピンチ操作できるイメージビューの作成
- 【iOS】アプリ内からレビューを依頼する 10.3未満も対応
- How to write basic UnitTestsを発表した際の参考資料
- Swiftのstatic、classキーワードの違いについて
- 心がHomebrewで旧バージョンのパッケージを入れたがってるんだ
- ただ画像を右側に表示したいだけなんだ・・・ – UIButtonの画像を右寄せにする
- 制約の修正なしで縦方向に要素を追加可能なビューの作成
- Storyboard上で置いてるUIVisualEffectViewのブラーのかかり具合を調節、アニメーションさせる [iOS10]
- DI(Dependency Injection)の概要
- SwiftRater を使って好きなタイミングで SKStoreReviewController を表示する
- Swift 3.1で死んだコードまとめ
- クラスや変数の名前とかを安易に英語にしたい
- Swiftのprint()をファイル名、行数、関数名を出力して分かりやすくする
- iPhoneのSFSpeechRecognizerとAVSpeechSynthesizerと発泡スチロールでボスっぽいなにかを作る
- [Swift] 順序付き辞書、DictionaryLiteral
- iOS/Androidアプリを突貫工事で開発するときにやって良かった!悪かった!こと まとめ
- APIKitでRequestのイニシャライザに渡すのはValueObjectやEntityじゃないほうが良い
- iOS 実装サンプルアプリ集
- iOSアプリを新規開発するときに最低限守っていること
- 日付関連クラスのまとめ(Swift3)
- Foundation.Operationの並列オペレーションがよくわからない人向けの説明
- Swiftで複数のフラグを管理するためにOptionSetを使うと便利だった
- Swiftで連番画像のコマ送りアニメーション
- Swift3でJSONパースを行う
- Swift3.0 NavigationBarをhidden(隠す)方法
- iOS 10 での通知処理について
- 【Swift3】RxSwift + APIKit + Himotokiで作るAPIクライアント
- Swiftでいい感じのViewModelを作るためのメモ
- IGListKitとRxSwiftを掛け合わせてみた🤔
- UIFeedbackGeneratorの使い方と便利に使えるライブラリ
- カスタムViewをNibから初期化の最新版
- 【iOS】ステータスバーのカスタマイズ【Swift3.0】
- carthageのバージョンを今すぐ上げよう
- SwiftでContainerViewを使ってみる
- Swift の struct の stored property は var にしよう
- アイコンを申請なしで変える(iOS10.3)
- SwiftのOptionalのベストプラクティス
- Vapor as a web framework
- モックを「差し込む方法」を考える
- Swift4で何がかわりそうなのか
- Swift Standard Library相関図を作ってみた・眺めてみた #swtws
- iOS(Swift)から3ステップでMastodonに投稿を行う
- なぜDelegateをプロパティに持つとweakを指定しなければいけないの?
- SlideMenuControllerSwiftの使い方とカスタマイズ
- あとで読むQiitaリーダーアプリをリリースしました
- null安全な言語でも、バグ検知を怠れば安心ではない
- 【ネタ】Swift で Sleep Sort
- [Swift] enumerated()はindexを返さない
- [SiriKit]Siriから料金の支払いをする
- 2017年版Realmのエレガントな使い方
- Swiftのプロパティとinout参照を組み合わせたときの挙動が面白い
- swiftのenumでStringがカスタムなときでもenumを諦めない
- 【iOS】Fluxを利用して画面遷移を制御する
- Swift3.0 で CoreGraphicsを使って見る
- Debug Memory Graph で Memory Leak を調査する
- Apple公式のiOS開発チュートリアルをやってみた(Andoridエンジニア視点)
- Swift 4の新しいreduceが素晴らしいので紹介する
- Alert,ActionSheetの表示処理がスッキリかけるUIAlertControllerのラッパーライブラリを作りました
- 体系的なSwift言語学習
- AppのIconからVersionやCommitを判別して混乱を防ぐ
- IB上で範囲の確認ができるUIButtonのタップエリアを拡大する実装
- RxSwift 用語解説
- 【Swift3.0】Alamofireで画像&パラメータを送信
- Swift Package Manager(SwiftPM)で作ったコマンドラインツールをHomebrewに登録する方法
- SwiftではバージョンはStructにして演算子オーバーロードで比較したらどうでしょう
- Swift3ではKVOにkeyPath()式を使っていくのが便利
- やはりお前らのboundingRectWithSizeは間違っている
- SwiftでTestコード(on Xcode)
- `typealias My` をススメようと思ったけどやめた件 あるいはstatic methodをどうやって呼ぶか
- Firebase iOS SDKが刷新されましたよっていう話し
- [2017年版]RxSwift + Alamofire + ObjectMapper + RealmのSwift実装について
- BluetoothをもちいたiOS同士の通信
- Rails 5 Action CableチャットアプリのiOSクライアント側を作る
- SpeakerDeckのスライドをPDF形式で表示できるiOSアプリを作った
- SwiftでArrayがnilか0件の場合に共通の処理を動作させたい時はnil結合演算子を使う
- fastlaneを導入してビルドを楽にする
- 10年間の iOS 機能のまとめ with WWDC
- 書評:Swiftの各機能が「なぜ」存在し「いつ」使うべきかを解説した技術書 – Swift実践入門
- iOS SwiftでBLEのサンプルを動かしてみる
- Swift3で日付(Date)の比較が超簡単になっていた件
- AppleWatchKitとSpriteKitでスペースシューティングゲームを作ってみた
- 様々な言語でMap, Filter, Reduceを実現してみた(1)
- アニメーション付きのボタンを実装するためのテクニック
- Setを使いこなしたい(願望)
- AVFoundationで動画のリアルタイム合成
- Swiftガイドライン的な
- 位置情報アプリ開発者必見!Energy Efficiency Guide for iOS AppsのReduce Location Accuracy and Durationを読んでみた
- Instagramのような画面UIを簡単に作れるPastelViewを試してみた
- Swift API デザインガイドライン
- インタフェースと型クラス、どちらでもできること・どちらかでしかできないこと
- サーバーレスサーバーサイドSwiftとHexaville
- RxSwiftのExamplesにしれっと入ってる双方向データバインディングの演算子がイケてた
- Swift3対応をしてハマった不具合
- iOSでアプリ間でデータをやり取りするためのNの試行
- Embedded framework使用時の肥大化問題
- Swiftならメモ化も最高にスッキリ書けます
- 詳解! ios-Charts
- Instagramのログイン画面みたいなグラデーションのアニメーションを自分で作る
- Swiftのmap, filter, reduce, etc…は(あたりまえだけど)for, if, switch, whileからできている
- iOS11で新しく導入されたFramework
- pageViewController(_: viewControllerBefore:) および pageViewController(_: viewControllerAfter:) が呼び出されるタイミングについて(UIPageViewController)
- What’s New in iOS11まとめ (Metal2以外)
- Xcode による iOS 開発で秘匿したい情報をどう管理するか
- iOS11のCoreNFCを使う
- 公式ドキュメントを追いながらARKitを試してみよう
- Swiftでクラス名や関数名等をログ出力する
- 【iOS 11】開発者ドキュメントから見る iOS 11 の新機能 #WWDC17
- WWDC2017で更新されたサンプルコードまとめ
- Xcode8のDebug Memory GraphでCFArrayのメモリリークの原因を探る
- ARKitを触ってみよう 〜第1話〜
- Swift4.0 で追加される Codable
- 引っ張って閉じることができるモーダルを実装する (UINavigationControllerの場合)
- iOS11 Swipe Actions
- [iOS][Swift3] ニュース系アプリのユーザインタフェース PageMenuKit の実装
- Swift4 CodableでJSONが扱いやすくなる?
- Swift4のCodableでフラットなJSONからネストしたオブジェクトにデコードする
- Swift4のCodableでISO8601の日付をデコードする
- 【iOS 11】【Core ML】pip install coremltools でエラーになった場合の対処法
- Swift4のJSONDecorderは、Date等のパース方法をカスタマイズできるみたい
- ReactorKit(Flux + Reactive Programming)を学ぶ1 入門編
- ReactorKit(Flux + Reactive Programming)を学ぶ2 基礎編
- Swift4のCodableに対応した、独自のDecoder(CSVDecoder)を実装してみよう
- 個人開発アプリでSwift 4に一足先に対応しました
- [Xcode 8] Swiftのドキュメントコメントについての簡潔なまとめ
- init の名は。
- iOS11で追加されたDeviceCheckについて
- SwiftでWebRTC実装ハンズオン 事前準備編
- iOS11で発表されたMusicKitについて
- iOS 11 WKWebView 3大新機能 (WWDC 2017)
- NSURLSessionがメモリリークしてしまうのをなんとかした
- Array や Dictionary にもモダンでオシャレな extension を実装する
- 99%くらいのSwiftプログラマーが使わないであろう演算子の話
- UIKitのView表示ライフサイクルを理解する
- 【まとめ】What’s New in Testing【WWDC 2017】
- Swift PlaygroundsでXcode projectのコードを動かしてみよう
- WWDC17で新しく発表された画像フォーマットHEIFを使ってみた
- iOSでの各回転検知方法とその結果
- SwiftでWebRTC実装ハンズオン 本編
- [Swift4] privateにextensionからアクセスできる
- iOS – CrashlyticsのrecordErrorでカスタムログを送る
- コードを一行も書かずにHello Worldする方法
- 画像を表示する際にモアレ(干渉縞)を抑制する方法
- APIKitとCodableでAPIクライアントを作る
- CodingKeyで、case名のcamelCase ⇄ stringValueのsnake_case を自動で変換する
- 【まとめ】Engineering for Testability (前半)【WWDC 2017】
- 【まとめ】Engineering for Testability (後半)【WWDC 2017】
- 【Swift】iOSで放置型育成ゲームを作りたい(0)
- [Swift]初心者のためのSwiftチートシート
- Swift Package Manager (SwiftPM) Version 4 概要
- ARKitで豆腐作り
- Swiftで複数の非同期処理の完了時に処理を行う
- 【Swift】hogehoge.delegate = self は何をしているのか。
- cmdshelfによるスクリプト運用のご提案
- mbed × BLE × iOSでとりあえず通信したい人のための記事
- iOS LINEでログイン(Line SDK)
- Swift:UserDefaultsで初期値を設定する方法
- ios, androidのローカライズファイルを共通管理して幸せになった話
- 型システムの理論からみるSwiftの存在型(Existential Type)
- Swift4.0でDictionaryが大幅にパワーアップした
- Swift4で変更されたStringAPIをいくつか試してみた
- NO MORE ビルド時間泥棒 ☕️❌【RxSwift編】
- 新規アプリサービスのためのログ実装とサービス選定
- SwiftのSelfキーワードの使い方まとめ
- [Swift]WinでやるC#erの為のSwift基本文法覚書
- Decoder, DecodingContainerの、デコード先の型を推論させたい!明示的に指定したくない!
- XCode9で追加されたAsset catalogsのNamed colors supportについて
- Swiftのattributeまとめ[Swift4対応]
- SwiftでもKotlinのif式を使いたい
- iOSでBeaconの振る舞いを確認する
- はじめてのSwiftアプリ制作4: StoryboardとAuto Layoutその1
- Swift4でのSingletonを用いた共通データの値渡し
- ルートが配列のJSONをCoadableでカスタムモデルにマッピングする
- iOSで楽にデバッグメニューをつける
- 【Swift】TextFieldのキーボードを閉じる方法3選
- SwiftとKotlinの文法を比較してみた(基礎パート)
- [コピペで使える]swift3/swift4でリアルタイム顔認識をする方法
- Swift4 [SE-160 Limiting @objc inference] 概要
- SwiftのExtensionによるクラス分割
- Xcodeのビルド待ちで消耗してたので見直したら50%以上削減できた話
- Swiftコンパイラ開発環境構築
- (初心者向け)Flickr Apiを使って画像を引っ張ってくる(1)
- Equatableとは?(swift) ~ object同士を比較できるようにしよう〜
- Swift4のCodableが内部で何をやっているか確認する
- SwiftでアプリのCPU使用率とメモリ使用量を取得する
- できるだけプログラムっぽくないプログラミングへの挑戦(Swift編)
- MVVMをベースにしつつCleanArchitectureを取り入れてみた
- GCD(Grand Central Dispatch)でキューの順番とスピードを制御する方法(1/2)
- GCD(Grand Central Dispatch)でキューの順番とスピードを制御する方法(2/2)
- Swiftコンパイラのテスト環境
- できるだけプログラムっぽくないプログラミングへの挑戦(Objective-C編)
- 特定のアプリがインストール済みかチェックする
- 「PythonとSwiftは結構似ている」説の検証
- ARKitでタップした座標を検出する方法
- Aspect Fill, Aspect Fit, Scale to Fillの違い
- APIKitとCodableとの連携
- ストーリーボードでUIを綺麗にレイアウトするネタ集
- Swift コンパイラのアーキテクチャ
- 最近Swift書いていて可読性を上げるために意識していること
- Swiftで静的DI(Mixin-Injection)
- UIImageView で cornerRadius と Shadow を同時に使いたい
- Enigmaの実装
- iOS開発でClean Architectureを採用した際のイイ感じのディレクトリ構成とは
- iOS開発で導入しているライブラリの一言説明
- 【メモ】Xcode9ビルドでCarthage経由で導入したライブラリに関してswift version errorが発生
- インクリメンタルサーチ【RxSwift/RxCocoa編】
- CotEditor を Swift に移行する
- Swift3.0でアニメーション1 ~ Animate()メソッド編~
- Swiftに息づくstructural types(構造的型)
- メソッドのhookは正しいタイミングで行おう【RxSwift/RxCocoa】
- 実践Swiftコンパイラ #swtws
- 純粋値型Swift
- Mac: 開発向け厳選ツール群(18/6/23更新)
- Swift でアニメーションの連続実行をしてみる話
- SwiftでiOS脱獄チェック
- iOSの機械学習フレームワークの比較 – Core ML / Metal Performance Shaders (MPSCNN) / BNNS
- 【初心者向け】Core Dataの使い方と説明swift3.0
- RxSwiftのshare*の早見表
- Swiftの有名画像キャッシュライブラリを比較してみた
- indexがArrayの範囲内かチェックする色々な書き方
- 【iOS】fastlaneでipaファイルを作成して、fabric crashlyticsでベータ版を配布し、Slackで完了通知を行う
- iOSアプリでMockを使ってUnitTestを書く
- iOSアプリでCIを始めようとサービスを調べた
- StubとSpyを使ってiOSのUnitテストを書いてみた(Clean architecture)
- RSKImageCropperの使い方とカスタマイズ
- アプリ内での Touch ID を利用したユーザ認証
- Automatically manage signingとxcconigで超効率化
- Instagram APIでOAuth認証する (Swift3版)
- [Swift] MainThreadで処理を実行する
- Carthage updateとCarthage bootstrapの違い
- iOSのクラッシュログをSymbolicate(復元)して解析する
- やさしいSwift単体テスト~テスト可能なクラス設計・前編~
- やさしいSwift単体テスト~テスト可能なクラス設計・後編~
- [iOS][Swift 4] CodableでJSONのパース
- [Swift] Dictionaryをこねくり回すネタ集
- Screen Recordingの録画開始・停止を取得する
- TDD ✕ Property-based Testing (SwiftCheck) で数学パズルを検証してみる
- 超効率化外伝: xcconfigの便利なところ&設定例
- Swiftで花火を作った話
- SwiftでHigher Kinded Polymorphismを実現する
- 絶対にやってはいけない「Apple IDをテストで13歳未満にすること・・」
- Spajam2017優秀賞「嫌われAIの命名」の発想プロセスからiOSアプリ実装まで
- RxSwift `a.withLatestFrom(a)` 同じ上流元の同期的合流問題
- Range が Codable に適合してなかったので後付けで適合させてみる話と、Codable のエラーハンドリングについて
- Swiftのfinalについて
- 【Swift】Dateの王道 【日付】
- サーバーレスとiOSアプリの連携 〜IBM Cloud Functionsを使ってサーバーサイドSwiftで試してみる
- ARKitで立方体の6面それぞれに異なるテクスチャを貼る方法
- iOSでlottie-iosを使ってリッチなアニメーションを簡単に実現してみる
- Swift の class の mutating func とは何か
- 余計なOptionalはやめてくれ
- 【プッシュ通知】Y Combinatorも投資するOneSignalがFirebaseより便利で素晴らしかった
- 【swiftエラー】clang: error: linker command failed with exit code 1 (use -vto see invocation)
- RxSwiftでwithLatestFromが最新じゃなくなることがあるorz
- RxSwiftについてようやく理解できてきたのでまとめることにした(1)
- RxSwiftについてようやく理解できてきたのでまとめることにした(2)
- RxSwiftについてようやく理解できてきたのでまとめることにした(3)
- RxSwiftについてようやく理解できてきたのでまとめることにした(4)
- iOSの消耗型課金のサーバーサイドTipsまとめ
- iOS 11 WKWebViewで広告などのコンテンツブロックをする
- タブスワイプで画面を切り替えるメニューUI
- 【MacOS】スクリーンレコーディング 【Swift】
- Codableについて色々まとめた[Swift4.x]
- FirebaseStorageの画像をSDWebImageで表示しようとして詰まった話
- [Swift] classにEquatableを実装するのは一筋縄ではいかない(ことがある)点に注意。
- ニュースアプリでAPIの記事をRealmにキャッシュして有効期限内だったらそれを表示する
- Swiftで参照型の値から生ポインタを作る方法
- Swift の protocol における Interface と Method の違いを理解しよう
- ARKitを扱う際の心構えとTips
- 脱Storyboardのすすめ
- Firebaseでアプリを開発するならClient Side Joinを前提にすること
- UILabelの文字色をグラデーションさせる
- [Swift3]ローカル通知の実装方法
- [Swift]iOSのデフォルトの関数を活用した Validation String Extension集
- Closureって美味しいの?
- [Swift3]アプリ内でレビューを依頼する
- プッシュ通知設定画面へ遷移させる為の実装
- iOS9, 10 WKWebView – Cookie操作
- iPad対応アプリを開発するときに、UI周りで気をつけることをまとめてみた
- Swift 4 で「プラマイ」範囲を作る
- ぼくのやっているVIPER(のようなもの)
- MVVMを勉強するときに参考になったリンク集 & 概要まとめ
- Xcode8でiOS11beta端末の動作確認がしたい(iOS11実機ビルドしたい)Could not locate device support files.エラー
- iOS11のバグ修正を行うに当たって気になったレイアウト関連の変更点(contentInsetAdjustmentBehavior, SafeAreaLayoutGuide)
- iOS 11 UITableViewでcontentOffsetを使ったスクロールが上手くいかない
- iOS 11 の Safe Area は Auto Layout だけでなくコードベースでも取れる
- iOS向けfastlaneアクションまとめ
- iPhone Xをネイティブ解像度から判定する
- Swift4 Stringのsubstring周りが変わっていた
- iPhone X Human Interface Guidelinesの要点
- iOSDC 2017 まとめ
- RxSwift の Observable とは何か
- Swaggerで始めるAPI定義管理とコードジェネレート
- iOS11で追加されるScreen Recordingについて
- iOS11 カメラとCoreML(Vision)で画像検出
- Swift初心者が3ヶ月でiOSアプリを公開するまでにやったこと、ハマったこと。
- iOSアプリ開発の全体像
- ARKitのコードによく出てくる4次元行列transformについて
- Swiftの @escaping と weak/unowned の理解
- iOSDC Japan 2017で「Auto Layoutのアルゴリズム」について発表しました
- Setは遅いのか
- iOSDC 2017 でさらっと出てきた Phantom Type さらっとやった話
- 超朗報。Xcode 9でやっとSwiftのリファクタリングが可能に
- iOS11から搭載されるスクリーンレコーディングでの録画を検知する方法
- Swift 4 マイグレーション、またはXcode9対応 メモ
- iOSと人工知能(AI) -GPU並列演算の仕組みと機械学習- というタイトルで、iOSDC2017に登壇しました
- 今度のiPhone Xは我々開発者をどれほど苦しめるのか #okamoba
- ARKitのサンプルコード集「ARKit-Sampler」
- iOS11のTwitter投稿対応(Social.framework → TwitterKit)
- iOS11で Grouped UITableView のセクションヘッダーに余分な高さが出る問題について
- [Swift] UserDefaults に画像を保存するとフリーズした
- iOS11 + Xcode9.0でedgesForExtendedLayoutの値を空にしていると、UITableViewのドリルダウンでアニメーションが崩れる
- 【iOSDC2017】MVC→MVP→MVVM→Fluxの実装の違いを比較してみる
- [Swift4]ARKitで球体をランダムに描画する
- 【Xcode9】ファイルヘッダーコメントをカスタマイズする
- [Swift] CharacterSetはCharacterのsetではありませんよ?
- iOS11のVision.frameworkを使ってみる
- iOS11からViewの一部だけを角丸にすることが簡単になった
- Swift 4の魅力の一面を3行で表す
- [Swift] 読み上げ機能、簡単に使えるライブラリつくったよ
- iOS11.0でUINavigationControllerのTitleViewのタッチイベントが呼ばれない現象について
- PDFKit を使ってみた
- Xcode の Debug Memory Graph が便利
- iOSアプリで紙吹雪を降らして画面を賑やかにする
- iOS 11ファイルAppにDocumentsフォルダを表示して他のアプリと共有する方法
- 【Swift】 画像を3種類も書き出したくないでござる
- Swift4 全予約語 (98語) の解説
- ライブラリを使わずにMV*の話(iOS)~ViewとModelの役割〜
- ライブラリを使わずにMV*の話(iOS)〜MVC, MVP, MVVM〜
- .ipa file を実機にインストールする方法(iTunes 12.7)
- UILabelをNSAttributedStringで文字装飾(Swift 4対応)
- AutoLayoutでiPhoneXのedge-to-edge対応

Androidに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Pythonに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Swiftに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Unityに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。