2020年3月21日土曜日

【新作アプリ】苦手を重点的に学べる英単語学習アプリ

苦手な単語を重点的に勉強できる英単語学習アプリです^^

このアプリはユーザが間違えた単語を覚えて、その部分だけを繰り返し出題するので、あなたの苦手分野に合わせた勉強ができます。

テンポよく繰り返し答えて、すばやく効率的に英単語を覚えるのにお役立てください。 

難度の目安はTOEIC700、英検2級までくらいです。

今後、難度の幅を増やします。

 よろしくお願いします。


2020年2月24日月曜日

新規アプリの作成手順

シングルビューでバー広告をつけた状態でアプリを作成する手順。

・アプリ作成画面でCreate a new Xcode projectを選択。

・Single View Appを選択

・プロジェクトにpodが追加されたらストーリーボードのViewControllerでナビゲーションコントローラを追加して、バーが隠れないようにViewControllerの設定を変更する(写真のようにチェックを外す)


・ViewControllerのコードを編集する

import UIKit
import GoogleMobileAds //●追加●

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        InitializeAdd() //●追加●
    }

    ////●追加●
    func InitializeAdd(){
        //すでに追加されている広告を全て除外してから新たに追加する
        let subviews = self.view.subviews
        for subview in subviews {
            if subview is GADBannerView {
                subview.removeFromSuperview()
            }
        }
        //広告の実装
        let gadBannerView = GADBannerView(adSize: kGADAdSizeSmartBannerPortrait)
        // ナビゲーションバーの高さを取得する
        let navigationBarHeight = self.navigationController?.navigationBar.frame.size.height
        gadBannerView.frame = CGRect(
            x: 0.0,
            y: self.view.frame.size.height - navigationBarHeight! - gadBannerView.frame.size.height-20.0,
            width: gadBannerView.frame.size.width,
            height: gadBannerView.frame.size.height
        )
        //gadBannerView.adUnitID = "ca-app-pub-***************************"
        gadBannerView.adUnitID = "ca-app-pub-***************************"//test ad
        gadBannerView.rootViewController = self;
        let request = GADRequest();
        gadBannerView.load(request)
        self.view.addSubview(gadBannerView)
    }

}

macの容量不足でXcodeがインストールできない

63GBの空きはあるのに容量不足らしいです。

以下の記事によると、App Storeを介さずにXcodeを直接ダウンロードすればいけるようなので試してみました。
https://qiita.com/noobar/items/06ea92fa2b8b2de3ddc9


以下、実施した内容。

まずは下記サイトにアクセスして最新版のXcodeをダウンロード。
https://developer.apple.com/download/more/

ダウンロードしたxibファイルをダブルクリックして解凍。
最初は容量が足りないと出たが、もう一度ダブルクリックしたら解凍された。

解凍して出来たXcodeをアプリケーションフォルダにドラッグして置き換える。


これで無事インストールできました。

2019年6月17日月曜日

横からメニューを出して画像を選択する方法

ボタンを押すと横からメニューが出てくる方法について実装してみたのでメモしておく。

イメージは、facebookとかでもよくある、メニューボタンを押すと、左側からメニュー画面が中途半端な位置まで移動してくる感じのを作ろうと思う。調べてみると、以下のサイトが分かりやすくまとめられていて、そんなに苦もなく作れた。


http://swift.hiros-dot.net/?p=377


ハンバーガーメニューっていうんですね。
横線3つだからハンバーガー?

サイトの通りにやったら特に問題なくつくれたのでここでは特に追記する必要はないけど、ナビゲーションバー上の画像サイズは20x20だった事だけ追記しておく。




メニュー画面は特に問題なかったけど、出したメニューからpickerviewを使ってカメラロールの画像を選択して、メニューの呼び出し元の画面に表示するところが苦労したのでこちらをメモしておく。

メニューの呼び出し先から画像を選択してメニューを閉じて、元のViewControllerのViewImageに画像を貼り付けようとViewDidApperにブレークポイントを置いてみても、呼び出されない!
ので、元ViewControllerのインスタンスを2通りの方法で呼び出す方法を試した。



<方法1>
以下のサイトのように、StoryBoardから該当ViewControllerを探して、その要素にアクセスする方法。


