![見出し画像](https://assets.st-note.com/production/uploads/images/101508973/rectangle_large_type_2_d19fab56d8e2851a788eba8a788d7ef2.png?width=1200)
【徒然iOS】気ままにUIKit85〜Tool bar 画面下部にボタンを並べる〜
概要
このマガジンは四十を過ぎたおっさんが、
を参考にStoryboardでiOSアプリを完全に趣味で楽しんでいるだけな記事を気ままに上げてます。
今回
をハイ、レッツゴ🕺
前準備
念の為、
バックアップ
新しいクラス
ビューコントローラの追加
をいつも通りやってから本題へ💃
![](https://assets.st-note.com/img/1680134556521-TXLX0VR17F.png?width=1200)
本題
ツールバーとは、
アプリが提供する機能をボタンなどで並べるためのバー
実は、
で、ToolBar自体は使ってないけど、イメージが湧きやすように、画面の下にアイコンをSFSymbolsを並べたビューを作ってた💦
あくまでもイメージでそこはやってたけど、今回はイメージではなくボタンでやってく〜〜〜!
⒈早速、ツールバーとボタンを配置
![](https://assets.st-note.com/img/1680134809357-K4wC5LRn2y.png?width=1200)
![](https://assets.st-note.com/img/1680134932169-LuVnWyGm2s.png?width=1200)
![](https://assets.st-note.com/img/1680134943615-br33o30Wny.png?width=1200)
![](https://assets.st-note.com/img/1680134983377-QYVSdvU2zi.png?width=1200)
と、ここで。
一応わかりやすいように、ビューにもイメージを貼っとこ〜〜〜〜
![](https://assets.st-note.com/img/1680135128503-TrFm3zv9hP.png?width=1200)
⒉とりあえず、アクション接続
![](https://assets.st-note.com/img/1680135355484-uzNsmzP2bt.png?width=1200)
⒊元々あるボタンの設定を変更して、Segueで繋ぐ
![](https://assets.st-note.com/img/1680135431958-MB3jKvGkXA.png?width=1200)
![](https://assets.st-note.com/img/1680135475811-eSBlOn2Ze4.png?width=1200)
![](https://assets.st-note.com/img/1680135515993-n5PdDkvO1m.png?width=1200)
![](https://assets.st-note.com/img/1680135562852-BkiVXyi7wn.png?width=1200)
⒋コード組み込み
//
// ViewController.swift
//
import UIKit
class ViewController: UIViewController {
//最初からあるメソッド
override func viewDidLoad() {
super.viewDidLoad()
}
//カメラボタン押下時の呼び出しメソッド
@IBAction func pushCamera(sender: UIBarButtonItem) {
//グラフィックコンテキストを作成する。
UIGraphicsBeginImageContext(view.bounds.size)
//ビューをコンテキストにレンダリングする。
view.layer.renderInContext(UIGraphicsGetCurrentContext()!)
//コンテキストから画像を取得する。
let image = UIGraphicsGetImageFromCurrentImageContext()
//コンテキストを破棄する。
UIGraphicsEndImageContext()
//画像をPhoto Albumに保存する。
UIImageWriteToSavedPhotosAlbum(image, self, "image:error:contextInfo:", nil)
}
//保存終了時の呼び出しメソッド
func image(image:UIImage, error:NSError!, contextInfo:UnsafeMutablePointer<Void>) {
if(error != nil) {
//エラー
print(error)
}
}
}
を参考に書き換えてみたんだけど、、、
class NavigationToolBarViewController: UIViewController{
//最初からあるメソッド
override func viewDidLoad() {
super.viewDidLoad()
}
//カメラボタン押下時の呼び出しメソッド
@IBAction func myPushCamera(_ sender: UIBarButtonItem) {
//グラフィックコンテキストを作成する。
UIGraphicsBeginImageContext(view.bounds.size)
//ビューをコンテキストにレンダリングする。
view.layer.render(in: UIGraphicsGetCurrentContext()!)
//コンテキストから画像を取得する。
let image = UIGraphicsGetImageFromCurrentImageContext()!
//コンテキストを破棄する。
UIGraphicsEndImageContext()
//画像をPhoto Albumに保存する。
UIImageWriteToSavedPhotosAlbum(image, self, #selector(self.image(_:error:contextInfo:)), nil)
}
//保存終了時の呼び出しメソッド
@objc func image(_ image:UIImage, error:NSError!, contextInfo:UnsafeMutableRawPointer) {
if(error != nil) {
//エラー
print(error as Any)
}
}
}
実行結果は、
![](https://assets.st-note.com/img/1680137917845-5l5xfL8ZXt.png?width=1200)
![](https://assets.st-note.com/img/1680137944430-CpIyxkdL3L.png?width=1200)
エラー内容を調べると、、、
てな感じなので👀
そら、いきなり前置きもなく、PhotoLibraryを開く設定のコード持ってきても、Xcode側で使う許可与えてないとエラーになるよね〜〜〜〜
info.plistでこいつら
![](https://assets.st-note.com/img/1680138218818-hjF5lzuu4l.png?width=1200)
を追加すると、エラーは出なくなったんだけど、
結局、そこから先が起動しない 藁🤣
要は、
ボタンを押したらアルバム起動して写真を追加したいだけだろ?
って感じなんで👀
なんかを参考に、イメージビューだけアウトレット接続して、
class NavigationToolBarViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
@IBOutlet weak var myImageView: UIImageView!
//最初からあるメソッド
override func viewDidLoad() {
super.viewDidLoad()
}
//カメラボタン押下時の呼び出しメソッド
@IBAction func myPushCamera(_ sender: UIBarButtonItem) {
let picker = UIImagePickerController()
picker.sourceType = .photoLibrary
picker.delegate = self
present(picker, animated: true)
self.present(picker, animated: true)
}
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
if let selectedImage = info[.originalImage] as? UIImage {
myImageView.image = selectedImage
}
self.dismiss(animated: true)
}
func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
self.dismiss(animated: true)
}
}
にコードを貼り替え〜〜〜
シミュレータで適当な、写真がアルバムにないから実機で
![](https://assets.st-note.com/img/1680139034067-I1FBnilqvB.png?width=1200)
![](https://assets.st-note.com/img/1680139048610-mru9dZ0TyQ.png?width=1200)
てな感じで動く〜〜〜〜🕺
クラスもやろうかなと思ったんだけど、どうせ動かないので、コードだけ載せておく〜〜〜
//
// TestNavigationController.swift
//
import UIKit
class TestNavigationController: UINavigationController, UINavigationControllerDelegate {
//最初からあるメソッド
override func viewDidLoad() {
super.viewDidLoad()
//デリゲート先に自分を設定する。
self.delegate = self
}
//画面出現前の呼び出しメソッド
func navigationController(navigationController: UINavigationController, willShowViewController viewController: UIViewController, animated: Bool) {
//カメラボタンをツールバーに設定する。
let button = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Camera, target: self, action: "pushCamera")
viewController.toolbarItems = [button]
}
//カメラボタン押下時の呼び出しメソッド
func pushCamera() {
//グラフィックコンテキストを作成する。
UIGraphicsBeginImageContext(view.bounds.size)
//ビューをコンテキストにレンダリングする。
view.layer.renderInContext(UIGraphicsGetCurrentContext()!)
//コンテキストから画像を取得する。
let image = UIGraphicsGetImageFromCurrentImageContext()
//コンテキストを破棄する。
UIGraphicsEndImageContext()
//画像をPhoto Albumに保存する。
UIImageWriteToSavedPhotosAlbum(image, self, "image:error:contextInfo:", nil)
}
//保存終了時の呼び出しメソッド
func image(image:UIImage, error:NSError!, contextInfo:UnsafeMutablePointer<Void>) {
if(error != nil) {
//エラー
print(error)
}
}
}
を参考に
class AlbumNavigationController: UINavigationController, UINavigationControllerDelegate {
//最初からあるメソッド
override func viewDidLoad() {
super.viewDidLoad()
//デリゲート先に自分を設定する。
self.delegate = self
}
//画面出現前の呼び出しメソッド
@objc func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
//カメラボタンをツールバーに設定する。
let button = UIBarButtonItem(barButtonSystemItem: UIBarButtonItem.SystemItem.camera, target: self, action: #selector(self.pushCamera))
viewController.toolbarItems = [button]
}
//カメラボタン押下時の呼び出しメソッド
@objc func pushCamera() {
//グラフィックコンテキストを作成する。
UIGraphicsBeginImageContext(view.bounds.size)
//ビューをコンテキストにレンダリングする。
view.layer.render(in: UIGraphicsGetCurrentContext()!)
//コンテキストから画像を取得する。
let image = UIGraphicsGetImageFromCurrentImageContext()
//コンテキストを破棄する。
UIGraphicsEndImageContext()
//画像をPhoto Albumに保存する。
UIImageWriteToSavedPhotosAlbum(image!, self, #selector(self.image(_:error:contextInfo:)), nil)
}
//保存終了時の呼び出しメソッド
@objc func image(_ image:UIImage, error:NSError!, contextInfo:UnsafeMutableRawPointer) {
if(error != nil) {
//エラー
print(error as Any)
}
}
}
に書き換えて、
![](https://assets.st-note.com/img/1680139451122-v89vaUgb0u.png?width=1200)
![](https://assets.st-note.com/img/1680139607783-JSL0fyzU8a.png?width=1200)
ま、クラスファイルで独立してるから、適用しなければいいだけなんで、コードとして残しておいても支障はないけどね👀
サイト記事の内容は以上🕺
ブラッシュアップ
さてと、よりはよっぽどこっちのが今回は大事で、
(特に、何か操作をするわけではないんだけど)
ナビゲーションコントローラーとかセグエで繋ぐ場合(普通のアプリはこちらがほとんど)
入り口のビューでもない限り、ツールバーで下にボタンなんか配置すると、、、
![](https://assets.st-note.com/img/1680139919418-K4AKChyEVN.png?width=1200)
![](https://assets.st-note.com/img/1680140070325-NkxSVeZGBN.png?width=1200)
みたいなことはよくある話。
これって、
だから実機も確認しようね〜〜〜〜
って話がメインではなくて、そもそも
ひとつの画面にボタンを上にも下にも配置しすぎるのが問題
👉そんなに情報が多くてもどれを使っていいのかユーザーはわからなくなったりする(特に老人とか幼い子供たちとか)
なので、
![](https://assets.st-note.com/img/1680140352886-2ryBMfxT5Q.png?width=1200)
ま、フルスクリーンにすればいいって思うかもしれないけど
場合によってはフルスクリーンにできない時だってあるし👀
さてと、後はいつも処理をやっていってと
![](https://assets.st-note.com/img/1680140944122-d98pdpcuub.png?width=1200)
で、カメラマークで写真選択が出るのは、ユーザーに誤解を与えるので、次いでに
![](https://assets.st-note.com/img/1680141045347-IWoKN28Pg6.png?width=1200)
*カメラを起動して、撮った写真を表示する機能に変更したい人は、
なんかでできるから、参考にしてみてね🕺
記事公開後、
![](https://assets.st-note.com/img/1680141386129-1KuUM2g3IA.png?width=1200)
Apple公式
さてと、次回は、
をレッツゴする🕺
ナビゲーション関係もこれでラストだね〜〜〜〜