首页 文章 精选 留言 我的

精选列表

搜索[AI编程],共10000篇文章
优秀的个人博客,低调大师

iOS编程(双语版)-视图-Frame/Bounds/Center

1. Frame 每个视图都有一个frame属性,它是CGRect结构,它描述了视图所在的矩形在其父视图中的位置。 (屏幕坐标系默认的原点在左上角,x轴向右伸展,y轴向下伸展) 设置frame通常通过视图的指定初始化器initWithFrame 下面来看个例子,该例子初始化了3个相互叠加的矩形区域 (Objective-C代码) UIView* v1 = [[UIView alloc] initWithFrame:CGRectMake(113, 111, 132, 194)]; v1.backgroundColor = [UIColor colorWithRed:1 green:.4 blue:1 alpha:1]; UIView* v2 = [[UIView alloc] initWithFrame:CGRectMake(41, 56, 132, 194)]; v2.backgroundColor = [UIColor colorWithRed:.5 green:1 blue:0 alpha:1]; UIView* v3 = [[UIView alloc] initWithFrame:CGRectMake(43, 197, 160, 230)]; v3.backgroundColor = [UIColor colorWithRed:1 green:0 blue:0 alpha:1]; [mainview addSubview: v1]; [v1 addSubview: v2]; [mainview addSubview: v3]; (Swift代码 iOS9) let v1 = UIView(frame:CGRectMake(113, 111, 132, 194)) v1.backgroundColor = UIColor(red: 1, green: 0.4, blue: 1, alpha: 1) let v2 = UIView(frame:CGRectMake(41, 56, 132, 194)) v2.backgroundColor = UIColor(red: 0.5, green: 1, blue: 0, alpha: 1) let v3 = UIView(frame:CGRectMake(43, 197, 160, 230)) v3.backgroundColor = UIColor(red: 1, green: 0, blue: 0, alpha: 1) mainview.addSubview(v1) v1.addSubview(v2) mainview.addSubview(v3) 运行结果: 2. Bounds Bounds也是CGRect结构,和Frame不同,它描述的是视图自身的矩形区域,是相对于自身的坐标系而言的。 下面的例子创建了2个叠加的矩形视图,子视图为绿色较小的那个 (Objective-C代码) UIView* v1 = [[UIView alloc] initWithFrame:CGRectMake(113, 111, 132, 194)]; v1.backgroundColor = [UIColor colorWithRed:1 green:.4 blue:1 alpha:1]; // 在一个视图内部画图时,通常需要使用该视图的bounds UIView* v2 = [[UIView alloc] initWithFrame:CGRectInset(v1.bounds, 10, 10)]; v2.backgroundColor = [UIColor colorWithRed:.5 green:1 blue:0 alpha:1]; [mainview addSubview: v1]; [v1 addSubview: v2]; (Swift代码 iOS9) let v1 = UIView(frame:CGRectMake(113, 111, 132, 194)) v1.backgroundColor = UIColor(red: 1, green: 0.4, blue: 1, alpha: 1) // 在一个视图内部画图时,通常需要使用该视图的bounds let v2 = UIView(frame:v1.bounds.insetBy(dx: 10, dy: 10)) v2.backgroundColor = UIColor(red: 0.5, green: 1, blue: 0, alpha: 1) mainview.addSubview(v1) v1.addSubview(v2) 运行结果: 下面的例子通过改变绿色子视图的bounds将父视图完全覆盖 (Objective-C代码) UIView* v1 = [[UIView alloc] initWithFrame:CGRectMake(113, 111, 132, 194)]; v1.backgroundColor = [UIColor colorWithRed:1 green:.4 blue:1 alpha:1]; UIView* v2 = [[UIView alloc] initWithFrame:CGRectInset(v1.bounds, 10, 10)]; v2.backgroundColor = [UIColor colorWithRed:.5 green:1 blue:0 alpha:1]; [mainview addSubview: v1]; [v1 addSubview: v2]; // 重定义子视图的bounds CGRect r = v2.bounds; r.size.height += 20; r.size.width += 20; v2.bounds = r; (Swift代码 iOS9) let v1 = UIView(frame:CGRectMake(113, 111, 132, 194)) v1.backgroundColor = UIColor(red: 1, green: 0.4, blue: 1, alpha: 1) let v2 = UIView(frame:v1.bounds.insetBy(dx: 10, dy: 10)) v2.backgroundColor = UIColor(red: 0.5, green: 1, blue: 0, alpha: 1) mainview.addSubview(v1) v1.addSubview(v2) v2.bounds.size.height += 20 v2.bounds.size.width += 20 运行结果: 下面的例子,紫色父视图的原点进行少量偏移 (Objective-C代码) UIView* v1 = [[UIView alloc] initWithFrame:CGRectMake(113, 111, 132, 194)]; v1.backgroundColor = [UIColor colorWithRed:1 green:.4 blue:1 alpha:1]; UIView* v2 = [[UIView alloc] initWithFrame:CGRectInset(v1.bounds, 10, 10)]; v2.backgroundColor = [UIColor colorWithRed:.5 green:1 blue:0 alpha:1]; [mainview addSubview: v1]; [v1 addSubview: v2]; // 改变父视图的原点坐标 CGRect r = v1.bounds; r.origin.x += 10; r.origin.y += 10; v1.bounds = r; (Swift代码 iOS9) let v1 = UIView(frame:CGRectMake(113, 111, 132, 194)) v1.backgroundColor = UIColor(red: 1, green: 0.4, blue: 1, alpha: 1) let v2 = UIView(frame:v1.bounds.insetBy(dx: 10, dy: 10)) v2.backgroundColor = UIColor(red: 0.5, green: 1, blue: 0, alpha: 1) mainview.addSubview(v1) v1.addSubview(v2) // 改变父视图的原点坐标 v1.bounds.origin.x += 10 v1.bounds.origin.y += 10 运行结果: 3. Center Center即视图的中心点位置坐标 4. 关于主窗口和设备屏幕 设备屏幕(UIScreen.mainScreen())没有frame, 但它有bounds。 主窗口没有父视图,但是它的frame可以设为屏幕的bounds。 let w = UIWindow(frame: UIScreen.mainScreen().bounds) 5. 关于frame和bounds的区别 一言以蔽之,就是前者相对于父视图,而后者相对于自身。 我们还是用图片来看一下吧,这样更直观 在视图未旋转的情况下,它们差不多,坐标稍有区别,如下图: 而在视图作了类似旋转的transform之后,它们的坐标则有很大的差别了,见下图:

