プログラミングと音楽とアニメとiPhoneとiPadとMacとAndroidとLogicとギターとテニスと車

アプリ開発系の勉強メモやTipsなどを中心に他いろいろと書いていきます。

xib(Nibファイル)からUIViewを生成するカテゴリのライブラリを公開しました

UIView-LoadNib

https://github.com/travitu/UIView-LoadNib

現在制作中のアプリでレイアウトやデザインが少し異なる複数のUIViewを用意して、
ViewController上でそれらのUIViewを切り替えて表示したい所があったので、
コードで同じようなUIViewを書くより、xibで作った方がすぐ見分けがつけやすいと思い、簡易的ですが、カテゴリのライブラリを作りました。

【使い方】

ライブラリをダウンロードして、以下の2つのファイルを含んだ UIView+LoadNibフォルダごとプロジェクトに追加します。

  • UIView+LoadNib.h
  • UIView+LoadNib.m

そしてUIViewを作ります。この時xibも追加します。
デモでは、以下のファイル名にしています。

  • MyCustomView.h
  • MyCustomView.m
  • MyCustomView.xib

MyCustomViewクラスに必要な実装を行います。
実装内容については後で説明します。
f:id:travitu:20140618003152p:plain

MyCustomView.xibを表示して、File's Ownerを選択し、
Custom Classに先ほど作成したMyCustomViewを指定します。
デモでは分かり易いようにUIView上にラベルを追加しています。
f:id:travitu:20140618003231p:plain

Main.storyboardでUIViewを新しく追加し、位置やサイズなどを適宜合わせます。
f:id:travitu:20140618003334p:plain

追加したUIViewのCustom ClassにMyCustomViewを指定します。
f:id:travitu:20140618003343p:plain

以下、ライブラリのコードと実装するコードの解説です。

UIView+LoadNib.h

#import <UIKit/UIKit.h>

@interface UIView (LoadNib)
// xibからUIViewを生成するメソッド(引数有りと無しの2種類)
- (UIView *)tra_loadViewFromNibNamed:(NSString *)nibName;
- (UIView *)tra_loadViewFromNib;
@end

UIView+LoadNib.m

#import "UIView+LoadNib.h"

@implementation UIView (LoadNib)
- (UIView *)tra_loadViewFromNibNamed:(NSString *)nibName
{
    UIView *view = [[[NSBundle mainBundle] loadNibNamed:nibName owner:self options:nil] objectAtIndex:0];
    view.frame = self.bounds;
    // translatesAutoresizingMaskIntoConstraintsはデフォルトではYESになっています。
    // もしAutoLayoutの制約をコードで書く場合はNOにします。
    view.translatesAutoresizingMaskIntoConstraints = YES;
    return view;
}

- (UIView *)tra_loadViewFromNib
{
    NSString *nibName = NSStringFromClass([self class]);
    UIView *view = [self tra_loadViewFromNibNamed:nibName];
    return view;
}
@end

MyCustomView.h

#import <UIKit/UIKit.h>

@interface MyCustomView : UIView

@end

MyCustomView.m

#import "MyCustomView.h"
#import "UIView+LoadNib.h"

@implementation MyCustomView

// Interface BuilderからこのViewを生成するためのメソッドです。
- (id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];
    if (self) {
        [self customViewInit];
    }
    return self;
}

// コードからこのViewを生成するためのメソッドです。
- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        [self customViewInit];
    }
    return self;
}

- (void)customViewInit
{
    // UIView+LoadNibのメソッドを使用してxibからUIViewを生成します。    
    UIView *view = [self tra_loadViewFromNibNamed:@"MyCustomView"];
    [self addSubview:view];
}

@end

あとはビルドすれば下記のようにMyCustomViewが表示できます。
f:id:travitu:20140618003354p:plain

【補足】

今回はxibでUIViewを生成する目的だったので、デモではinitWithCoder:を使いましたが、
コードでUIViewを生成する場合はinitWithFrame:を使います。

UIView+LoadNib.mにtranslatesAutoresizingMaskIntoConstraintsを書きましたが、
このプロパティはデフォルトではYESとなっています。もしAutoLayoutの制約をコードで書く場合などは
NOにする必要があり、詳しくは以下のドキュメントに載っています。
https://developer.apple.com/jp/devcenter/ios/library/documentation/AutolayoutPG.pdf


以上、ひとまず作りましたが、このカテゴリのメソッドを使うUIView側の実装の仕方や、
カテゴリ側でインスタンス変数が持てるようにしたり、エラー処理など配慮が足りない部分を改良していく予定です。

【勉強会】これでわかる!ヒットアプリを作るための企画、UI、マネタイズ!

標題の勉強会がappC cloud主催で今月あるみたいで、
申し込みしようとアクセスしたら、今日の時点ではまだページが無かったです。

日時:2014/6/25 wed 19:00〜21:30
場所:ニフティ株式会社セミナールーム
申し込みURL:http://peatix.com/event/40286

UISegmentedControlのタイトルの文字サイズと位置を調整するメモ

UISegmentedControlのタイトルの文字サイズはデフォルトのままでは小さいので、
サイズを任意で指定して、さらにオフセットで位置を微調整。

// _segmentControl はUISegmentedControlのインスタンス変数
[_segmentControl setTitleTextAttributes:@{NSFontAttributeName:[UIFont systemFontOfSize:16]}
                               forState:UIControlStateNormal];
[_segmentControl setContentPositionAdjustment:UIOffsetMake(0, 2)
                               forSegmentType:UISegmentedControlSegmentAny
                                   barMetrics:UIBarMetricsDefault];


