问题描述
我正在尝试使用此。所有这一切都很好,但它并没有谈到定制UIAlertButton。
然后,我试图通过layoutSubviews方法自定义它:
i'm trying to implement custom alert view using this tutorial. All in this tut work well, but it doesn't speak about customizing UIAlertButton.Then, i'm trying to customize it through layoutSubviews method:
- (void)layoutSubviews
{
for (UIView *subview in self.subviews){ //Fast Enumeration
if ([subview isMemberOfClass:[UIImageView class]]) {
subview.hidden = YES; //Hide UIImageView Containing Blue Background
}
if ([subview isMemberOfClass:[UILabel class]]) { //Point to UILabels To Change Text
UILabel *label = (UILabel*)subview; //Cast From UIView to UILabel
label.textColor = [UIColor colorWithRed:210.0f/255.0f green:210.0f/255.0f blue:210.0f/255.0f alpha:1.0f];
label.shadowColor = [UIColor blackColor];
label.shadowOffset = CGSizeMake(0.0f, 1.0f);
}
if ([subview isMemberOfClass:[UIAlertButton class]]) {
// do blablabla
}
}
}
特别是我添加的是:
if ([subview isMemberOfClass:[UIAlertButton class]]) {
// do blablabla
}
但它找不到UIAlertButton类,为什么?
谢谢
But it can't found UIAlertButton class, why?Thanks
编辑:
这是我的最终工作代码,感谢nsguliver。
EDIT :Here is my final working code, thanks to nsguliver.
CustomAlertView.h
CustomAlertView.h
#import <UIKit/UIKit.h>
@interface CustomAlertView: UIAlertView {
NSMutableArray *fakeButtonIndexList;
NSMutableArray *buttonList;
}
-(void)addCustomButton:(NSString*)title;
@end
CustomAlertView.m
CustomAlertView.m
#import "CustomAlertView.h"
@implementation CustomAlertView
-(id) initWithTitle:(NSString *)title message:(NSString *)message delegate:(id)delegate cancelButtonTitle:(NSString *)cancelButtonTitle otherButtonTitles:(NSString *)otherButtonTitles, ... {
self = [super initWithTitle:title message:message delegate:delegate cancelButtonTitle:cancelButtonTitle otherButtonTitles:otherButtonTitles, nil];
if (self) {
buttonList = [NSMutableArray array];
fakeButtonIndexList = [NSMutableArray array];
}
return self;
}
-(void)layoutSubviews {
for (UIView *subview in self.subviews){ //Fast Enumeration
// Image de fond
if ([subview isMemberOfClass:[UIImageView class]]) {
subview.hidden = YES; //Hide UIImageView Containing Blue Background
}
// Label
if ([subview isMemberOfClass:[UILabel class]]) { //Point to UILabels To Change Text
UILabel *label = (UILabel*)subview; //Cast From UIView to UILabel
label.shadowColor = [UIColor blackColor];
label.shadowOffset = CGSizeMake(0.0f, 1.0f);
}
}
}
-(void)drawRect:(CGRect)rect {
//////////////GET REFERENCE TO CURRENT GRAPHICS CONTEXT
CGContextRef context = UIGraphicsGetCurrentContext();
//////////////CREATE BASE SHAPE WITH ROUNDED CORNERS FROM BOUNDS
CGRect activeBounds = self.bounds;
CGFloat cornerRadius = 10.0f;
CGFloat inset = 6.5f;
CGFloat originX = activeBounds.origin.x + inset;
CGFloat originY = activeBounds.origin.y + inset;
CGFloat width = activeBounds.size.width - (inset*2.0f);
CGFloat height = activeBounds.size.height - (inset*2.0f);
CGRect bPathFrame = CGRectMake(originX, originY, width, height);
CGPathRef path = [UIBezierPath bezierPathWithRoundedRect:bPathFrame cornerRadius:cornerRadius].CGPath;
//////////////CREATE BASE SHAPE WITH FILL AND SHADOW
CGContextAddPath(context, path);
CGContextSetFillColorWithColor(context, [UIColor colorWithRed:40.0f/255.0f green:40.0f/255.0f blue:40.0f/255.0f alpha:1.0f].CGColor);
CGContextDrawPath(context, kCGPathFill);
//////////////CLIP STATE
CGContextSaveGState(context); //Save Context State Before Clipping To "path"
CGContextAddPath(context, path);
CGContextClip(context);
}
-(void)show {
[super show];
// On redéfinit les frames des boutons
NSInteger indexCustomButton = 0;
for (NSString *indexStr in fakeButtonIndexList) {
UIButton *customButton = (UIButton*)[buttonList objectAtIndex:indexCustomButton];
UIButton *fakeButton = (UIButton*)[self.subviews objectAtIndex:[indexStr integerValue]];
[customButton setFrame:fakeButton.frame];
indexCustomButton++;
}
}
-(void)addCustomButton:(NSString *)title {
[self addButtonWithTitle:title];
UIButton *fakeButton = [self.subviews lastObject];
[fakeButton setHidden:YES];
[fakeButtonIndexList addObject:[NSString stringWithFormat:@"%d",[self.subviews count]]];
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
[button setFrame:fakeButton.frame];
[button setTitle:title forState:nil];
[button setBackgroundColor:[Templates getColor:@"color"]];
[button.layer setCornerRadius:5.0f];
[buttonList addObject:button];
[self addSubview:button];
}
@end
推荐答案
您可以通过首先将两个按钮标题保持为 nil
来自定义 UIAlertView
上的按钮。然后将自定义按钮作为子视图
添加到 CustomAlertView
,请参阅下面自己测试的代码。
One way you could customize the buttons over the UIAlertView
by first keeping the both button titles to nil
and then add custom button as subview
to your CustomAlertView
see the below code tested myself.
CustomAlertVIew *alert =[[CustomAlertVIew alloc]initWithTitle:@"title" message:@"message" delegate:nil cancelButtonTitle:nil otherButtonTitles:nil, nil];
// add the custom button
UIImage *buttonImage = [UIImage imageNamed:@"image.png"];
//create the button and assign the image
UIButton *alertButton = [UIButton buttonWithType:UIButtonTypeCustom];
[self.alertButton setFrame:CGRectMake(x,y,buttonImage.size.width,buttonImage.size.height)];
[alertButton setBackgroundImage:buttonImage forState:UIControlStateNormal];
alertButton.titleLabel.font = [UIFont boldSystemFontOfSize:12];
[alertButton setTitle:@"Done" forState:UIControlStateNormal];
[alertButton addTarget:self action:@selector(backMethod) forControlEvents:UIControlEventTouchUpInside];
[alert addSubview:alertButton];
[alert show];
这篇关于通过layoutSubviews =>自定义UIAlertButton;找不到UIAlertButton类的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!