20210507のiOSに関する記事は3件です。

UITableViewで⌘かshiftを押しながら複数のセルを選択するAPI

iOS13では、主にCatalystでの体験の統合を目的としてUITableViewやUICollectionViewに対して幾つかの拡張が加えられました。 この記事ではそのうちの1つの「iPadでショートカットキーを押しながら画面をタップ」を提供するAPIについて記載します。 記事の目的 辿り着きにくいマイナーAPIの一次情報への到達補助、情報統合 APIの扱い方や注意事項の記載 WWDC 言及されているWWDCセッションは上記です。このセッションはResponder Chainについても解説をしている貴重なセッションのため、勉強になりオススメです。 このセッションの6:35~ぐらいから該当の内容が始まります。 実行可能なジェスチャ UITableView、もしくはUICollectionViewに対して以下の3つを実行することができます。 shiftを押しながら項目をタップすることで編集モードに自動突入しつつ選択できる 2本指でスクロールダウンかスクロールアップをすると、その編集モードに自動突入しつつ指定範囲を選択できる ⌘キーをホールドしながら複数のセルをタップして編集モードに自動突入しつつ選択する。 詳しい挙動はAppleのファイルアプリで挙動をお試しください。 利用するAPI APIは非常にシンプルで、UITableViewDelegateに3つのデリゲートメソッドがあるのみです。 tableView(_:shouldBeginMultipleSelectionInteractionAt:) tableView(_:didBeginMultipleSelectionInteractionAt:) tableViewDidEndMultipleSelectionInteraction(_:) このshoudBeginでtrueを返すことによって、システムが自動で選択をonにしてくれます。 例えば「このデリゲートによって複数選択に突入した場合にnavigationBarのボタンをdoneやcancelに変えたい。終わったら戻したい」などの対応をする必要が出てくると思うのですが、それはdidBeginとdidEndのタイミングで実装可能です。 UICollectionViewの場合も同様に、UICollectionViewDelegateにて3種類のデリゲートメソッドがあります。 collectionView(_:shouldBeginMultipleSelectionInteractionAt:) collectionView(_:didBeginMultipleSelectionInteractionAt:) collectionViewDidEndMultipleSelectionInteraction(_:) 扱い方・注意事項 編集モード これらのTableViewへのアクションが契機となる複数選択は、そのViewを管理しているUIViewControllerのsetEditing(_:animated:)を自動で呼び出しません。(UITableViewControllerを利用している場合はスワイプの時のように自動でeditingを設定してくれるかもしれませんが、未検証です)なので、場合によってはこのような実装が必要です。 ViewController.swift func tableView(_ tableView: UITableView, didBeginMultipleSelectionInteractionAt indexPath: IndexPath) { self.setEditing(true, animated: true) // ViewControllerのsetEditingを呼び出し } MultipleSelectionInteractionとは? そもそもMultipleSelectionInteractionとはどういったものなのでしょうか?以下のようなprintコードを仕込んでみました。 func tableViewDidEndMultipleSelectionInteraction(_ tableView: UITableView) { print("\(#function) is called") } このメソッドが呼ばれたのは次の2つのタイミングです。 2本指でスクロールダウン/スクロールアップして複数選択し、指が離れたタイミング (shift or ⌘) + タップをしたとき これらの挙動から考えると「一度に複数を一気に選択できるインタラクション」を「MultipleSelecctionInteraction」と呼び、そのインタラクションの開始後、終了後に対応したデリゲートが呼ばれています。 公式解説付きサンプル この解説ページを開き、上部の「Download」を実行することでサンプルがダウンロードできるので、お手元のシミュレーターや実機にて挙動を確かめられます。 Selecting Multiple Items with a Two-Finger Pan Gesture 関連セッション こちらのセッションでセルのセレクションに関する新しいジェスチャーが紹介されています。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

アプリのディープリンクまとめ

ディープリンクとは? urlでアプリの特定画面を開く技術全般のこと。 Androidにおいては、intent-filterでActivityを起動する仕組みのことも指す。 http/https以外のschemaに反応させたい場合もこれを使う。 (tel:// とか mailto://とか) Androidアプリリンク Android版Universal Links intent-filterだと、同じ条件が設定されているActivityが起動し得るので(メールアドレスをタップすると複数のメーラーが候補に出てくるように)起動するアプリを限定したいときに使用する。 検証用にアプリサーバーなどに所有者を示すファイルを置く必要がある。 Universal Links iOSにおけるディープリンクの新しい実装。 Androidアプリリンクとだいたいの動作は同じ。 (使えるようになるまでの手順も似ている) Custom URLs Androidにおけるintent-filterによるディープリンクの実装と同じもの(古い実装)。 例えば、Facebookならfb://user/hogehoge みたいなurlでFacebookアプリのユーザーページを開く、といったurlのこと。 DynamicLinks Android/iOSにおけるディープリンクの実装をラップしたサービス。 内部的には前述の実装を使い分けている。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Storyboard脱却への第一歩

今回はStoryboardを使わない開発について書いていきます。 SwiftUIを勉強したということもあり、全てコードでの開発をしてみたいと思いました。 なぜStoryboardを使わない開発をするのか 一番大きな理由は、チーム開発時のコードレビューがやりにくいと感じたからです。 GitHub上では、StoryboardはXML形式で表示されます。XMLを眺めているだけだとViewがどんな見た目をしているのか把握することが難しいです。他には、コンフリクト修正をやりやすくするという点があります。Storyboardの場合だと、コンフリクトしている両ブランチをcloneしてどちらの見た目を優先するのか考える必要がありますが、SwiftファイルでViewを書くとその手間が省けるという利点があります。 後は個人的な理由ですが、私が使っているmacだとスペックがあまり高くないので、Storyboardを開くまでに時間がかかってしまい、ストレスに感じていることも理由の一つです。 でも初心者はStoryboardを使った方がいいかも StoryboardはUIを直感的に配置でき、オートレイアウトもStoryboard上で完結させることができます。オートレイアウトは慣れが必要なのですが(私自身も試行錯誤しながらオートレイアウトつけます...)、Viewを配置することに関してはStoryboardは時間をかけずに簡単にできます。 入門書もStoryboardを使って紹介しているものが多いので、初心者はまずStoryboardを使ってiOSアプリ開発を体験した方が挫折せず取り組めるかと思います。 Main.storyboardを削除する さて、ここから本題です。 実際に、Storyboardを使わない開発の第一歩を踏み出します。 プロジェクト立ち上げ時にデフォルトでMain.storyboardあるので、このファイルを削除します。 「え? ホントに消すの?」と不安な人もいるかと思いますが、大丈夫です。思い切って消しましょう!! この時点でビルドすると、「Mainっていう名前のstroyboardが見つけることができないよ」といった旨のエラーがでます。  Info.plistのStoryboard Nameを削除 上の写真にもあるようにStoryboard Nameの項目を削除します。 この時点でビルドすると、成功しますが、真っ黒な画面になります。 xcodeprojのMain Interfaceを空にする TARGETS > General > Development InfoにあるMain Interfaceの項目を空白に設定します。 この時点でもビルドすると、成功しますが、真っ黒な画面になります。 SceneDelegate.swiftを編集 以下の通りにSceneDelegate.swiftを編集します。 SceneDelegate.swift func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { guard let windowScene = (scene as? UIWindowScene) else { return } window = UIWindow(frame: windowScene.coordinateSpace.bounds) window?.windowScene = windowScene window?.rootViewController = ViewController() window?.makeKeyAndVisible() } rootViewControllerに設定することで、今回はViewControllerが初期画面として表示されます。 ViewController.swiftを編集 分かりやすいように背景を青色に設定してみます。 ViewController.swift import UIKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = .blue } } ビルド 無事、表示できました!!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む