のボタンに画像を追加することはできUIActionSheet
ますUIDocumentInteractionController
か?もしそうなら、それがどのように行われるかを私に知らせてください。
12 に答える
画像ファイルを読み込んだり、(サブ)ビューをいじったりせずに、 UIActionSheet
(または)のボタンに画像(正確にはアイコンまたは記号)を追加する可能性があります。UIAlertView
これらのクラスでは、ボタンは文字列であるタイトルによって指定されます。したがって、文字列でも指定できる記号を使用することは明らかです。私が最初に思いついたのは、Unicode記号を使用することでした。
それから私はそれらのいくつかがiOSで素敵なアイコンとしてレンダリングされ、MacOSのキャラクタービューアーでもいくつかのシンボルを見ることができることを発見しました。したがって、シンボルは、文字列を指定できるすべての場所で実際に使用できます。
このアプローチの欠点は次のとおりです。
- 事前定義されたシンボルに制限されています。
- すべてのシンボルが適切にレンダリングされるわけではありません(例
\u29C9
)。 - 異なるiOSバージョン(
\U0001F533
iOS 5および6など)では、一部のシンボルの外観が変更される可能性があります。
とりわけ興味深いシンボルは次のとおりです。
シンボルがどのように見えるかをすばやく確認したい場合(少なくともMac OSでは)、電卓を使用できます。シミュレータで必ず確認してください。たとえば\u2B1C
、電卓10.7.1のアイコンではありません。
スクリーンショット:
UIActionSheet
ボタンのタイトル:
@"\U0001F6A9 \U0001F4CC \u26F3 \u2690 \u2691 \u274F \u25A4 Test"
@"\U0001F4D6 \U0001F30E \U0001F30F \u25A6 \U0001F3C1 \U0001F332 \U0001F333 \U0001F334 Test"
UIAlertView
ボタンのタイトル:
@"\u26A0 Yes"
UITableViewCell
チェックボックスと他のアイコン付き
この方法を試してください、私はそれがあなたを助けるかもしれないことを願っています。
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];
標準のUIActionSheetは画像をサポートしていません。
に画像を追加する1つの方法UIActionSheet
は、にサブビューを追加することUIActionSheet
です。メソッドwillPresentActionSheetを実装するだけUIActionSheetDelegate
です:次のように:
- (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
}
画像がタッチに反応するかどうかはわかりませんが、のUIActionSheet
ようなものを作成することはできますUIDocumentInteractionController
。
これを行う方法は次のとおりです:
https ://github.com/levey/LeveyPopListView
- (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];
}
「 _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];
すべての行の画像とテキストをサポートするテーブルセルを使用して、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];
問題が発生した場合はお知らせください。これが私のような同じ問題を抱えている多くの人々に役立つことを願っています...
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];
}
答えが非常に遅いことはわかっていますが、アクションシートに画像を表示する別の方法を見つけました。
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];
このカテゴリ拡張機能は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は、画像をボタンに適した高さに正しく自動サイズ設定しますが、それに応じて画像ビューの幅を変更するようには見えません。; したがって、画像がつぶれるのを防ぐためにUIViewContentModeScaleAspectFitが必要です。ただし、画像ビューのフレーム幅は元のフルサイズのままであるため、画像が大きい(またはより正確には幅が広い)場合は、中央に配置された(縮小された)画像とボタンのテキストの間に迷惑なギャップが生じます。私はこれを回避する方法を見つけられませんでした。プログラムで明示的なwidth=height制約をimageviewに追加しても、無視されるようです!?[何か案は?]。最終的な結果として、画像が最初からほぼ適切な高さであることを確認してください(たとえば、iPhone 4Sでは約45ピクセル)。そうしないと、ボタンの画像とテキストの間にますます大きなギャップが生じます。
さらに深刻なことに、ボタンに画像を追加するとすぐに、UIActionSheetによってボタンのテキストが自動的に太字(!)になります。理由がわからず、これを防ぐ方法もわかりません[何かアイデアはありますか?]
最後に、このソリューションは、UIActionSheetのサブビューが、ボタンのインデックス付けと同じ順序になることに依存しています。これは少数のボタンにも当てはまりますが、(明らかに)UIActionSheetに多くのアイテムがある場合、Appleはインデックス作成をいじくり回します[しかし、actionSheet:clickedButtonAtIndex:を理解しようとすると、とにかくこれに問題が発生します。どのボタンがタップされたか...]
ああ、imageEdgeInsets:はオプションです-画像が互いに垂直に接触しないように、ボタンの内側に各画像を数ピクセル挿入します。
[意見:上記の奇妙なことを考えると、Appleは人々がアクションシートをいじくり回してほしくないように感じます。ある時点で、おそらく弾丸を噛んで、独自のモーダルポップアップを実装する必要があります。これらのUIActionSheetsが対応できる操作はそれほど多くありません...]
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];
iOS 8.0から、を使用できますUIAlertController
。ではUIAlertController
、各ボタンアイテムは、UIAlertAction
それに応じて追加されるものとして認識されます。