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];

 

差不多就是这样了。

转载于:https://www.cnblogs.com/haibosoft/p/4257062.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_34343000/article/details/94193173

智能推荐

成为 Java 高级程序员需要掌握哪些?-程序员宅基地

文章浏览阅读1.5k次,点赞2次,收藏4次。Section 1 Core Java,就是 Java 基础、JDK 的类库,很多童鞋都会说,JDK 我懂,但是懂还不足够,知其然还要知其所以然,JDK 的源代码写的非常好,要经常查看,对使用频繁的类,比如 String,集合类(List,Map,Set)等数据结构要知道它们的实现..._10年java软件开发工程师适合看什么技术

c语言实现文件移动\复制\重命名\删除等函数_c语言 copy 文件 api movefile-程序员宅基地

文章浏览阅读7.6k次。1.复制文件,定义与调用用例BOOL WINAPI CopyFile( __in LPCTSTR lpExistingFileName, __in LPCTSTR lpNewFileName, __in BOOL bFailIfExists);//CopyFile(srcfilepath, dstfilepath, 0_c语言 copy 文件 api movefile

SAP-ABAP-小计收起/折叠明细项目-只显示小计内容_sap小计折叠-程序员宅基地

文章浏览阅读1.5k次。单个小计收起明细:报表数据->合计->按照维度小计->点击小计维度字段(折叠所选内容) 或者 点击合计字段 左侧小点。 所有小计收起明细:报表数据->合计->按照维度小计->小计->下钻总计级别->选择对应级别->回车 ..._sap小计折叠

IIS7应用程序池停止后,如何自动启动_iis 应用程序自动启动-程序员宅基地

文章浏览阅读1.6k次。我的环境:win2008R2 64位+IIS7.0从windows事件里找到错误原因:应用程序池“abc”将被自动禁用,原因是为此应用程序池提供服务的进程中出现一系列错误。这个应用程序池停止后,它就无法自动启动了,导致网站出现503错误网上搜索千篇一律的解决办法是:给IIS Admin Service添加NetWork Service用户权限(本地启动、本地激活)这种说法并不完..._iis 应用程序自动启动

Linux java jvm 启动默认内存最大值-Xmx调整为物理内存的80%脚本_eden space 1048576k, 100% used-程序员宅基地

文章浏览阅读6.2k次。java -XX:+HeapDumpOnOutOfMemoryError -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintHeapAtGC -XX:+PrintGCTimeStamps -XX:-PrintCommandLineFlags -Xmx`free -m | grep Mem\: | awk '{print $2}' | xargs -i expr..._eden space 1048576k, 100% used

maven学习资源_maven推荐学习资源-程序员宅基地

文章浏览阅读222次。易百网http://www.yiibai.com/maven/---------------------------------------------------------【笔记】远程仓库在 pom.xml 文件这样: java.net https://maven.java.net/content/repositories/publ_maven推荐学习资源

随便推点

Drools规则描述语言快速手册_drl语言-程序员宅基地

文章浏览阅读721次。在规则引擎中,通常会使用某种表述性的语言(而不是编程语言)来描述规则。所以规则描述语言也是规则引擎的一个重要组成部分。目前在规则描述语言方面,并没有一个通用的标准获得规则引擎厂商的广泛支持,大部分规则描述语言都是厂商私有的。大体来说,规则语言可以分为结构化的(Structured)和基于标记的(Markup,通常为xml)。常见的规则描述语言包括:srl(Structured Rule Language) : Fair Isaac(以前是Blaze Software)定义的结构化规则描述语言_drl语言

Apache----windows下虚拟主机和虚拟目录的认识(Apache配置)_虚拟目录和虚拟主机-程序员宅基地

文章浏览阅读4.7k次,点赞3次,收藏3次。【指导老师】 王津 CTO 天津千行时线科技有限公司1 前言虚拟主机和虚拟目录的用处和区别很大,需要一番深究。在windows/Linux/Mac上配置也有差异。区别这两个东西,是为了更方便的发布和部署你的项目!!!虚拟目录,你在发布的时候,会多一个project目录,去不掉,工程项目过大的时候。虚拟主机,直接是域名+index.php首页,方便发_虚拟目录和虚拟主机

Spring4笔记----工厂方法配置bean_spring4 工厂方法注入bean-程序员宅基地

文章浏览阅读333次。(1)静态工厂方法调用静态工厂方法创建 Bean是将对象创建的过程封装到静态方法中.当客户端需要对象时,只需要简单地调用静态方法,而不同关心创建对象的细节.要声明通过静态方法创建的 Bean, 需要在Bean 的class 属性里指定拥有该工厂的方法的类,同时在 factory-method属性里指定工厂方法的名称.最后, 使用 元素为该方法传递_spring4 工厂方法注入bean

公布Windows版Flutter_flutter windows ui-程序员宅基地

文章浏览阅读639次。公布Windows版Flutter构建高质量的Windows应用程序,并在移动和web上运行自从我们推出Flutter以来,我们一直专注于提供一个跨平台的解决方案,以获得漂亮的、定制的应用程序,这些应用程序被编译为机器代码,并充分利用您的设备的底层图形硬件。今天是这一愿景的重大扩展,我们首次发布了对Windows作为应用目标的支持,使Windows开发者能够受益于移动开发者所享有的同样的生产力和力量。我们在Flutter上的目标是为您提供构建良好体验所需的工具,无论您在哪个操作系统上构建。因此,我们_flutter windows ui

MSB8003: 未定义 WindowsSDKDir 属性_msb800未定义windows sdkir属性-程序员宅基地

文章浏览阅读5.7k次。warning MSB8003: 未定义 WindowsSDKDir 属性。可能找不到某些生成工具。可能找不到某些生成工具。VS三大版本的对比分析VS运行出错用Visual Studio Installer 修复一遍就行了安装问题,修复一下,,社区版的应该没什么大问题。Visual Studio Community毕竟嘛,社区版,也可以理解为个人版。适用于学生、开源和个人等等。一些新手用来学习是个不错的选择。该版本有相对完备的免费IDE。可用于开发 Android、iOS、Windows 和_msb800未定义windows sdkir属性

50M/s, Onedrive直链提取-IDM实现满速下载-程序员宅基地

文章浏览阅读4.8w次,点赞9次,收藏30次。50M/s, Onedrive直链提取+IDM实现满速下载博客内容遵循 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 协议本文永久链接是:https://blog.nxingcloud.co/posts/a3ad802e.htmlOneDrive虽然嫖到了5T但是速度慢到极致是不是很不甘心,心里发痒?别急!OneDrive的真正实力远超你想象!今天,我就来教大家如何用oneindex+IDM让你的OneDrive下载速度爆表。话不多说,正文开整!!!国内网盘现状_onedrive直链