UISegmentedControlSegmentAny はUISegmentedControlのすべてのセグメントを対象とする場合に指定する。
他にUISegmentedControlSegmentLeftやUISegmentedControlSegmentCenterなどもあり、セグメントの位置を指定(例えばセグメントが3つであれば、左だけ、中央だけとか)して調整ができる。

iOSの新言語SwiftでAdMobの実装方法を検証(delegate実装)

前回の続きでAdMobのデリゲートメソッドの実装部分をSwiftで書いた場合のメモです。

import UIKit
// GADBannerViewDelegate を追加
class ViewController: UIViewController, GADBannerViewDelegate {

    override func viewDidLoad() {

        super.viewDidLoad()

        // Do any additional setup after loading the view, typically from a nib.

        var bannerView: GADBannerView = GADBannerView();

        bannerView = GADBannerView(adSize:kGADAdSizeBanner);

        bannerView.adUnitID = "ここに広告ユニットIDを書く";

        bannerView.delegate = self;

        bannerView.rootViewController = self;

        self.view.addSubview(bannerView);

        bannerView.loadRequest(GADRequest());

    }

    override func didReceiveMemoryWarning() {

        super.didReceiveMemoryWarning()

        // Dispose of any resources that can be recreated.

    }


    /****************************************************/
    // 以下、GADBannerViewDelegate の各メソッド

    func adViewDidReceiveAd(adView: GADBannerView){
        println("adViewDidReceiveAd:\(adView)")
    }

    func adView(adView: GADBannerView, didFailToReceiveAdWithError error: GADRequestError){
        println("error:\(error)")
    }

    func adViewWillPresentScreen(adView: GADBannerView){
        println("adViewWillPresentScreen")
    }
    
    func adViewWillDismissScreen(adView: GADBannerView){
        println("adViewWillDismissScreen")
    }
    
    func adViewDidDismissScreen(adView: GADBannerView){
        println("adViewDidDismissScreen")
    }

    func adViewWillLeaveApplication(adView: GADBannerView){
        println("adViewWillLeaveApplication")
    }

 /****************************************************/
}

iOSの新言語SwiftでAdMobの実装方法を検証

Objective-Cで書かれているAdMobをSwiftでどうやって使うのか気になったので検証したメモです。

検証環境

Xcode 6.0 beta
GoogleMobileAdsSDkiOS-6.9.2

手順

1、Xcode6で新規プロジェクトを作成

XcodeのメニューからFile>New>Project>「Single View Application」(ここでは例として)を選択。
Language: の選択ではSwiftを選択してプロジェクトを作成します。


2、AdMobのSDKをプロジェクトに追加
今回はここの詳しい説明は省略します。
基本的に以下の公式情報の通りで導入できます。
AdSupportなど必要なフレームワークの追加とOther Linker Flagsに-ObjCを追加を忘れないようにします。

ダウンロード先
https://developers.google.com/mobile-ads-sdk/download#downloadios

プロジェクトへの追加方法
https://developers.google.com/mobile-ads-sdk/docs/#ios


AdMobについては、そのうち別記事で詳しく紹介する予定です。


3、SwiftからAdMob SDKのコードを呼び出せるようにする

XcodeのメニューからFile>New>File から「Header File」を選択し、
Swift_Bridging_Headerというファイル名(任意)にして、Swift_Bridging_Header.h というファイルを作ります。
Swift_Bridging_Header.h のファイル内に #import "GADBannerView.h" を記述します。

Swift_Bridging_Header.h
#import "GADBannerView.h" 

プロジェクトファイルを選択>TARGETS>Build Settings>Swift Compiler - Code Generation>Objective-C Bridging Header に
$(SRCROOT)/$(PROJECT)/Swift_Bridging_Header.h と書いてパスを追加します。


4、SwiftでAdMobのバナー広告を表示する

import UIKit
class ViewController: UIViewController {

    override func viewDidLoad() {

        super.viewDidLoad()

        // Do any additional setup after loading the view, typically from a nib.

        var bannerView: GADBannerView = GADBannerView();

        bannerView = GADBannerView(adSize:kGADAdSizeBanner);

        bannerView.adUnitID = "ここに広告ユニットIDを書く";

        bannerView.delegate = self;

        bannerView.rootViewController = self;

        self.view.addSubview(bannerView);

        bannerView.loadRequest(GADRequest());

    }

    override func didReceiveMemoryWarning() {

        super.didReceiveMemoryWarning()

        // Dispose of any resources that can be recreated.

    }
}

以上で、AdMobのバナー広告を表示することができます。
デリゲートの実装については後ほど続きを書きます。

「Gyazo GIF」&「Gyazo」簡単にGIFアニメーションやスクリーンショットが作成できるアプリ

f:id:travitu:20140531162109p:plain

https://gyazo.com/ja

Gyazo GIF
こちらはGIFアニメーション作成用

Gyazo
こちらは静止画のスクリーンショット

どちらもアプリを起動してデスクトップ上の任意の範囲をドラッグするだけで、
スクリーンショットまたはGIFアニメが作れます。

自分のGitHubにデモアプリを公開する時に、アプリの動きも見せたかったのでGyazo GIFを使いました。
https://github.com/travitu/TRACustomWindow

他のアプリのパッケージ名の取得方法

Androidインテントを使って特定のアプリを起動したい場合などに、
起動したいアプリのパッケージ名を調べることができます。
以下はLogにパッケージ名の一覧を書き出しています。

PackageManager pm = this.getPackageManager();
List<ApplicationInfo> list = pm.getInstalledApplications(0);
for (ApplicationInfo appInfo : list) {
     Log.d("TAG","appInfo.packageName:"+ appInfo.packageName);
}