http://crossbridge-lab.hatenablog.com/entry/2015/12/14/073000
http://karel.tsuda.ac.jp/lec/swift/SwiftMoveView2/


技術的にはとっても参考になったけど、今回の場合はこれはうまくいかなかった。
呼び出す時に、別インスタンスと判断されて、メニューを呼び出した元 ViewControllerとは別物と判断されるため?と解釈して別の方法を試した。




<方法2>
主に3ステップで解決した。

【step1】どのクラスからもアクセス可能なParameterのシングルトンクラスを作って、この中に元ViewControllerのインスタンスを持たせた。(10行目)

【step2】元ViewControllerを作成した時にParameterクラスにインスタンスを持たせた。(43行目)

【step3】画像を選択してメニューを消した後にこのインスタンスを取得して、画像を表示させた。(59行目)



# Uncomment the next line to define a global platform for your project


//パラメータクラス
class Parameter:NSObject {
    
    //元画像
    var OriginalImage:UIImage? = nil
    //元ViewController
    var MainView:ViewController? = nil
    
    static let sharedInstance: Parameter = Parameter()
    private override init(){
    }
    //set
    func SetOriginalImage(image: UIImage) {
        OriginalImage = image
    }
    func SetMainView(view: ViewController) {
        MainView = view
    }
    //get
    func GetOriginalImage() -> UIImage? {
        return OriginalImage
    }
    func GetMainView() -> ViewController? {
        return MainView
    }
}


//元ViewController
class ViewController: UIViewController{

    @IBOutlet weak var IV_Main: UIImageView!

    //画面が初期化時に呼ばれる
    override func viewDidLoad() {
        super.viewDidLoad()
        //広告の実装
        *****
        //自身をパラメータクラスに格納する
        Parameter.sharedInstance.SetMainView(view: self)
    }
    
}


//MenuController
class FileMenuViewViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {

    *****

    //イメージピッカーが「選択」された場合に呼ばれる
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
        //元画像をパラメータクラス受け渡し
        Parameter.sharedInstance.SetOriginalImage(image: info[.originalImage] as! UIImage)
        //元ViewControllerの画面に画像を貼り付け
        Parameter.sharedInstance.GetMainView()?.IV_Main.image = info[.originalImage] as? UIImage
        //Picker画面を消す
        dismiss(animated: true, completion: nil)
        //ファイルメニュー画面を消す
        UIView.animate(
            withDuration: 0.2,
            delay: 0,
            options: .curveEaseIn,
            animations: {self.V_FileMenu.layer.position.x = -self.V_FileMenu.frame.width},
            completion: {bool in self.dismiss(animated: true, completion: nil)}
        )
    }
    
}


読み込んだ元画像は57行目でパラメータクラスに格納しているので、他のクラスから元画像にアクセスする場合はParameterクラスから元画像を引っ張れるようにした。

2019年6月13日木曜日

iPhoneアプリに簡単に広告を貼る方法

iPhoneアプリに広告を貼り付けるときに、必要なフレームワークをいくつもプロジェクトに追加して、、、というのが面倒なので、podコマンドで楽に貼り付ける方法をメモします。

ちなみに以下のサイトがとっても参考になりました。
http://program-life.com/736


手順1:admobサイトで広告IDを発行
手順2:CocoaPodsでSDKインストール
手順3:info.plistの編集
手順4:広告の実装



個人的に手順2がややこしかったので手順をメモしときます。

まず、ターミナルのcdコマンドでプロジェクトのフォルダと同じ階層に移動した後で、以下のコマンドによりCocoaPodsのアップデートをする。

sudo gem install cocoapods

その後、以下のコマンドによりPodfileの雛形を作成する。

pod init



# Uncomment the next line to define a global platform for your project
# platform :ios, '9.0'

target 'ImageProcessing' do
  # Comment the next line if you don't want to use dynamic frameworks
  use_frameworks!

  # Pods for ImageProcessing
  pod 'Google-Mobile-Ads-SDK'

  target 'ImageProcessingTests' do
    inherit! :search_paths
    # Pods for testing
  end

  target 'ImageProcessingUITests' do
    inherit! :search_paths
    # Pods for testing
  end

end


上記、作成した雛形の9行目に広告SDKをインストールする記述を追記して保存したあと、以下のコマンドを実行。

pod install --repo-update