优秀的个人博客,低调大师

第十三章 Python数据库编程

本章节讲解Python操作数据库,完成简单的增删改查工作,以MySQL数据库为例。 Python的MySQL数据库操作模块叫MySQLdb,需要额外的安装下。 通过pip工具安装:pip install MySQLdb MySQLdb模块,我们主要就用到连接数据库的方法MySQLdb.Connect(),连接上数据库后,再使用一些方法做相应的操作。 MySQLdb.Connect(parameters...)方法提供了以下一些常用的参数: 参数 描述 host 数据库地址 user 数据库用户名, passwd 数据库密码,默认为空 db 数据库库名,没有默认库 port 数据库端口,默认3306 connect_timeout 连接超时时间,秒为单位 use_unicode 结果以unicode字符串返回 charset 插入数据库编码 连接对象返回的connect()函数: commit() 提交事务。对支持事务的数据库和表,如果提交修改操作,不适用这个方法,则不会写到数据库中 rollback() 事务回滚。对支持事务的数据库和表,如果执行此方法,则回滚当前事务。在没有commit()前提下。 cursor([cursorclass]) 创建一个游标对象。所有的sql语句的执行都要在游标对象下进行。MySQL本身不支持游标,MySQLdb模块对其游标进行了仿真。 游标对象也提供了几种方法: close() 关闭游标 execute(sql) 执行sql语句 excutemany(sql) 执行多条sql语句 fetchone() 从执行结果中取第一条记录 fetchmany(n) 从执行结果中取n条记录 fetchall() 从执行结果中取所有记录 scroll(self, value, mode='relative') 游标滚动 博客地址:http://lizhenliang.blog.51cto.com QQ群:323779636(Shell/Python运维开发群) 13.1 数据库增删改查 13.1.1 在test库创建一张user表,并添加一条记录 >>>conn=MySQLdb.Connect(host='192.168.1.244',user='root',passwd='QHyCTajI',db='test',charset='utf8') >>>cursor=conn.cursor() >>>sql="createtableuser(idint,namevarchar(30),passwordvarchar(30))" >>>cursor.execute(sql)#返回的数字是影响的行数 0L >>>sql="insertintouser(id,name,password)values('1','xiaoming','123456')" >>>cursor.execute(sql) 1L >>>conn.commit()#提交事务,写入到数据库 >>>cursor.execute('showtables')#查看创建的表 1L >>>cursor.fetchall()#返回上一个游标执行的所有结果,默认是以元组形式返回 ((u'user',),) >>>cursor.execute('select*fromuser') 1L >>>cursor.fetchall() ((1L,u'xiaoming',u'123456'),) 13.1.2 插入多条数据 >>>sql='insertintouser(id,name,password)values(%s,%s,%s)' >>>args=[('2','zhangsan','123456'),('3','lisi','123456'),('4','wangwu','123456')] >>>cursor.executemany(sql,args) 3L >>>conn.commit() >>>sql='select*fromuser' >>>cursor.execute(sql) 4L >>>cursor.fetchall() ((1L,u'xiaoming',u'123456'),(2L,u'zhangsan',u'123456'),(3L,u'lisi',u'123456'),(4L,u'wangwu',u'123456')) args变量是一个包含多元组的列表,每个元组对应着每条记录。当查询多条记录时,使用此方法,可有效提高插入效率。 13.1.3 删除用户名xiaoming的记录 >>>sql='deletefromuserwherename="xiaoming"' >>>cursor.execute(sql) 1L >>>conn.commit() >>>sql='select*fromuser' >>>cursor.execute(sql) 3L >>>cursor.fetchall() ((2L,u'zhangsan',u'123456'),(3L,u'lisi',u'123456'),(4L,u'wangwu',u'123456')) 13.1.4 查询记录 >>>sql='select*fromuser' >>>cursor.execute(sql) 3L >>>cursor.fetchone()#获取第一条记录 (2L,u'zhangsan',u'123456') >>>sql='select*fromuser' >>>cursor.execute(sql) 3L >>>cursor.fetchmany(2)#获取两条记录 ((2L,u'zhangsan',u'123456'),(3L,u'lisi',u'123456')) 13.1.4 以字典形式返回结果 默认显示是元组形式,要想返回字典形式,使得更易处理,就用到cursor([cursorclass])中的cusorclass参数。 传入MySQLdb.cursors.DictCursor类: >>>cursor=conn.cursor(MySQLdb.cursors.DictCursor) >>>sql='select*fromuser' >>>cursor.execute(sql) 3L >>>cursor.fetchall() ({'password':u'123456','id':2L,'name':u'zhangsan'},{'password':u'123456','id':3L,'name':u'lisi'},{'password':u'123456','id':4L,'name':u'wangwu'}) 13.2 遍历查询结果 #!/usr/bin/envpython #-*-coding:utf-8-*- importMySQLdb try: conn=MySQLdb.Connect(host='127.0.0.1',port=3306,user='root',passwd='123456',connect_timeout=3,charset='utf8') cursor=conn.cursor() sql="select*fromuser" cursor.execute(sql) foriincursor.fetchall(): printi exceptException,e: print("ConnectionError:"+str(e)) finally: conn.close() #pythontest.py (2L,u'zhangsan',u'123456') (3L,u'lisi',u'123456') (4L,u'wangwu',u'123456') 使用for循环遍历查询结果,并增加了异常处理。

