質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.62%

  • iOS

    3908questions

    iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

  • Objective-C

    1172questions

    Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

  • iPhone

    964questions

    iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

iOSでサイドメニューの実装

受付中

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 1,515

toolonride

score 5

iOSアプリに横から出てくるメニューを実装しようとしています。

検索してみた所、どうもフェイブックの様なメニューが出てくると
メイン画面もそれに合わせてスライドするというものが多いのですが
メイン画面に被せて表示されるメニューを考えています。

イメージはコチラです。
https://github.com/romaonthego/REFrostedViewController
このサンプルが非常に良かったのですが
実装してみると小枠のメニュー数が固定しか無理なようでした。

具体的には

大メニュー
小メニュー
小メニュー
大メニュー
小メニュー
小メニュー

上記はいけますが

大メニュー
小メニュー
大メニュー
小メニュー
小メニュー

の様に小メニューが不規則なパターンには対応していませんでした。
試しに文字列を表示する部分を
@"", 
としてみたり、そもそも記入しなかったりしてみましたが
どうも旨くいきません。
プログラムスキルも、今Objective-Cの参考書を探している
プログラム歴1週間程度です。

このサンプルを修正する方法がありましたらと思い
投稿させて頂きました。


また検索にて
「iOS サイドメニュー」
「storyboard スライドメニュー」
「side menu -facebook」
「no slidein submenu」
等々で検索していますが
この他のメインに被せるタイプのサンプルが
全然見つからない(同じ作者の別サンプルと、テラテイルに投稿されていた物くらい)のですが
ワードが悪いのでしょうか?それとも、あまり需要がないのでしょうか?
重ねての質問になりますが、よろしくお願い致します。
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+1