成功すると、ImageProcessing.xcworkspaceファイルが作成され、今後はこのファイルを開いてソースコードを追加していく。



※忘れてはならないのが、info.plistを編集する作業。
ファイル内のInformation Property Listの+を押下して、GADApplicationIdentifierのキーと、値にca-app-pub-****************~**********を追加する。(*は各アプリによってユニークな値)





2019年6月10日月曜日

Bloggerでソースコードのいかした貼り方

ソースコードを貼る時に、行番号出したり、ハイライトしたり、見やすく貼れないかなと探していたら、このブログが参考になりました。

http://1studying.blogspot.com/2017/04/blogger_93.html



・Bloggerのヘッダ編集画面でbodyの上に何行かスクリプト貼り付け
・記事編集のHTML画面でおまじないを書いてソースコードを貼り付け

これだけで下のように、普通よりもちょっといい感じにコードの貼り付けができました。


import UIKit

class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate{

    var picker: UIImagePickerController!
    @IBOutlet weak var IV_Main: UIImageView!
    @IBOutlet weak var BBI_FileAccess: UIBarButtonItem!
    
    //画面が初期化時に呼ばれる
    override func viewDidLoad() {
        super.viewDidLoad()
        //PickerViewの初期化
        picker = UIImagePickerController()
        picker.delegate = self
        picker.sourceType = UIImagePickerController.SourceType.photoLibrary
    }

    //ファイルアクセスボタン押下
    @IBAction func Push_BBI_FileAccess(_ sender: UIBarButtonItem) {
        present(picker, animated: true)
    }
    
    //イメージピッカーが「キャンセル」された場合に呼ばれる
    func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
        dismiss(animated: true, completion: nil)
    }
    //イメージピッカーが「選択」された場合に呼ばれる
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
        let image = info[.originalImage] as! UIImage
        IV_Main.image = image
        dismiss(animated: true, completion: nil)
    }

}

惜しいところは、貼る時のパラメータ指定のところで、swift対応がないので、識別子の色付けが不完全なところかなあ。varとか、funcとか、色付けしてくれたらなああ。

swiftでカメラロールの画像読み込み

撮影した画像に色々な加工ができるアプリをswiftで作ってみる。

Xcodeを更新してからまともにアプリを作ってなかったため、ver10.2.1での変更についていけなかった点が結構ありました。まず、ストーリーボードを開いてから、ボタンとかの配置どこいった??ってとこから始まりました。

だけど、基本的にはstory boardの使い方は一緒なので、試行錯誤的にイメージビューとナビゲーションバー、ボタンを配置。ナビゲーションバー上のボタンを押してカメラロールを表示して、画像を選択したらイメージビューに表示するコードを作成した。
画面の大きさや配置は後回しという事で。






swiftバージョンという事で、ピッカービューで選択した画像をイメージビューに表示する部分に若干時間がかかったので備忘録的にコードを書く。


import UIKit

class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate{

    var picker: UIImagePickerController!
    @IBOutlet weak var IV_Main: UIImageView!
    @IBOutlet weak var BBI_FileAccess: UIBarButtonItem!
    
    //画面が初期化時に呼ばれる
    override func viewDidLoad() {
        super.viewDidLoad()
        //PickerViewの初期化
        picker = UIImagePickerController()
        picker.delegate = self
        picker.sourceType = UIImagePickerController.SourceType.photoLibrary
    }

    //ファイルアクセスボタン押下
    @IBAction func Push_BBI_FileAccess(_ sender: UIBarButtonItem) {
        present(picker, animated: true)
    }
    
    //イメージピッカーが「キャンセル」された場合に呼ばれる
    func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
        dismiss(animated: true, completion: nil)
    }
    //イメージピッカーが「選択」された場合に呼ばれる
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
        let image = info[.originalImage] as! UIImage
        IV_Main.image = image
        dismiss(animated: true, completion: nil)
    }

}

時間かかったポイントとして、イメージピッカーの画面で画像を選択してもl.28の関数が呼ばれん。という事で、l.6でPickerクラスを作ってから、l.13付近で初期化してdelegate設定しないとダメでした。前提として、l.3のdelegate宣言は忘れずに。

あと、Picker画面で画像を選択しても、dismissしないといつまでたっても画面がきえないのね。

ということが分かりました。