如何自定义 iOS 警报视图?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/2600779/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How can I customize an iOS alert view?
提问by V.V
I want to create a custom alert view
within my iOS application. For example, I want to put some images
in this alert
, and change its color.
我想alert view
在我的 iOS 应用程序中创建一个自定义。例如,我想images
在 this 中放一些alert
,并更改其颜色。
I know how to create a normal UIAlertView
, but is there a way to customize an alert view
?
我知道如何创建一个法线UIAlertView
,但是有没有办法自定义一个alert view
?
回答by Nathan S.
I set up my own UIViewController which I can skin with my own images. I generally only use one or two buttons, so I hide the second button if it's not being used. The view is actually the size of the entire screen, so it blocks touches behind it, but it is mostly transparent, so the background shows through.
我设置了我自己的 UIViewController,我可以用我自己的图像换肤。我通常只使用一两个按钮,所以如果第二个按钮没有被使用,我会隐藏它。视图实际上是整个屏幕的大小,因此它会阻止其背后的触摸,但它大部分是透明的,因此背景会显示出来。
When bringing it in, I use a few animations to make it bounce like Apple's alert view. Something like this works:
将其引入时,我使用了一些动画使其像 Apple 的警报视图一样反弹。像这样的工作:
-(void)initialDelayEnded {
self.view.transform = CGAffineTransformScale(CGAffineTransformIdentity, 0.001, 0.001);
self.view.alpha = 1.0;
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:kTransitionDuration/1.5];
[UIView setAnimationDelegate:self];
[UIView setAnimationDidStopSelector:@selector(bounce1AnimationStopped)];
self.view.transform = CGAffineTransformScale(CGAffineTransformIdentity, 1.1, 1.1);
[UIView commitAnimations];
}
- (void)bounce1AnimationStopped {
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:kTransitionDuration/2];
[UIView setAnimationDelegate:self];
[UIView setAnimationDidStopSelector:@selector(bounce2AnimationStopped)];
self.view.transform = CGAffineTransformScale(CGAffineTransformIdentity, 0.9, 0.9);
[UIView commitAnimations];
}
- (void)bounce2AnimationStopped {
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:kTransitionDuration/2];
self.view.transform = CGAffineTransformIdentity;
[UIView commitAnimations];
}
I have the possibility of a short delay built into the class, so initialDelayEnded is called when that delay is over.
我有可能在类中内置一个短暂的延迟,所以当延迟结束时会调用 initialDelayEnded。
When initializing, I pass in an object and selector I want called when each button is pressed, and then I call the appropriate selector on the object when a button is pressed.
初始化时,在按下每个按钮时,我会传入一个对象和选择器,然后按下每个按钮时调用,然后在按下按钮时调用适当的选择器。
回答by TomSwift
Here's a custom alert view that I wrote which is a drop-in replacement for UIAlertView. You can set a custom background image; it wouldn't be hard to extend to support custom background colors.
这是我编写的自定义警报视图,它是 UIAlertView 的替代品。可以设置自定义背景图片;扩展以支持自定义背景颜色并不难。
回答by Nishant B
Create one sub class for UIAlertView.
为 UIAlertView 创建一个子类。
And create common class for Alert View method. Add 2 below method for it.
并为警报视图方法创建通用类。为它添加以下2个方法。
#pragma mark Alert View Functions
+(void)alertViewWithYesNo:(NSString *)pstrTitle:(NSString *)pstrMessage:(int)pstrTagId:(id)pDelegate{
UIAlertView *objAlertNotify = [[UIAlertView alloc] init];
[objAlertNotify setDelegate:pDelegate];
[objAlertNotify addButtonWithTitle:@""];
[objAlertNotify addButtonWithTitle:@""];
int intTemp = 1;
for (UIView* view in [objAlertNotify subviews])
{
if ([[[view class] description] isEqualToString:@"UIAlertButton"])
{
UILabel *theTitle = [[UILabel alloc] init];
[theTitle setFont:[UIFont fontWithName:@"Helvetica-Bold" size:g_AlertFontSize]];
[theTitle setTextColor:[UIColor whiteColor]];
switch (intTemp) {
case 1:
[theTitle setText:@"Yes"];
//[theTitle setTextColor:g_ColorYes];
break;
case 2:
[theTitle setText:@"No"];
//[theTitle setTextColor:g_ColorNo];
break;
}
intTemp++;
[theTitle setBackgroundColor:[UIColor clearColor]];
[theTitle setTextAlignment:UITextAlignmentCenter];
[view addSubview:theTitle];
}
else if ([[[view class] description] isEqualToString:@"UIThreePartButton"])
{
UILabel *theTitle = [[UILabel alloc] init];
[theTitle setFont:[UIFont fontWithName:@"Helvetica-Bold" size:g_AlertFontSize]];
[theTitle setTextColor:[UIColor whiteColor]];
switch (intTemp) {
case 1:
[theTitle setText:@"Yes"];
//[theTitle setTextColor:g_ColorYes];
break;
case 2:
[theTitle setText:@"No"];
//[theTitle setTextColor:g_ColorNo];
break;
}
intTemp++;
[theTitle setBackgroundColor:[UIColor clearColor]];
[theTitle setTextAlignment:UITextAlignmentCenter];
[view addSubview:theTitle];
}
}
[objAlertNotify setTag:pstrTagId];
[objAlertNotify setTitle:pstrTitle];
[objAlertNotify setMessage:pstrMessage];
[objAlertNotify show];
}
+(void)alertViewBtnText:(UIAlertView *)alertView{
for (UIView* view in [alertView subviews])
{
//NSLog(@"%@", [[view class] description]);
if ([[[view class] description] isEqualToString:@"UIAlertButton"])
{
for (UILabel *lbl in [view subviews])
{
//NSLog(@"%@", [[lbl class] description]);
if ([[[lbl class] description] isEqualToString:@"UILabel"])
{
CGRect frame = [view bounds];
CGSize maximumLabelSize = CGSizeMake(320,480);
CGSize expectedLabelSize = [lbl.text sizeWithFont:lbl.font constrainedToSize:maximumLabelSize lineBreakMode:lbl.lineBreakMode];
CGRect newFrame = lbl.frame;
newFrame.origin.x = newFrame.origin.x - expectedLabelSize.width/2;
newFrame.size.height = expectedLabelSize.height;
newFrame.size.width = expectedLabelSize.width;
lbl.frame = newFrame;
//frame.size.width = 320.0;
//frame.size.height = 480.0;
lbl.frame = frame;
[lbl setCenter:CGPointMake([view bounds].size.width/2, [view bounds].size.height/2)];
}
}
}
else if ([[[view class] description] isEqualToString:@"UIThreePartButton"])
{
for (UILabel *lbl in [view subviews])
{
CGRect frame = [view bounds];
CGSize maximumLabelSize = CGSizeMake(320,480);
CGSize expectedLabelSize = [lbl.text sizeWithFont:lbl.font constrainedToSize:maximumLabelSize lineBreakMode:lbl.lineBreakMode];
CGRect newFrame = lbl.frame;
newFrame.origin.x = newFrame.origin.x - expectedLabelSize.width/2;
newFrame.size.height = expectedLabelSize.height;
newFrame.size.width = expectedLabelSize.width;
lbl.frame = newFrame;
//frame.size.width = 320.0;
//frame.size.height = 480.0;
lbl.frame = frame;
[lbl setCenter:CGPointMake([view bounds].size.width/2, [view bounds].size.height/2)];
}
}
}
}
Now, in whatever class, you are using this custom Alert: Add below:
现在,在任何课程中,您都在使用此自定义警报:添加以下内容:
#pragma mark UIAlertViewDelegate
-(void)willPresentAlertView:(UIAlertView *)alertView{
if(alertView==objAlertMsg){
/*clsCommonFuncDBAdapter *objclsCommonFuncDBAdapter = [[clsCommonFuncDBAdapter alloc] init];
float newHeight = [objclsCommonFuncDBAdapter getAlertHeightByMessage:alertView.frame.size.width :alertView.message] + [g_AlertExtraHeight intValue];
[objclsCommonFuncDBAdapter release];
//NSLog(@"X = %f, Y = %f, Widht = %f, Height = %f", alertView.frame.origin.x, alertView.frame.origin.y, alertView.frame.size.width, alertView.frame.size.height);
//[alertView setFrame:CGRectMake(alertView.frame.origin.x, alertView.frame.origin.y, alertView.frame.size.width, 110.0)];
[alertView setFrame:CGRectMake(alertView.frame.origin.x, alertView.frame.origin.y, alertView.frame.size.width, newHeight)];*/
}
[clsCommonFuncDBAdapter alertViewBtnText:alertView];
}
For calling it: Use like below:
调用它:使用如下:
-(void)askForGPSEnable{
[clsCommonFuncDBAdapter alertViewWithYesNo:msgGPSTitle :msgGPSMessage :0 :self];
}
Let me know in case of any difficulty.
如果有任何困难,请告诉我。
回答by Jasarien
You'll need to create your own custom view, and implement some alert view style behaviour, such as displaying modally, dimming the background, animating in and out, etc.
您需要创建自己的自定义视图,并实现一些警报视图样式行为,例如模态显示、背景变暗、动画进出等。
There's no support in the SDK for customising a UIAlertView any further than the text or buttons.
除了文本或按钮之外,SDK 不支持自定义 UIAlertView。
回答by Hardik Nimavat
http://iphonedevelopment.blogspot.com/2010/05/custom-alert-views.html
http://iphonedevelopment.blogspot.com/2010/05/custom-alert-views.html
and
和
http://www.skylarcantu.com/blog/2009/08/14/custom-uialertview-color-chooser/
http://www.skylarcantu.com/blog/2009/08/14/custom-uialertview-color-chooser/
You can use above links for custom alerts. I hope these will be helpful for you.
您可以将以上链接用于自定义警报。我希望这些对你有帮助。
回答by Harsh Thakur
There is very good example on Git hub for custom alert view. It is using UI alert view in core and provides number of methods to customize alert view in different ways
在 Git hub 上有一个很好的例子,用于自定义警报视图。它在核心中使用 UI 警报视图,并提供多种方法来以不同方式自定义警报视图