IPhone/iPadに一時的なメッセージを表示して、アクションの確認、またはバックグラウンドアクティビティに関する簡単なステータスを表示します。
これを行うための標準的なコントロールはありますか?アプリがこれを行うのを見てきました。内側がテキストで囲まれた部分的に透明な、丸みのある長方形。ユーザー入力を要求しませんが、短時間で自動的に消えます。 Androidには標準の同様の構造があります。Growlによって表示されるウィンドウにも似ています。
提案に感謝します。
Cocoacontrols.comには、AndroidスタイルのToastポップアップをエミュレートするユーザーライブラリがあります。あなたが探しているものかもしれません。
http://www.cocoacontrols.com/platforms/ios/controls/altoastview
同じ考えに従うものもあります。
UIAlertView
から継承するクラスを作成します。コンストラクターで[super init]
を呼び出してから、必要なビューをサブビューとして追加します。 Interface Builderでこのビューを設計することもできます。このようなもの:
- (id)initWithMessage:(NSString *)message dismissAfter:(NSTimeInterval)interval
{
if ((self = [super init]))
{
CustomView * customView = [[[CustomView alloc] init] autorelease]; // or load from NIB
[self addSubview:customView];
[self performSelector:@selector(dismissAfterDelay) withObject:nil afterDelay:interval];
}
return self;
}
- (void)dismissAfterDelay
{
[self dismissWithClickedButtonIndex:0 animated:YES];
}
カスタムアラートビューを表示するには、初期化して、通常のshow
と同様にUIAlertView
を呼び出します。
CustomAlertView * cav = [[CustomAlertView alloc] initWithMessage:@"Doing Something];
[cav show];
[cav release];
ニースの副作用として、このビューを表示すると、背景が暗くなり、アラートビューに対してニースのぐらつきのアニメーションが表示されます。
UIAlertViewを使用します。簡単な例へのクイックリンクを次に示します。
編集:申し訳ありませんが、それ自体で消えることについては見ませんでした。受信したメッセージのユーザーによる確認が必要だと思います。 UIAlertViewはそれをほぼ達成します。ビューを表示してから最終的に削除するタイマーまたはイベントベースの遅延を備えたビューを持つアプリを使用していない限り、徐々にフェードアウトするかどうかはわかりません。
2番目の編集:それを実装する方法を見つけました。指定した一定の時間が経過した後、手動でdismiss関数を呼び出すことができます。 (面倒な投稿は申し訳ありません)次のようになります:
//Create UIAlertView alert
alert = [[UIAlertView alloc] initWithTitle:@"Title" message:@"Some message" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles: nil];
//After some time
[alert dismissWithClickedButtonIndex:0 animated:TRUE];
タイトルとボタンがnilのUIAlertViewを使用し、必要に応じて非表示にします。これが私がこれをした方法です:
.hファイルにアラートビューのインスタンス変数を作成します。
@interface StatusMessageController : UIViewController {
UIAlertView *statusAlert;
}
.mファイルで、アラートビューを表示してタイマーを開始するメソッドと、タイマーが期限切れになったときにアラートを破棄する別のメソッドを作成します。
- (void)showStatus:(NSString *)message timeout:(double)timeout {
statusAlert = [[UIAlertView alloc] initWithTitle:nil
message:message
delegate:nil
cancelButtonTitle:nil
otherButtonTitles:nil];
[statusAlert show];
[NSTimer scheduledTimerWithTimeInterval:timeout
target:self
selector:@selector(timerExpired:)
userInfo:nil
repeats:NO];
}
- (void)timerExpired:(NSTimer *)timer {
[statusAlert dismissWithClickedButtonIndex:0 animated:YES];
}
ステータスメッセージを表示する場合は、いつでも呼び出します。
[self showStatus:@"Computing" timeout:4.5];
いつでも、次の方法でアラートを閉じることもできます。
[statusAlert dismissWithClickedButtonIndex:0 animated:YES];
また、新しいステータスでオンザフライでメッセージを変更することもできます。
statusAlert.message = @"Looking up user";
Android-Kindトーストを作成しました。今のところ、これ以上の機能は必要ないので、非常に簡単です。
表示される場合、親のビューの下部に追加されるため、そのビューがVCのビューである場合、デバイスの下部中央に表示されます。
フレームはテキストの長さに自動調整されます。
あなたはそれをやっています:[self.view addSubview: [[ToastAlert alloc] initWithText: @"Sent"]];
、自動削除されるため、参照は不要です。
私はこれを実装していませんが、静的メソッドを作成して、命令を短くして明確にすることができます:[ToastAlert showText: @"Sent" inView: self.view];
。
クラス:
ToastAlert.h
@interface ToastAlert : UILabel {
}
- (id)initWithText: (NSString*) msg;
@end
ToastAlert.m
#import "ToastAlert.h"
#import <QuartzCore/QuartzCore.h>
@implementation ToastAlert
#define POPUP_DELAY 1.5
- (id)initWithText: (NSString*) msg
{
self = [super init];
if (self) {
self.backgroundColor = [UIColor colorWithWhite:0 alpha:0.7];
self.textColor = [UIColor colorWithWhite:1 alpha: 0.95];
self.font = [UIFont fontWithName: @"Helvetica-Bold" size: 13];
self.text = msg;
self.numberOfLines = 0;
self.textAlignment = UITextAlignmentCenter;
self.autoresizingMask = UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin;
}
return self;
}
- (void)didMoveToSuperview {
UIView* parent = self.superview;
if(parent) {
CGSize maximumLabelSize = CGSizeMake(300, 200);
CGSize expectedLabelSize = [self.text sizeWithFont: self.font constrainedToSize:maximumLabelSize lineBreakMode: NSLineBreakByTruncatingTail];
expectedLabelSize = CGSizeMake(expectedLabelSize.width + 20, expectedLabelSize.height + 10);
self.frame = CGRectMake(parent.center.x - expectedLabelSize.width/2,
parent.bounds.size.height-expectedLabelSize.height - 10,
expectedLabelSize.width,
expectedLabelSize.height);
CALayer *layer = self.layer;
layer.cornerRadius = 4.0f;
[self performSelector:@selector(dismiss:) withObject:nil afterDelay:POPUP_DELAY];
}
}
- (void)dismiss:(id)sender {
// Fade out the message and destroy self
[UIView animateWithDuration:0.6 delay:0 options: UIViewAnimationOptionAllowUserInteraction
animations:^ { self.alpha = 0; }
completion:^ (BOOL finished) { [self removeFromSuperview]; }];
}
@end
私は自分のクラスを作成することになりました。 UIAlertViewから継承しませんでした。一般的な構造は、
-(id)initWithText:(NSString *)msg {
// Create a view. Put a label, set the msg
CALayer *layer = self.layer;
layer.cornerRadius = 8.0f;
...
self.backgroundColor = [UIColor colorWithWhite:0 alpha:0.8];
[self performSelector:@selector(dismiss:) withObject:nil afterDelay:2.0];
[self setAutoresizesSubviews:FALSE];
return self;
}
- (void)dismiss:(id)sender {
// Fade out the message and destroy self
[UIView animateWithDuration:0.5
animations:^ { self.alpha = 0; }
completion:^ (BOOL finished) { [self removeFromSuperview]; }];
}
@ marco-mustapicに対する同様の回答ですが、継承はありません。
- (void)dismissAlert:(UIAlertView *)alertView
{
[alertView dismissWithClickedButtonIndex:0 animated:YES];
}
- (void)showPopupWithTitle:(NSString *)title
mesage:(NSString *)message
dismissAfter:(NSTimeInterval)interval
{
UIAlertView *alertView = [[UIAlertView alloc]
initWithTitle:title
message:message
delegate:nil
cancelButtonTitle:nil
otherButtonTitles:nil
];
[alertView show];
[self performSelector:@selector(dismissAlert:)
withObject:alertView
afterDelay:interval
];
}
使用するには:
[self showPopupWithTitle:@"Hi" message:@"I like pie" dismissAfter:2.0];
NSObjectのカテゴリに入れるか、いつでも使用できるようにします。
* Swift 2.2 Answer:
func showPopupWithTitle(title: String, message: String, interval: NSTimeInterval) {
let alertController = UIAlertController(title: title, message: message, preferredStyle: .Alert)
presentViewController(alertController, animated: true, completion: nil)
self.performSelector(#selector(dismissAlertViewController), withObject: alertController, afterDelay: interval)
}
func dismissAlertViewController(alertController: UIAlertController) {
alertController.dismissViewControllerAnimated(true, completion: nil)
}
showPopupWithTitle("Title", message: "Message", interval: 0.5)
これは単なるSwift 3バージョン ofuser22348102.2バージョンです。
func showPopupWithTitle(title: String, message: String, interval: TimeInterval) {
let alertController = UIAlertController(title: title, message: message, preferredStyle: .alert)
present(alertController, animated: true, completion: nil)
self.perform(#selector(dismissAlertViewController), with: alertController, afterDelay: interval)
}
func dismissAlertViewController(alertController: UIAlertController) {
alertController.dismiss(animated: true, completion: nil)
}
showPopupWithTitle(title: "Title", message: "Message", interval: 0.5)
Swiftで記述された独自の StatusAlert フレームワークを使用できます。 Appleシステムに似たアラートを表示できるだけでなく、UIView
のどこにでも画像、タイトル、またはメッセージなしで同じアラートを表示できます。
CocoapodsとCarthageから入手でき、iPhone X、セーフエリアレイアウト、iPadをサポートし、いくつかのカスタマイズが可能です。