优秀的个人博客,低调大师

Objective-C编程 - 1. 浅谈内存分配

Objective-C语言的对象类型都必须用指针,对象所占的内存是在堆(heap)上分配的。 NSString也必须在堆上分配,因此必须用指针。 NSString *someString = @"here is the string";NSString *anotherString = someString; 上面例子的内存分布图如下: 分配在堆中的内存必须直接管理,分配在栈上用于保存变量的内存会在其栈帧弹出时自动清理。 Objective-C中内存管理的机制叫自动引用计数(ARC)。 CGRect是结构体,是栈对象,因此不需要使用指针。 CGRect frame;frame.origin.x = 0.0f;frame.size.width = 100.0f;

优秀的个人博客,低调大师

10个对开发项目有害的编程习惯

【大咖・来了 第7期】10月24日晚8点观看《智能导购对话机器人实践》 避免这些常见的编码习惯,会让我们的工作更轻松、软件更安全且更易于扩展。 帕雷托法则明确指出,20%的因导致80%的果。又称为80-20法则,它适用于几乎每一个需要人作为劳动主体的相关领域。 在软件开发领域,这个法则可以概括为,大多数的问题都是由少数不良编码习惯造成的。改变这些习惯,你会更有效率。 下面讲讲最要不得的10条编码习惯: 1.拼写错误 让我特别讶异的是,为什么大家明知这个习惯百害而无一利,竟然还是任其在代码中肆虐横行,以致于经常出现拼写错误的变量名和函数名。更加悲剧的是,错误的拼写常常隐蔽得很好,很难发现。 至于解决方法,可以在一个良好的集成开发环境(IDE)上写代码,或者干脆用程序员专用的文本编辑器,这些都可以显著减少拼写错误。还可以选择特定 的变量名和函数名,一方面容易拼写,另一方面即便写错了也能轻易发现。尽量避免使用很容易拼错的单词,例如“receive”,很容易拼写成 “recieve”。 2.未按规定格式写代码 缩进和格式化,能让我们的代码一目了然、易于理解,有什么错误也能一览无余。而且也方便别人理解和维护。 如果你使用的是不会自动格式化代码的IDE,那么可以考虑使用代码美化软件,如Uncrustify,这个软件允许用户自定义格式要求,然后它会一丝不苟地执行。 3.未按规定模块化编写代码 一个函数对应一个指令的习惯相当好,因为简短所以易于理解和维护。长函数实现的可能路径太多,所以测试起来就特别麻烦。 ***个规范原则:一个函数最多只能占一显示屏的空间。第二个:如果有10个以上的if语句或者循环语句,那么你就可以考虑重写了。 4.过度依赖IDE 毫无疑问,IDE和其他一些工具能让你的代码写得又快又好。在一定范围内它们能提供变量和其他很多东西,给出你想要输入内容的多种选择提示。但是这 种类型的工具也存在着风险——如果你不能保证自己有火眼金睛,那么很容易误选相似的变量名。从本质上说,这类工具替代了人的一部分思维,但实际上这是你自 己的责任。 工具的确是我们的好帮手,例如可以消除拼写错误,以及提高工作效率等,但是如果你自己不仔细的话,同样会有写错代码的问题出现。 5.使用硬编码的密码 很多人倾向于硬编码一个秘密帐户和密码,这样之后就可以自由进入系统。但是这是不对的——没错,这于你而言的确是大大的方便了,但同时这也大大方便了别人去访问你的源代码。 究其原因在于,硬编码的代码比你想象的还要脆弱,这就使得它成为了一个巨大的安全隐患,而且还是一个很不好修复的安全隐患。 6.没有采取良好的加密手段保护数据 敏感数据在互联网上传输时是需要加密的,因为在这个过程中它很有可能被拦截。不要抱怨麻烦,这是最基本的安全要求。 这也意味着以明文形式发送数据是不被认可的,同时也排除了我们使用自己的加密方式和混淆目标的措施。写安全加密系统是很难的——看看wep的情况就知道了——所以我们不妨使用经过验证的标准加密库。 7.过早优化代码 Donald Knuth,一位传奇的程序员,曾经说过,“程序员将太多的时间花在了思考和担忧程序非紧要部分的进度问题上,因为这些举措反而对效率产生了强烈的负面影响,如果还同时要考虑到调试和维护的话,那么影响更甚。” 善于写代码的程序员的确能让代码跑得更快更顺畅,但是后期调试和维护相反则会变难。提供一个好策略:清清楚楚地写好代码之后,再去找真正需要优化的地方以提高性能。 8.没有超前的思想 项目的目标是什么?预计规模有多大?会有多少用户,运行速度得有多快?这些问题乍一看上去好像和我们程序员没啥关系——但是,如果不好好思考这些问题,我们怎么能正确选择开发应用程序的框架,以满足这些要求? Twitter在这方面就有因为低估未来需求而失败的例子,导致其最终不得不放弃Ruby on Rails,并且重写了很多使用Scala和其他技术的代码,这是因为原先用于架构的Ruby代码,根本跟不上Twitter的快速增长的用户群。 9.以为增加人手就能加快进度 几乎所有的软件项目都会落后于计划。有人会说,人多力量大,落后了那我添加人手不就能跟上进度了吗?听上去挺美的,但事实却是,几乎所有的项目在增加“新鲜血液”之后都发生了“凝血反应”——整体效率不升反降。 10.知错不改,错上加错 接上面第9点,有人会说,既然不能添加人手,那我死命赶进度总可以了吧。我奉劝一句,不要抱这种幻想。如果你远远落后于计划时间,那说明本身你对项目的预估时间就是错的。不要盲目地坚持将错就错,还是早点对项目时间做新的估计吧。 译文链接:http://www.codeceo.com/article/10-bad-coding-break-project.html 英文原文:10 Bad Coding Practices That Wreck Software Development Projects 翻译作者:小峰

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册