REFrostedViewControllerは、メニューについて何の制約もありません。
通常のViewControllerと同様に、好きなようにデザインしてください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/06/29 14:24

    回答ありがとうございます。
    通常のViewControllerと同様と書かれていたので
    早速
    https://github.com/tamotamago/KTSlideMenuController
    にあるKTViewControllerのソースを、REFrostedViewControllerの
    DEMOMenuViewControllerに貼り付けて
    ストリーボードもそっくりそのまま貼り付けてみました。

    しかし起動してみると
    NSLog(@"%ld, %ld", indexPath.section, indexPath.row);
    の部分が出力されなくなりました。

    部分部分の理解が出来ていない為
    2つのソースを強制的に貼り付けたのがそもそもの間違いだと認識していますが
    どこが原因なのでしょうか?

    キャンセル

  • 2015/06/29 19:52

    KTViewControllerじゃなくて、KTViewControllerの中のmenuViewControllerを利用しなければならないのでは?

    キャンセル

  • 2015/06/30 00:11

    再びの回答ありがとうございます。

    教えて頂きましたmenuViewControllerですが
    KTViewController.h
    KTViewController.m
    並びにMainStoryboard.storyboard
    で検索してみても見付けられませんでした。

    大元の
    KTViewControllerを削れるだけ削ってみましたが
    この中の◯◯View◯◯という部分を利用するという意味でしょうか?

    - (void)viewDidLoad
    {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    //menu table view
    UITableViewController *menuTableViewController =
    [self.storyboard instantiateViewControllerWithIdentifier:@"KTMenuTalbeViewController"];
    menuTableViewController.tableView.delegate = self;
    [menuTableViewController.view setFrame:_dummyView.frame];
    [self addChildViewController:menuTableViewController];
    [menuTableViewController didMoveToParentViewController:self];
    [self.view addSubview:menuTableViewController.view];

    //navigationController
    UINavigationController *navigationController = [[UINavigationController alloc] init];
    [self addChildViewController:navigationController];
    [navigationController didMoveToParentViewController:self];
    [self.view addSubview:navigationController.view];

    UIViewController *viewController1 = [self.storyboard instantiateViewControllerWithIdentifier:@"ViewController1"];
    [self setFirstViewController:viewController1];
    }


    #pragma mark - setFirstViewController
    -(void)setFirstViewController:(UIViewController *)viewController
    {
    UIBarButtonItem *leftBarButtonItem = [[UIBarButtonItem alloc]
    initWithTitle:@"menu"
    style:UIBarButtonItemStylePlain
    target:self
    action:@selector(slide:)];
    [viewController.navigationItem setLeftBarButtonItem:leftBarButtonItem];
    UINavigationController *navigationController = [self.childViewControllers lastObject];
    [navigationController setViewControllers:[NSArray arrayWithObjects:viewController, nil]];
    }


    #pragma mark - UITableViewControllerDelegate
    -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {
    NSLog(@"%d, %d", indexPath.section, indexPath.row);
    }

    #pragma mark - slide
    -(void)slide:(id)sender
    {
    _isOpen = !_isOpen;

    UINavigationController *firstNavigationController = [self.childViewControllers objectAtIndex:1];
    UIView *firstView = firstNavigationController.view;
    [UIView animateWithDuration:0.3 animations:^{
    CGFloat originX = _isOpen ? 200 : 0;
    CGRect frame = firstView.frame;
    frame.origin.x = originX;
    firstView.frame = frame;
    } completion:^(BOOL finished){

    }];
    }

    @end

    キャンセル

  • 2015/06/30 01:30

    menuTableViewControllerです。ちょっとスペルを間違えました。

    キャンセル

  • 2015/07/01 21:57

    コメントありがとうございます。
    menuTableViewControllerを利用するという事なので
    DEMOMenuViewControllerを元に戻し
    menuTableViewControllerが書かれている所を下記の様にしてみました。


    - (void)viewDidLoad
    {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    //menu table view
    UITableViewController *menuTableViewController =
    [self.storyboard instantiateViewControllerWithIdentifier:@"KTMenuTalbeViewController"];
    menuTableViewController.tableView.delegate = self;
    [menuTableViewController.view setFrame:_dummyView.frame];
    [self addChildViewController:menuTableViewController];
    [menuTableViewController didMoveToParentViewController:self];
    [self.view addSubview:menuTableViewController.view];

    //navigationController
    UINavigationController *navigationController = [[UINavigationController alloc] init];
    [self addChildViewController:navigationController];
    [navigationController didMoveToParentViewController:self];
    [self.view addSubview:navigationController.view];

    UIViewController *viewController1 = [self.storyboard instantiateViewControllerWithIdentifier:@"ViewController1"];
    [self setFirstViewController:viewController1];
    }


    さらにsetFirstViewControllerがないと言われたので
    KTViewControllerから


    #pragma mark - setFirstViewController
    -(void)setFirstViewController:(UIViewController *)viewController
    {
    UIBarButtonItem *leftBarButtonItem = [[UIBarButtonItem alloc]
    initWithTitle:@"menu"
    style:UIBarButtonItemStylePlain
    target:self
    action:@selector(slide:)];
    [viewController.navigationItem setLeftBarButtonItem:leftBarButtonItem];
    UINavigationController *navigationController = [self.childViewControllers lastObject];
    [navigationController setViewControllers:[NSArray arrayWithObjects:viewController, nil]];
    }

    の所を抜き出してDEMOMenuViewControllerへ追記すると共に
    @property (nonatomic, retain) IBOutlet UIView *dummyView;
    @synthesize dummyView = _dummyView;
    の追記、並びに
    KTSlideMenuControllerのストーリーボードから
    灰色の画面があるView Controllerと
    その下画面に描かれているTable View Controllerを
    REFrostedViewControllerのストーリーボードへと移植してみましたが
    起動すらままらなくなりました。

    ネットを彷徨っていた所
    作者のサイト
    http://tamotamago.com/?p=405
    を見つけ Stripeさんにご指摘頂いた

    「menuTableViewControllerを利用しなければならないのでは?」
    というのは作者の所でいう
    「また TableViewController で起きたイベントを、それをのせている ViewController で受け取りたいので、menuTableViewController.tableView.delegate = self; をしてます。
    そして、最後に ViewController の childViewController として TableViewController をセットし、その View を載せます。あとはこの ViewController で View の切り替えや、スライドをコントロールすれば完了です。」
    という部分なのだと思いますが上記の様に書き換えても
    赤いエラーがないのにも関わらず起動できません。

    Objective-Cの絵本を読み終えたばかりで
    ソースの切り張りは無理があるとわかってはいますが
    どうか、よろしくお願い致します。

    キャンセル

  • 2015/07/02 00:58

    えーと、今は、REFrostedViewControllerについての話をしていたはずです。KTViewControllerの話ではありません。目的を見失わ無いでください。

    キャンセル

  • 2015/07/04 16:15

    あれからUiKit徹底解説iOSユーザーインターフェイスなる本も読んでみましたがさっぱりわからないので、具体的なコードをお願いできませんでしょうか?
    厚かましいお願いかもしれませんが、よろしくお願いします。

    キャンセル

  • 2015/07/04 17:28

    とりあえず、UIViewControllerの使い方を勉強してください。ソースコードだけ見ても理解できないと思います。

    キャンセル

0

解決出来てはいませんが、今の私のスキルでは解決出来そうにもないので
一旦、閉めさせて頂きます。

ありがとうございました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.62%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • iOS

    3908questions

    iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

  • Objective-C

    1172questions

    Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

  • iPhone

    964questions

    iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。