1

我正在尝试使用本教程实现自定义警报视图。这篇文章中的所有内容都运行良好,但它并没有谈到自定义 UIAlertButton。然后,我尝试通过 layoutSubviews 方法对其进行自定义:

- (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 类,为什么?谢谢

编辑:这是我的最终工作代码,感谢 nsguliver。

CustomAlertView.h

#import <UIKit/UIKit.h>

@interface CustomAlertView: UIAlertView {
    NSMutableArray *fakeButtonIndexList;
    NSMutableArray *buttonList;
}

-(void)addCustomButton:(NSString*)title;

@end

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
4

3 回答 3

2

您可以UIAlertView通过首先将两个按钮标题保留为nil然后添加自定义按钮来自定义按钮的一种方法subview,您可以CustomAlertView 查看以下代码测试我自己。

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];
于 2013-03-05T16:11:14.947 回答
0

您的问题已经得到很好的回答,但我的解决方案可能更短更清晰。首先,我创建了一个变量来跟踪子视图数组中的按钮索引。我假设 AlertViewButtons 是最后的子视图:

int buttonIndexInSubviews = (self.subviews.count - self.numberOfButtons);

然后我遍历子视图,如图所示,而 if 语句的形成方式不同。诀窍是将 AlertViewButton 转换为超类。

if (subview == [self.subviews objectAtIndex:buttonIndexInSubviews]) {
        UIButton *button = (UIButton*)subview;

        //Here you can change the button appearance via the variable
        //E.g. button.titleLabel.shadowOffset = CGSizeMake(0.0f, 0.0f);

        buttonIndexInSubviews++;
    }

顺便说一句,这种解决方法得到了 Apple 的批准。

于 2013-07-27T12:30:39.767 回答
0

或者您可以像这样测试 UIAlertButton 类:

if ([subview isMemberOfClass:NSClassFromString(@"UIAlertButton")]) {
    // do your customizing here...
}
于 2013-08-22T15:40:05.203 回答