iOS 第三方自定义Alertview项目MBProcessHud中的重要代码分析
做ios,弹出一个自定义的alertview挺常见的。ios7以前,我们可以对系统的UIAlertView进行一点操作,实现一点简单的定制,但是ios7不再允许我们这样做了。因此,我们需要自己创建一个alertview。感谢大神们的辛勤工作,在网络上已经有多个效果不错的自定义alertview项目,大体分为2类:通过UIWindow实现,通过UIView实现。
通过UIWindow实现的话,首先要创建新的UIWindow,为了实现旋转后的布局,必须加载一个rootviewcontroller,再把需要的view加载rootviewcontroller上,总体来说,实现比较复杂。
通过UIView实现的话,可以通过addsubview 方法加到需要的view上,再实现相关动画,总体来说比较简单。
MBProcessHud项目是第二种实现方式,网上还有一个项目对它进行了扩展,实现了更多酷炫效果,请到code4app网站或github上查询。
MBProcessHud项目没有提供按钮选项,我们可以通过更改它的代码实现,所以在这里我简单分析一下它的关键函数。
最主要的函数就是要重写view的- (void)layoutSubviews 函数
- (void)layoutSubviews {
// Entirely cover the parent view
UIView *parent = self.superview;
if (parent) {
self.frame = parent.bounds;
}
CGRect bounds = self.bounds;
// Determine the total widt and height needed,margin为一个常量
CGFloat maxWidth = bounds.size.width - * margin;
//这里的totalSize大小指的是显示内容的圆角矩形的大小
CGSize totalSize = CGSizeZero;
//第一个控件---------------------------------------------
//确定indicator的大小
CGRect indicatorF = indicator.bounds;
//先确定indicator的宽度,如果过大,那么设定成maxWidth,否则保持原值。
indicatorF.size.width = MIN(indicatorF.size.width, maxWidth);
//修正totoalSize的宽度,使它能容的下indicator
totalSize.width = MAX(totalSize.width, indicatorF.size.width);
//不断叠加totoalSize的高度
totalSize.height += indicatorF.size.height;
//第二个控件------------------------------------------------
CGSize labelSize = MB_TEXTSIZE(label.text, label.font);
labelSize.width = MIN(labelSize.width, maxWidth);
totalSize.width = MAX(totalSize.width, labelSize.width);
//不断叠加totoalSize的高度
totalSize.height += labelSize.height;
if (labelSize.height > .f && indicatorF.size.height > .f) {
totalSize.height += kPadding;
}
//第三个控件---------------------------------------------
CGFloat remainingHeight = bounds.size.height - totalSize.height - kPadding - * margin;
CGSize maxSize = CGSizeMake(maxWidth, remainingHeight);
CGSize detailsLabelSize = MB_MULTILINE_TEXTSIZE(detailsLabel.text, detailsLabel.font, maxSize, detailsLabel.lineBreakMode);
totalSize.width = MAX(totalSize.width, detailsLabelSize.width);
totalSize.height += detailsLabelSize.height;
if (detailsLabelSize.height > .f && (indicatorF.size.height > .f || labelSize.height > .f)) {
totalSize.height += kPadding;
}
totalSize.width += * margin;
totalSize.height += * margin;
// Position elements,依次放置控件
//第一个控件-------------------------
CGFloat yPos = round(((bounds.size.height - totalSize.height) / )) + margin + yOffset;
CGFloat xPos = xOffset;
indicatorF.origin.y = yPos;
indicatorF.origin.x = round((bounds.size.width - indicatorF.size.width) / ) + xPos;
indicator.frame = indicatorF;
//累加y偏移量
yPos += indicatorF.size.height;
if (labelSize.height > .f && indicatorF.size.height > .f) {
yPos += kPadding;
}
//第二个控件-------------------------
CGRect labelF;
labelF.origin.y = yPos;
labelF.origin.x = round((bounds.size.width - labelSize.width) / ) + xPos;
labelF.size = labelSize;
label.frame = labelF;
//累加y偏移量
yPos += labelF.size.height;
if (detailsLabelSize.height > .f && (indicatorF.size.height > .f || labelSize.height > .f)) {
yPos += kPadding;
}
//第三个控件-------------------------
CGRect detailsLabelF;
detailsLabelF.origin.y = yPos;
detailsLabelF.origin.x = round((bounds.size.width - detailsLabelSize.width) / ) + xPos;
detailsLabelF.size = detailsLabelSize;
detailsLabel.frame = detailsLabelF;
// Enforce minsize and square rules,尽量保持矩形
if (square) {
CGFloat max = MAX(totalSize.width, totalSize.height);
if (max <= bounds.size.width - * margin) {
totalSize.width = max;
}
if (max <= bounds.size.height - * margin) {
totalSize.height = max;
}
}
if (totalSize.width < minSize.width) {
totalSize.width = minSize.width;
}
if (totalSize.height < minSize.height) {
totalSize.height = minSize.height;
}
self.size = totalSize;
}
iOS 第三方自定义Alertview项目MBProcessHud中的重要代码分析的更多相关文章
- iOS开发——自定义AlertView
自定义的AlertView,可以选择出现的动画方式,正文信息高度自动变化,特意做了几个可以对比.没啥难点,直接上代码,一看就懂. 1.在YYTAlertView.h文件中 // // YYTAler ...
- iOS开发--Swift 最近项目开发中遇到的一些小问题与解决方法
1, Swift 修改导航栏颜色 self.navigationController?.navigationBar.barTintColor 2, Swift button 属性设置时直接进行初始化 ...
- 12月16日 增加一个购物车内product数量的功能, 自定义method,在helper中定义,计算代码Refactor到Model中。
仿照Rails实战:购物网站 教材:5-6 step5:计算总价,做出在nav上显示购物车内product的数量. 遇到的❌: 1. <% sum = 0 %> <% current ...
- AnimationsDemo中的ZoomActivity代码分析
AnimationsDemo是android官网的一个动画使用示例. ZoomActivity是demo中的图像缩放动画,因为这种效果比较常见,所以研究了一下代码. 下面是效果图: 毫无疑问这是一个组 ...
- openCV中cvSnakeImage()函数代码分析
/*M/////////////////////////////////////////////////////////////////////////////////////// // // IMP ...
- Openstack中RabbitMQ RPC代码分析
在Openstack中,RPC调用是通过RabbitMQ进行的. 任何一个RPC调用,都有Client/Server两部分,分别在rpcapi.py和manager.py中实现. 这里以nova-sc ...
- 对Java tutorial-examples中hello2核心代码分析
1.在hello2中有两个.java源文件分别是GreetingServlet.Java和ResponseServlet.jva文件主要对以下核心代码做主要分析. String username = ...
- 微擎框架中receive.php代码分析
- Metalama简介3.自定义.NET项目中的代码分析
本系列其它文章 使用基于Roslyn的编译时AOP框架来解决.NET项目的代码复用问题 Metalama简介1. 不止是一个.NET跨平台的编译时AOP框架 Metalama简介2.利用Aspect在 ...
随机推荐
- 使用quartz 定时任务
Quartz 是一个开源的作业调度框架,它完全由 Java 写成,并设计用于 J2SE 和 J2EE 应用中.它提供了巨大的灵活性而不牺牲简单性.你能够用它来为执行一个作业而创建简单的或复杂的调度. ...
- Java-Stack
package 集合类.list类; import java.util.Date; import java.util.Stack; /** * stack类继承与vector类 * @author j ...
- 怎么让alert弹出框的内容可以换行?
在要点击弹出的地方输入这样的代码: alert("文本框中共有字母a的个数为:"+num+"\n"+"他们在字符串的索引为:"+ind) 就 ...
- 【CodeForces 613A】Peter and Snow Blower
题 题意 给出原点(不是(0,0)那个原点)的坐标和一个多边形的顶点坐标,求多边形绕原点转一圈扫过的面积(每个顶点到原点距离保持不变). 分析 多边形到原点的最小距离和最大距离构成的两个圆之间的圆环就 ...
- BZOJ-1822 Frozen Nova 冷冻波 计(jie)算(xi)几何+二分+最大流判定+经典建图
这道逼题!感受到了数学对我的深深恶意(#‵′).... 1822: [JSOI2010]Frozen Nova 冷冻波 Time Limit: 10 Sec Memory Limit: 64 MB S ...
- POJ1067 取石子游戏
Description 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子:二是可以在两堆中同时取走相同数量的石子.最后 ...
- 洛谷P1755 斐波那契的拆分
题目背景 无 题目描述 已知任意一个正整数都可以拆分为若干个斐波纳契数,现在,让你求出n的拆分方法 输入输出格式 输入格式: 一个数t,表示有t组数据 接下来t行,每行一个数n(如题) 输出格式: t ...
- ubuntu安装spark on yarn
安装spark 安装hadoop 安装ssh,调试免密钥登录 配置hadoop 配置yarn 测试
- easyui form submit 不提交
http://bbs.csdn.net/topics/390811964 function saveProduct() { //$('#fm').form('submit', ...
- JDK,JRE,JVM区别与联系(ZZ)
http://www.cnblogs.com/hencehong/p/3252166.html 我们开发的实际情况是:我们利用JDK(调用JAVA API)开发了属于我们自己的JAVA程序后,通过JD ...