web-dev-qa-db-ja.com

UIDocumentInteractionControllerのようにUIActionSheetボタンに画像を追加する

UIActionSheetに見られるように、UIDocumentInteractionControllerのボタンに画像を追加することは可能ですか?もしそうなら、それがどのように行われるか教えてください。

33
Ahmad Kayyali

この方法を試してください、それがあなたの助けになることを願っています。

UIActionSheet * action = [[UIActionSheet alloc] 
                      initWithTitle:@"Title" 
                      delegate:self 
                      cancelButtonTitle:@"Cancel" 
                      destructiveButtonTitle:nil 
                      otherButtonTitles:@"",nil];

[[[action valueForKey:@"_buttons"] objectAtIndex:0] setImage:[UIImage imageNamed:@"yourImage.png"] forState:UIControlStateNormal];

[[[action valueForKey:@"_buttons"] objectAtIndex:0] setImage:[UIImage imageNamed:@"yourImage_Highlighted.png"] forState:UIControlStateHighlighted];
27
Amit

UIActionSheet(またはUIAlertView)のボタンに(正確にはアイコンまたはシンボル)画像を追加する可能性があります。画像ファイルをロードしたり、(サブ)ビューをいじったりすることはできません。これらのクラスでは、ボタンはタイトルで指定されます。タイトルは文字列です。したがって、文字列でも指定できるシンボルを使用することは明らかです。最初に思いついたのは、nicode symbolsを使用することでした。

それから、それらのいくつかがiOSで素敵なアイコンとしてレンダリングされ、Mac OSでも Character Viewer のいくつかのシンボルで見ることができることを発見しました。したがって、文字列を指定できるすべての場所で実際にシンボルを使用できます。

このアプローチの欠点は次のとおりです。

  • 定義済みのシンボルに制限されています。
  • すべてのシンボルが本来どおりにレンダリングされるわけではありません(例:\u29C9)。
  • さまざまなiOSバージョンで一部のシンボルの外観が変更される場合があります(例:\U0001F533 iOS 5および6)。

以下にいくつかの興味深いシンボルを示します。

(少なくともMac OSでは)シンボルの外観をすばやく確認したい場合は、 電卓を使用 を使用できます。シミュレーターで確実にチェックしてください:例えば\u2B1Cは、電卓10.7.1のアイコンではありません。

スクリーンショット:

UIActionSheet

UIActionSheet

ボタンのタイトル:

@"\U0001F6A9 \U0001F4CC \u26F3 \u2690 \u2691 \u274F \u25A4 Test"
@"\U0001F4D6 \U0001F30E \U0001F30F \u25A6 \U0001F3C1 \U0001F332 \U0001F333 \U0001F334 Test"

UIAlertView

enter image description here

ボタンのタイトル:

@"\u26A0 Yes"

UITableViewCellチェックボックスとその他のアイコン

UITableViewCell

71
Eddie Gasparian

標準のUIActionSheetは画像をサポートしていません。

UIActionSheetに画像を追加する1つの方法は、UIActionSheetにサブビューを追加することです。 UIActionSheetDelegateメソッドwillPresentActionSheet:を実装するだけです:

- (void)willPresentActionSheet:(UIActionSheet *)actionSheet {
     UIImageView* buttonImage = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"picturename.png"]];
     // Set the frame of the ImageView that it's over the button.
     [actionSheet addSubview:buttonImage];
     [buttonImage release]; // only if you don't need this anymore
}

画像がタッチに反応するかどうかはわかりませんが、the UIActionSheetのようなUIDocumentInteractionControllerを作成できます。

6
audience

これを行うための1つの方法を次に示します。 https://github.com/levey/LeveyPopListView enter image description here

