通过layoutSubviews =>自定义UIAlertButton;找不到UIAlertButton类 [英] Customize UIAlertButton through layoutSubviews => UIAlertButton class not found

查看:101
本文介绍了通过layoutSubviews =>自定义UIAlertButton;找不到UIAlertButton类的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用此实施自定义提醒视图教程。所有这一切都很好,但它并没有谈到定制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 =&gt;自定义UIAlertButton;找不到UIAlertButton类的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