zoukankan      html  css  js  c++  java
  • iphone:自定义UIAlertView

    由于项目中有这样一个需求:需要在保存是弹出框选择保存的地点。选择UIAlertView来实现,但是要在UIAlertView中增加UISwitch的控件,这就需要自定义一个继承UIAlertView的类来自定义UIAlertView了。

    实现效果如下:(还没加图的)

    我需要在点击确定的时候,知道两个Switch的状态,才能进一步做相应的功能。

    自定义了SaveAlertView类。

    在.h中,需要自定义一个@protocol,作为把switch状态传出去的出口。

    声明相应的委托。看源码

    #import <UIKit/UIKit.h>
    
    @protocol SaveAlertViewDelegate <NSObject>
    
    @optional
    - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex save2File:(BOOL) save2File save2Album:(BOOL) save2Album;
    @end
    
    
    @interface SaveAlertView : UIAlertView
    
    @property(nonatomic, assign) id<SaveAlertViewDelegate> SaveAlertDelegate;
    @property(readwrite, retain) UIImage *backgroundImage;
    @property(readwrite, retain) UIImage *contentImage;
    
    @property(strong, nonatomic) IBOutlet UISwitch *switch1;
    @property(strong, nonatomic) IBOutlet UISwitch *switch2;
    
    - (id)initWithImage:(UIImage *)image contentImage:(UIImage *)content;
    
    @end

    在.m中主要是把系统的原来控件隐藏掉(在layoutSubviews中实现),在添加自己控件,及其点击相应代码。

    在layoutSubviews中隐藏系统的控件

        for (UIView *v in [self subviews]) {
            if ([v class] == [UIImageView class]){
                [v setHidden:YES];
            }     
            if ([v isKindOfClass:[UIButton class]] ||
                [v isKindOfClass:NSClassFromString(@"UIThreePartButton")]) {
                [v setHidden:YES];
            }
        }

    看完整的.m代码

    #import "SaveAlertView.h"
    
    @implementation SaveAlertView
    @synthesize SaveAlertDelegate;
    @synthesize backgroundImage;
    @synthesize contentImage;
    @synthesize switch1;
    @synthesize switch2;
    
    - (id)initWithFrame:(CGRect)frame
    {
        self = [super initWithFrame:frame];
        if (self) {
            // Initialization code
        }
        return self;
    }
    
    - (id)initWithImage:(UIImage *)image contentImage:(UIImage *)content{
        if (self == [super init]) {
            self.backgroundImage = image;
            self.contentImage = content;
        }
        return self;
    }
    
    - (void)drawRect:(CGRect)rect
    {
        CGSize imageSize = self.backgroundImage.size;
        [self.backgroundImage drawInRect:CGRectMake(0, 0, imageSize.width, imageSize.height)];
    }
    
    - (void) layoutSubviews {
        //屏蔽系统的ImageView 和 UIButton
        for (UIView *v in [self subviews]) {
            if ([v class] == [UIImageView class]){
                [v setHidden:YES];
            }
            
            
            if ([v isKindOfClass:[UIButton class]] ||
                [v isKindOfClass:NSClassFromString(@"UIThreePartButton")]) {
                [v setHidden:YES];
            }
        }    
        if (contentImage) {
            UIImageView *contentview = [[UIImageView alloc] initWithImage:self.contentImage];
            contentview.frame = CGRectMake(0, 0, backgroundImage.size.width, backgroundImage.size.height);
            [self addSubview:contentview];
        }
        
        UILabel *label1 = [[UILabel alloc]  initWithFrame:CGRectMake(20, 20, 136, 21)];
        label1.text = @"保存为可编辑文件";
        [self addSubview:label1];
        
        UILabel *label2 = [[UILabel alloc]  initWithFrame:CGRectMake(20, 65, 85, 21)];
        label2.text = @"另存到相册";
        [self addSubview:label2];
        
        switch1 = [[UISwitch alloc] initWithFrame:CGRectMake(206, 17, 79, 27)];
        [switch1 setOn:YES];
        [self addSubview:switch1];
        
        switch2 = [[UISwitch alloc] initWithFrame:CGRectMake(206, 62, 79, 27)];
        [self addSubview:switch2];
        
        UIButton *button1 = [[UIButton alloc] initWithFrame:CGRectMake(20, 118, 86, 36)];
        button1.tag = 1;
        [button1 setTitle:@"确定" forState:UIControlStateNormal];
        button1.backgroundColor = [UIColor blueColor];
        [button1 addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside];
        [self addSubview:button1];
        
        UIButton *button2 = [[UIButton alloc] initWithFrame:CGRectMake(199, 118, 86, 36)];
        button2.tag = 2;
        [button2 setTitle:@"取消" forState:UIControlStateNormal];
        button2.backgroundColor = [UIColor blueColor];
        [button2 addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside];
        [self addSubview:button2];
        
        self.backgroundColor = [UIColor grayColor];
    }
    
    -(void) buttonClicked:(id)sender
    {
        UIButton *btn = (UIButton *) sender;
        
        if (SaveAlertDelegate) {
            if ([SaveAlertDelegate respondsToSelector:@selector(alertView:clickedButtonAtIndex:)])
            {
                [SaveAlertDelegate alertView:self clickedButtonAtIndex:btn.tag save2File:[switch1 isOn] save2Album:[switch2 isOn]];
            }
        }
        
        [self dismissWithClickedButtonIndex:0 animated:YES];
        
    }
    
    - (void) show {
        [super show];
    //    CGSize imageSize = self.backgroundImage.size;
    //    self.bounds = CGRectMake(0, 0, imageSize.width, imageSize.height);
        self.frame = CGRectMake(350, 300, 320, 191);
    }
    @end

    然后是调用,不要忘记设置委托

                SaveAlertView *savealert = [[SaveAlertView alloc] initWithFrame:CGRectMake(340, 221, 305, 191)];
                savealert.SaveAlertDelegate = self;
                [savealert show];

    差不多就是这样了。

     

       


    作者:老Zhan
    出处:http://www.cnblogs.com/mybkn/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

     
  • 相关阅读:
    Android之TabHost实现Tab切换
    银联支付SDK集成
    iOS 支付 [支付宝、银联、微信]
    MySQL数据库数据类型以及INT(M)的含义
    cherrypy
    使用PyMySQL操作mysql数据库
    面向新手的Web服务器搭建(一)——IIS的搭建
    SQLite3中自增主键相关知识总结,清零的方法、INTEGER PRIMARY KEY AUTOINCREMENT和rowid的使用
    FMDB-FMDatabaseQueue
    SQLite 数据类型
  • 原文地址:https://www.cnblogs.com/mybkn/p/2638002.html