5
RawMean
- (IBAction)actionSheetButtonPressed:(id)sender {
UIAlertController * view=   [UIAlertController
                             alertControllerWithTitle:@"Share "
                             message:@"Select your current status"
                             preferredStyle:UIAlertControllerStyleActionSheet];
UIAlertAction* online = [UIAlertAction
                         actionWithTitle:@"Facebook"
                         style:UIAlertActionStyleDefault
                         handler:^(UIAlertAction * action)
                         {
                             //Do some thing here
                             [view dismissViewControllerAnimated:YES completion:nil];
                         }];
UIAlertAction* offline = [UIAlertAction
                          actionWithTitle:@"Google+"
                          style:UIAlertActionStyleDefault
                          handler:^(UIAlertAction * action)
                          {
                              [view dismissViewControllerAnimated:YES completion:nil];
                          }];
UIAlertAction* doNotDistrbe = [UIAlertAction
                               actionWithTitle:@"LinkedIn"
                               style:UIAlertActionStyleDefault
                               handler:^(UIAlertAction * action)
                               {
                                   [view dismissViewControllerAnimated:YES completion:nil];
                               }];
UIAlertAction* away = [UIAlertAction
                       actionWithTitle:@"Twitter"
                       style:UIAlertActionStyleDestructive
                       handler:^(UIAlertAction * action)
                       {
                           [view dismissViewControllerAnimated:YES completion:nil];

                       }];
UIAlertAction* cancel = [UIAlertAction
                     actionWithTitle:@"Cancel"
                     style:UIAlertActionStyleDefault
                     handler:^(UIAlertAction * action)
                     {
                     }];

[online setValue:[[UIImage imageNamed:@"facebook.png"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal] forKey:@"image"];
[offline setValue:[[UIImage imageNamed:@"google-plus.png"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal] forKey:@"image"];
[doNotDistrbe setValue:[[UIImage imageNamed:@"linkedin.png"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal] forKey:@"image"];
[away setValue:[[UIImage imageNamed:@"Twitter.png"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal] forKey:@"image"];

[view addAction:online];
[view addAction:away];
[view addAction:offline];
[view addAction:doNotDistrbe];

[view addAction:cancel];

[self presentViewController:view animated:YES completion:nil];

}

4
Mannam Brahmam

キー "_ buttons"によってactionSheetオブジェクトからアクションボタンのタイトルを取得し、ボタンの画像を設定できます。

UIActionSheet *actionSheet = [[UIActionSheet alloc]initWithTitle:@"Title" delegate:self cancelButtonTitle:@"Cancel" destructiveButtonTitle:nil otherButtonTitles:@"Facebook", @"Twitter", @"Google +", @"E - mail", @"Send Message",nil];

[[[actionSheet valueForKey:@"_buttons"] objectAtIndex:0] setImage:[UIImage imageNamed:@"fb_icon1.png"] forState:UIControlStateNormal];
[[[actionSheet valueForKey:@"_buttons"] objectAtIndex:1] setImage:[UIImage imageNamed:@"Tweet_icon1.png"] forState:UIControlStateNormal];
[[[actionSheet valueForKey:@"_buttons"] objectAtIndex:2] setImage:[UIImage imageNamed:@"googleplus_icon1.png"] forState:UIControlStateNormal];
[[[actionSheet valueForKey:@"_buttons"] objectAtIndex:3] setImage:[UIImage imageNamed:@"mail_icon.png"] forState:UIControlStateNormal];
[[[actionSheet valueForKey:@"_buttons"] objectAtIndex:4] setImage:[UIImage imageNamed:@"message_icon.png"] forState:UIControlStateNormal];

for (UIView *subview in actionSheet.subviews) {
    if ([subview isKindOfClass:[UIButton class]]) {
        UIButton *button = (UIButton *)subview;
        [button setTitleColor:[UIColor darkGrayColor] forState:UIControlStateNormal];
    }
}

[actionSheet showInView:self.view];
3

すべての行の画像とテキストをサポートするテーブルセルを使用して、UIActionSheetの外観をエミュレートするクラスを作成しました。また、インタラクションにブロックを使用し、iPhoneおよびiPadをサポートし、iPadのUITabBarItemからポップアップし、複数のシートをキューに入れます。まだ開発中ですが、Githubから自由にクローンしてください:

http://github.com/azplanlos/SIActionSheet

使用方法は非常に簡単です。以下に例を示します。

SIActionSheet* mySheet = [SIActionSheet actionSheetWithTitle:@"Action Sheet title"
    andObjects:[NSArray arrayWithObjects:
        [SIActionElement actionWithTitle:@"Item 1"
            image:[UIImage imageNamed:@"image"]
            andAction:^{NSLog(@"action 1");}]
    , nil]
    completition:^(int num) {
        NSLog(@"pressed %i", num);
    } cancel:^{NSLog(@"canceled");}];

mySheet.followUpSheet = anotherSheet;
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
        [mySheet show];
else
        [mySheet showFromTabBarItem:item inTabBar:tabBar];

問題が発生した場合は、お知らせください。これが私のような同じ問題を抱えている多くの人々に役立つことを願っています...

2

IOS 8の場合、これを参照してください

if( [UIAlertController class] ){

    UIAlertController *view     = [UIAlertController alertControllerWithTitle:@"Main Title" 
                                                                      message:@"What do you want to do?"
                                                               preferredStyle:UIAlertControllerStyleActionSheet];

    UIAlertAction *firstAA       = [UIAlertAction actionWithTitle:@"Beep Beep"
                                                           style:UIAlertActionStyleDefault
                                                         handler:^( UIAlertAction *action ){

                                                             [view dismissViewControllerAnimated:YES
                                                                                      completion:nil];
                                                         }];
    [firstAA setValue:[UIImage imageNamed:@"your-icon-name"] forKey:@"image"];
    [view addAction:firstAA];

    UIAlertAction *cancelAA     = [UIAlertAction actionWithTitle:@"Cancel"
                                                           style:UIAlertActionStyleCancel
                                                         handler:^( UIAlertAction *action ){

                                                             [self deselectTableViewRow];

                                                             [view dismissViewControllerAnimated:YES
                                                                                      completion:nil];
                                                         }];
    [view addAction:cancelAA];

    [self presentViewController:view
                       animated:YES
                     completion:nil];
}
else {

    UIActionSheet *sheet    = [[UIActionSheet alloc] initWithTitle:@"What do you want to do?"
                                                          delegate:(id)self
                                                 cancelButtonTitle:nil
                                            destructiveButtonTitle:nil
                                                 otherButtonTitles:nil];

    [sheet addButtonWithTitle:@"title"];

    [[[sheet valueForKey:@"_buttons"] objectAtIndex:0] setImage:[UIImage imageNamed:@"your-icon-name.png"] forState:UIControlStateNormal];

    sheet.cancelButtonIndex = [sheet addButtonWithTitle:@"Cancel"];
    [sheet showInView:self.view];
}
2
Keith Yeoh

私はそれが非常に遅い答えであることを知っていますが、アクションシートに画像を表示する別の方法を見つけました:

self.actionSheet = [[UIActionSheet alloc] initWithTitle:@"Select Image:" delegate:self cancelButtonTitle:@"Cancel"destructiveButtonTitle:nil otherButtonTitles: @"Image1", @"Image2", @"Image3", @"Image4", @"Image5", @"Image6", @"Image7", @"Image8",@"Image9", @"Image10", @"Image11", @"Image12", @"Image13", @"Image14", @"Image15", nil];

self.actionSheet.tag = 1;
for (id button in [self.actionSheet valueForKey:@"_buttons"])
 {
     UIImageView* buttonImage = [[UIImageView alloc] initWithImage:[UIImage imageNamed:[button titleForState:UIControlStateNormal]]];
     [buttonImage setFrame:CGRectMake(5, 5,35,35)];
     [button addSubview:buttonImage];
 }

 [self.actionSheet showInView:[UIApplication sharedApplication].keyWindow];
1
Prince Agrawal
    NSString* strUrl=[MLControl shared].currentServerUrl;
    for( MLServerUrl *title in [MLControl shared].arrServerUrl)  {
        NSString* strShow=title.name;
        if ([strUrl isEqualToString: title.url]) {
            strShow=[NSString stringWithFormat:@"√ %@",strShow];
        }else{
            strShow=[NSString stringWithFormat:@"  %@",strShow];
        }

        [chooseImageSheet addButtonWithTitle:strShow];
    }

   // [[[chooseImageSheet valueForKey:@"_buttons"] objectAtIndex:0] setImage:[UIImage imageNamed:@"ic_check_black_18dp.png"] forState:UIControlStateNormal];
    chooseImageSheet.actionSheetStyle = UIActionSheetStyleDefault;
    [chooseImageSheet showFromRect:btnRc inView:sender animated:YES];
1
Gank

このカテゴリ拡張機能はios7.1で動作し、UIActionSheetのボタンに画像/アイコンを追加しますが、いくつかの注意事項があります...

@interface UIActionSheet (GSBActionSheetButtons)
- (void)buttonAtIndex:(NSUInteger)index setImage:(UIImage *)image forState:(UIControlState)state;
@end

@implementation UIActionSheet (GSBActionSheetButtons)
- (void)buttonAtIndex:(NSUInteger)index setImage:(UIImage *)image forState:(UIControlState)state
{
    for (UIView* view in self.subviews) {
        if ([view isKindOfClass:[UIButton class]]) {
            if (index-- == 0) {
                UIButton *button = (UIButton*)view;
                [button setImage:image forState:state];
                button.imageView.contentMode = UIViewContentModeScaleAspectFit;
                button.imageEdgeInsets = UIEdgeInsetsMake(2,0,2,0);
                break;
            }
        }
    }
}

そしてそれを使用するには:

[self.sharePopup buttonAtIndex:2 setImage:[UIImage imageNamed:@"Twitter.png"] forState:UIControlStateNormal];

警告:

  • UIActionSheetは、ボタンの画像を右側heightに正しく自動サイズ調整しますが、それに対応してimageviewを変更するようには見えませんwidth;したがって、UIViewContentModeScaleAspectFitを使用して、画像がつぶれるのを防ぐ必要があります。ただし、imageviewフレームの幅は元のフルサイズのままなので、画像が大きい(またはより正確に広い)場合、中央(縮小)の画像とボタンテキストの間に迷惑なギャップが生じます。これを回避する方法はありません。プログラムで明示的にwidth = height制約を明示的にimageviewに追加しても無視されるようです!? [何か案は?]。最終的な結果として、画像が最初から適切な高さであることを確認してください(たとえば、iPhone 4Sで約45ピクセル)。ボタン画像とテキストの間にますます大きな隙間ができます。

  • さらに深刻なのは、ボタンに画像を追加するとすぐに、UIActionSheetがボタンのテキストを自動的にbolded(!)にすると思われることです。理由がわからないし、これを防ぐ方法もわからない[アイデアは?]

  • 最後に、このソリューションはUIActionSheetのサブビューがボタンのインデックスと同じ順序になるように依存しています。これは少数のボタンには当てはまりますが、(確かに)UIActionSheetに多くのアイテムがある場合は、Appleインデックス作成についてはごまかす:clickedButtonAtIndex:タップされたボタンを特定しようとすると...]

ああ、imageEdgeInsets:はオプションです-各画像をボタンの内側に数ピクセル挿入して、画像が互いに垂直に触れないようにします。

[オピニオン:上記の奇妙さを考えると、私はApple本当に人々がtheirをいじりたくないアクションシート。ある時点で、たぶん弾丸を噛んで、独自のモーダルポップアップを実装する必要があります;これらのUIActionSheetsが対応するマンハンドリングはそれほど多くありません...]

1
tiritea

IOS 8.0以降では、UIAlertControllerを使用できます。 UIAlertControllerでは、各ボタン項目はUIAlertActionとして認識され、それに応じて追加されます。

私の答えを確認できます

0
Jaha Rabari