全部 文章 问答 分享 共找到173个相关内容
[文章] Swift快速入门常量和变量(2)
基础入门学习任何一门语言,首先入门的应该就是变量和数据类型了。语言特性Swift可以说是一门较新的语言,苹果于2014年[WWDC]苹果开发者大会发布。
2020-09-14 22:53 · Swift
[文章] iOS从0到1开发领券联盟(目录)
先给目录放在这里,计划100篇,希望明年的这个时候全部写完吧==说明:==-1.本系列文章虽是从0到1,但是不会具体到每一个语言和编程的细节,目的是快速入门,不要求有iOS和Swift的基础,但是之前最好有一门编程语言的基础
2020-09-11 14:16 · Swift / iOS / 领券联盟
[文章] UIKit快速入门之UILable(2)
本次我们要实现的效果是一个类似HelloWorld的入门demo,即一个水平垂直居中的UILable。如下图:新建iOSApp按照上一节介绍的环境搭建,我们新建一个SingleViewApp。
2020-09-27 21:34 · UIKit / UILable
[文章] UIKit快速入门之UIButton(4)
作为入门练习,可以先了解一下,深入的会在实战环节进行介绍:首先创建一个新文件,选择xcode菜单,File->New->File,选择:CocoaTouchClass类型:MyButton.swift
2020-10-14 12:17 · Swift / iOS / UIKit / UIButton
[问答] 如何入门android GIS开发
android开发GIS软件该如何入门,有相关专业的前辈可以指导一下吗?
2020-02-13 16:21 · android
[文章] Nginx快速入门
Nginx概述简介Nginx(Enginex)是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器,由伊戈尔·赛索耶夫开发。其将源代码以类BSD许可证的形式发布,并且因其稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。其特点是占有内存少,并发能力强。能够支持高达50,000个并发连接数的响应作用Http代理正向代理代理客户端反向代理代理服务器负载均衡负载均衡策略:内置策略轮询依次循环访问加权轮询根据服务器权重值访问IPhash对请求客户端的IP进行hash操作,根据hash结果将同一客户端的请求分发给同一台服务器进行处理,解决session不共享问题扩展策略动静分离将网站中的动态资源(数据展示)与静态资源(css\html\image\js)分离,缓存静态资源,提高资源响应速度安装网址:nginx:downloadwindows安装:下载压缩包,nginx/Windows-1.20.1解压到英文目录CMD窗口启动nginx.exe默认监听80端口Linux安装:下载压缩包,nginx-1.20.1解压执行手动安装:./configuremakemakeinstall安装目录:==usr/local/nginx==配置文件:==usr/local/nginx/conf/nginx.conf==nginx操作cd/usr/local/nginx/sbin./nginx#启动nginx./nginx-sstop#停止nginx./nginx-squit#安全退出./nginx-sreload#重新加载配置文件psaux|grepnginx#查看nginx进程实际使用nginx.conf##全局配置#usernobody;worker_processes1;#error_loglogs/error.log;#error_loglogs/error.lognotice;#error_loglogs/error.loginfo;#pidlogs/nginx.pid;#最大连接数events{worker_connections1024;}#HTTP配置http{#HTTP中的全局配置includemime.types;default_typeapplication/octet-stream;sendfileon;#tcp_nopushon;#keepalive_timeout0;keepalive_timeout65;#gzipon;#负载均衡配置upstreamtest{#服务器资源weight:权重值127.0.0.1:8081weight=1;127.0.0.1:8082weight=2;}#每个服务server{listen80;#监听端口server_namelocalhost;#默认地址代理location/{roothtml;indexindex.htmlindex.htm;proxy_passhttp://test;}#代理localhost/adminlocation/admin{roothtml;indexindex.htmlindex.htm;proxy_passhttp://test;}#redirectservererrorpagestothestaticpage/50x.html#将服务器错误页面重定向到静态页面/50x.htmlerror_page500502503504/50x.html;#代理location=/50x.html{roothtml;}#HTTPSserver#代理HTTPS服务#server{#listen443ssl;#server_namelocalhost;#ssl_certificatecert.pem;#ssl_certificate_keycert.key;#ssl_session_cacheshared:SSL:1m;#ssl_session_timeout5m;#ssl_ciphersHIGH:!aNULL:!MD5;#ssl_prefer_server_cipherson;#location/{#roothtml;#indexindex.htmlindex.htm;#}#}}}
2022-07-23 15:51 · Nginx
[文章] UIKit快速入门之开发环境搭建(1)
SwiftUI在iOS13中成为标准库,采用声明书语法,类似Flutter和JetpackCompose,如下代码即可快速布局一个”HelloWorld“的界面:importSwiftUIstructContentView
2020-09-27 21:27 · UIKit / Xcode
[文章] C++入门 书籍推荐及其他
语法推荐《EssentialC++》《C++PrimerPlus》&《C++Primer》牛客网c++入门语法编程网站入门项目TinyWebServerspdlogCPlusPlusThingsindicatorssudokudbg-macro
2023-08-23 22:43 · C++ / 入门 / 学习路线
[问答] 安卓入门课程,老师的资料打包到哪了?
安卓入门课程,老师的资料打包到哪了,各处找太麻烦了,有的软件下载起来莫名的慢。
2020-09-15 13:30 · 资源
[文章] Swift快速入门注释(1)
Playground环境搭建可以新建多个页面(NewPlaygroundPage),一个页面就是一个playground。单行和多行注释当我们新建一个Playground的时候,Xcode默认为我们生成了如下代码://:[Previous](@previous)importFoundationvarstr="Hello,playground"//:[Next](@next)其中,第一行即是注释。当Swift编译器在编译代码的时候会忽略掉你的注释。Swift中的注释和C的注释以及Java的注释基本相同。如下://这是单号注释/**这是多行注释这是多行注释*//*我是多行注释start//我是嵌套的单行注释/*我是嵌套的多行注释我是嵌套的多行注释*/我是多行注释end*/注意,和其他语言不同的是,Swift的注释,支持多行注释中嵌套注释。markup注释支持markup语法,即markdown语法//:##单行注释开启markup注释/*:#一级标题##无序列表-第一项-第二项##有序列表1.第一项2.第二项##笔记>Thisisanote---##链接[阳光沙滩](https://mp.sunofbeach.net)*//****函数描述**##函数注释,开启markup,建议使用多行-支持单行注释-支持多行注释-支持嵌套注释-支持markdown语法*/funcshowComments(){}showComments()即:单行注释以//:开启多行注释以/*:开启,而且要换一行开始写注释函数注释以多行/**开启如果要查看Markup的注释效果,可以使用菜单,“Editor->ShowRenderedMarkup”看到效果,如下:如果要查看函数的markdown注释效果,可以在光标选择函数名,按住command键,显示函数的帮助信息如下:
2020-09-12 12:10 · iOS / Swift
[文章] UIKit快速入门之UIImageView(6)
UIImageView定义iOS中,UIImageView用来展示单一的照片,或者通过轮播的方式展示一系列照片。@available(iOS2.0,*)openclassUIImageView:UIView{publicinit(image:UIImage?)@available(iOS3.0,*)publicinit(image:UIImage?,highlightedImage:UIImage?)openvarimage:UIImage?//defaultisnil@available(iOS3.0,*)openvarhighlightedImage:UIImage?//defaultisnil@available(iOS13.0,*)openvarpreferredSymbolConfiguration:UIImage.SymbolConfiguration?openvarisUserInteractionEnabled:Bool//defaultisNO@available(iOS3.0,*)openvarisHighlighted:Bool//defaultisNOopenvaranimationImages:[UIImage]?@available(iOS3.0,*)openvarhighlightedAnimationImages:[UIImage]?openvaranimationDuration:TimeIntervalopenvaranimationRepeatCount:Int@available(iOS7.0,*)openvartintColor:UIColor!openfuncstartAnimating()openfuncstopAnimating()openvarisAnimating:Bool{get}}可以看到,UIImageView继承自UIView,除了可以使用UIView的常用属性和方法外,本身定义的属性和方法非常简单。本次我们分别使用UIImageView设置背景颜色、加载本地图片、网络图片、完成图片轮播,以及设置圆角边框等功能。效果如下:设置一个背景颜色//背景颜色作为图片lazyvarimageView1:UIImageView={letimageView=UIImageView()imageView.backgroundColor=UIColor.lightGrayimageView.frame=CGRect(x:10,y:64,width:200,height:100)returnimageView}()加载本地图片//加载本地图片lazyvarimageView2:UIImageView={letimageView=UIImageView()imageView.backgroundColor=UIColor.lightGrayimageView.frame=CGRect(x:10,y:166,width:200,height:100)imageView.image=UIImage(named:"baidu")//从文件目录中获取图片//letpath=Bundle.main.path(forResource:"baidu",ofType:"png")//letfileimage=UIImage(contentsOfFile:path!)//imageView.image=fileimage//关键属性imageView.contentMode=.scaleAspectFit//边框设置imageView.layer.borderColor=UIColor.red.cgColorimageView.layer.borderWidth=2//圆角的设置imageView.layer.cornerRadius=20imageView.layer.masksToBounds=true//添加tap点击事件,重要letguester=UITapGestureRecognizer(target:self,action:#selector(ViewController.imageClicked))imageView.addGestureRecognizer(guester)imageView.isUserInteractionEnabled=truereturnimageView}()常用的设置直接看注释,都很简单。加载网络图片//加载网络图片lazyvarimageView3:UIImageView={letimageView=UIImageView()imageView.frame=CGRect(x:10,y:268,width:200,height:100)leturl=URL(string:"https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png")letdata=try!Data(contentsOf:url!)imageView.image=UIImage(data:data)//边框设置imageView.layer.borderColor=UIColor.red.cgColorimageView.layer.borderWidth=2//关键属性imageView.contentMode=.scaleAspectFitreturnimageView}()设置图片轮播//图片轮播lazyvarimageView4:UIImageView={letimageView=UIImageView()imageView.frame=CGRect(x:10,y:370,width:200,height:100)//实现动画播放letimage1=UIImage(named:"baidu")letimage2=UIImage(named:"alibaba")//设置轮播的图片imageView.animationImages=[image1!,image2!]//设置图片变换持续时间imageView.animationDuration=2//开始动画imageView.startAnimating()//结束动画//imageView.stopAnimating()//边框设置imageView.layer.borderColor=UIColor.red.cgColorimageView.layer.borderWidth=2//关键属性imageView.contentMode=.scaleAspectFitreturnimageView}()设置点击事件和UILable一样,UIImageView默认不支持手势事件,可以通过设置isUserInteractionEnabled为true激活。//添加tap点击事件,重要letguester=UITapGestureRecognizer(target:self,action:#selector(ViewController.imageClicked))imageView.addGestureRecognizer(guester)imageView.isUserInteractionEnabled=truecontentMode在上述代码中,我们设置图片的显示模式时,使用了一种重要属性contentMode,其值是一个枚举值,其中有些值类似android中的android:scaleType属性效果:publicenumContentMode:Int{//默认,会对图片进行拉伸处理,充满framecasescaleToFill=0//按原图比例进行拉伸,使图片完全,不一定充满framecasescaleAspectFit=1//按原图比例填充,图片完全展示在frame中,由于使按比例充填,可能会有一部分图片看不到casescaleAspectFill=2//在尺寸变化时强制重绘,会调用setNeedsDisplaycaseredraw=3//按原比例居中显示casecenter=4//显示在imageview的上部casetop=5//显示在imageview的下部casebottom=6caseleft=7caseright=8casetopLeft=9casetopRight=10casebottomLeft=11casebottomRight=12}具体的效果,可以每个设置看一下。完整代码classViewController:UIViewController{//背景颜色作为图片lazyvarimageView1:UIImageView={letimageView=UIImageView()imageView.backgroundColor=UIColor.lightGrayimageView.frame=CGRect(x:10,y:64,width:200,height:100)returnimageView}()//加载本地图片lazyvarimageView2:UIImageView={letimageView=UIImageView()imageView.backgroundColor=UIColor.lightGrayimageView.frame=CGRect(x:10,y:166,width:200,height:100)imageView.image=UIImage(named:"baidu")//从文件目录中获取图片//letpath=Bundle.main.path(forResource:"baidu",ofType:"png")//letfileimage=UIImage(contentsOfFile:path!)//imageView.image=fileimage//关键属性imageView.contentMode=.scaleAspectFit//边框设置imageView.layer.borderColor=UIColor.red.cgColorimageView.layer.borderWidth=2//圆角的设置imageView.layer.cornerRadius=20imageView.layer.masksToBounds=true//添加tap点击事件,重要letguester=UITapGestureRecognizer(target:self,action:#selector(ViewController.imageClicked))imageView.addGestureRecognizer(guester)imageView.isUserInteractionEnabled=truereturnimageView}()//加载网络图片lazyvarimageView3:UIImageView={letimageView=UIImageView()imageView.frame=CGRect(x:10,y:268,width:200,height:100)leturl=URL(string:"https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png")letdata=try!Data(contentsOf:url!)imageView.image=UIImage(data:data)//边框设置imageView.layer.borderColor=UIColor.red.cgColorimageView.layer.borderWidth=2//关键属性imageView.contentMode=.scaleAspectFitreturnimageView}()//图片轮播lazyvarimageView4:UIImageView={letimageView=UIImageView()imageView.frame=CGRect(x:10,y:370,width:200,height:100)//实现动画播放letimage1=UIImage(named:"baidu")letimage2=UIImage(named:"alibaba")//设置轮播的图片imageView.animationImages=[image1!,image2!]//设置图片变换持续时间imageView.animationDuration=2//开始动画imageView.startAnimating()//结束动画//imageView.stopAnimating()//边框设置imageView.layer.borderColor=UIColor.red.cgColorimageView.layer.borderWidth=2//关键属性imageView.contentMode=.scaleAspectFitreturnimageView}()overridefuncviewDidLoad(){super.viewDidLoad()view.addSubview(imageView1)view.addSubview(imageView2)view.addSubview(imageView3)view.addSubview(imageView4)}//点击事件处理@objcfuncimageClicked(){print("Logo点击了……………")}}
2020-10-26 15:00 · Swift / iOS / UIImageView
[文章] UIKit快速入门之UISwitch(7)
UIControl之UISwitch定义定义:Acontrolthatoffersabinarychoice,suchasOn/Off.UISwitch就是一个可切换的开关,提供两种状态,开和关。classUISwitch:UIControlUIControl从上图及定义可知,UISwitch继承自UIControl,而UIControll继承自UIView。掌握UIControll的知识,是我们后续学习UISlider、UIStepper等控件的基础。Thebaseclassforcontrols,whicharevisualelementsthatconveyaspecificactionorintentioninresponsetouserinteractions.即UIControl是控件的基类,其最主要的特征是可以相应用户的交互,如按钮的点击、按下,开关的状态切换,日期的选择等。通常UIControl类不能直接实例化,通常我们可以继承自UIControl类实现一个自定义控件,也可以继承自现有的UIController子类,并覆写其方法,以追踪用户交互的触摸事件,或检测控件状态的变化。Target-Action机制Target-ActionMechanism中文可翻译为“目标-动作”或“目标-行为”机制。其核心是,不是通过编写代码来追踪触摸事件,而是编写动作方法(actionmethods)来响应控件特定的事件。//添加值改变监听器slider.addTarget(self,action:#selector(sliderChanged(_:)),for:.valueChanged)@objcfuncsliderChanged(_sender:UISlider){print(sender.value)}例如,可以编写一个动作方法来响应UISlider滑块值的改变。当滑块滑动时,事件会被发送到控件对象中,然后再由控件对象(UISlider)去触发target(此处是self)对象上的action行为(sliderChanged方法),来最终处理滑动的事件。因此,Target-Action机制由两部分组成:即目标对象和行为Selector。目标对象指定最终处理事件的对象,而行为Selector则是处理事件的动作方法。主要通用属性varstate:UIControl.State{get}//是否可用varisEnabled:Bool{getset}//是否选中varisSelected:Bool{getset}//是否高亮varisHighlighted:Bool{getset}UIControl.Event和UIControl.State触摸事件的类型和状态。在之前的UIButton章节中已经有了介绍。UISwitch简单示例效果如下:完整代码如下,可以直接看注释:classViewController:UIViewController{lazyvarswith:UISwitch={letswith=UISwitch()//注意:虽然设置了width和height,并不能改变大小swith.frame=CGRect(x:20,y:64,width:100,height:40)swith.tintColor=UIColor.blue//开关打开时背景颜色swith.onTintColor=UIColor.green//小圆圈的颜色swith.thumbTintColor=UIColor.orange//监听swift状态改变swith.addTarget(self,action:#selector(switchChanged(_:)),for:.valueChanged)//设置默认值swith.isOn=truereturnswith}()lazyvarlable:UILabel={letlable=UILabel()lable.frame=CGRect(x:20,y:124,width:160,height:40)returnlable}()overridefuncviewDidLoad(){super.viewDidLoad()view.addSubview(swith)view.addSubview(lable)letstate=swith.isOn?"On":"Off"lable.text="当前状态:"+state}@objcfuncswitchChanged(_sender:UISwitch){print(sender.isOn)lable.text="当前状态:\(sender.isOn?"On":"Off")"}}
2020-11-03 21:34 · Swift / UIKit / UISwitch
[问答] 锯老师,什么时候出个后端项目教程,好入门java
锯老师,什么时候出个后端项目教程,好入门java
2020-04-20 23:51 · 学习
[问答] maven创建javaweb 项目,连接不上数据库


最近才学的javaweb快速入门,但是前进比较难,一路上遇到了问题。

2022-09-18 03:05 · servlet / mysql / java / jdbc / druid
[文章] Swift快速入门数据类型(3)
常用数据类型我们定义一个Int类型的age变量,查看Int的定义,发现在Swift中,Int竟然是Struct类型。和Kotlin类似,在Kotlin中一切都是对象。而Swift中,没有基本类型,常用Int、String等都是通过Struct来定义的。这样的好处是,我们可以直接在Int类型上进行扩展,如,Xcode中我们输入一个数字,默认会提示有很多属性和方法:当然,由于Int是Struct类型,我们可以自定义扩展,为其添加实例属性或方法:extensionInt{//获得该整数的字符串vartoString:String{returnString(self)}funcadd(_num:Int)->Int{returnself+num}}print(100.toString)//100print(100.add(100))//200值类型与引用类型Swiftsupportstwokindsoftypes:valuetypesandreferencetypes.Structsandenumsarevaluetypes,whileclassesandfunctionsarereferencetypes.Swift中支持两种类型:值类型和引用类型(valuetypesandreferencetypes)。值类型即:每个实例都拥有其数据的一份副本。值类型的赋值相当于Javascript中的深拷贝(DeepCopy)。每个变量都是独立的,不必担心另一个变量会改变它。如下图:structColor{varname:String="black"}varcolor=Color()varanthorColor=coloranthorColor.name="blue"print(color.name)//blackprint(anthorColor.name)//blue引用类型即:所有实例共享一个数据副本。修改其中一个实例的属性,会同步修改其源数据的属性。因为所有实例的引用指向的内存空间是一样的。如下图://定义一个油漆桶类,颜色是blackclassBucket{varcolor:String="black"}varbucket=Bucket()//引用传值varazurePaint=bucket//改变属性值为蓝色azurePaint.color="blue"//最终,油漆桶的颜色变为:blueprint(bucket.color)常用类型举例以下列举常量数据类型的声明和简单使用,具体的后续还会详细介绍://整型//有符号整形Int,Int8,Int16,Int32,Int16//无符号整形:UInt,UInt8,UInt16,UInt32,UInt16//一般使用Int类型即可//在32位平台上,Int的长度和Int32相同。//在64位平台上,Int的长度和Int64相同。varintNum=100//浮点数//浮点数是有小数的数字,比如3.14159,0.1,和-273.15。//Double代表64位的浮点数。//Float代表32位的浮点数。vardnum:Double=12.5varfnum:Float=12.5//字符串类型,Swift类型推断为String类型letsomeString="Somestringliteralvalue"//显示指定String类型letanotherString="Anotherstringliteralvalue"//布尔值Bool//Swift为布尔量Bool提供了两个常量值,true和false。letorangesAreOrange:Bool=trueletturnipsAreDelicious:Bool=falseifturnipsAreDelicious{print("Mmm,tastyturnips!")}else{print("Eww,turnipsarehorrible.")}//输出:Eww,turnipsarehorrible.//和JavaScript语言不同,Swift的类型安全机制会阻止你用一个非布尔量的值替换掉Bool。/*leti=1//编译期即会报错ifi{}*///元组Tuple//元组把多个值合并成单一的复合型的值。元组内的值可以是任何类型,而且可以不必是同一类型。lethttp404Error=(404,"NotFound")print("thestatuscodeis\(http404Error.0)")//thestatuscodeis404print("thereasonis\(http404Error.1)")//thereasonisNotFoundlet(statusCode,statusMessage)=http404Errorprint("thsstatuscodeis\(statusCode)")//thsstatuscodeis404lethttp200Status=(statusCode:200,description:"OK")print("Thestatuscodeis\(http200Status.statusCode)")//Thestatuscodeis200//枚举enum//可以用enum关键字来定义一个枚举,然后将其所有的定义内容放在一个大括号({})中://Swift中的枚举更加灵活,并且不需给枚举中的每一个成员都提供值。enumCompassPoint{casenorthcasesouthcaseeastcasewest}varpoint=CompassPoint.east//当point被赋值为CompassPoint.east,其类型可以被推断为:CompassPointprint(type(of:point))//当point的类型被推断为CompassPoint后,就可以使用一个缩写语法(.)将其设置为另一个CompassPoint的值point=.eastswitchpoint{case.north:print("pointisnorth")case.south:print("pointissouth")case.east:print("pointiseast")case.west:print("pointiswest")}//输出:pointiseast
2020-09-25 10:02 · Swift / iOS
[文章] UIKit快速入门之UITextView 与 UITextField(5)
UITextView与UITextField知识点在iOS中,文本输入框,有两个UITextView与UITextField。用于不同的场景,大部分属性和方法相同,但是也有一些区别,先说结论:UITextView用于多行文本,可以滚动输入的内容UITextField用于单行文本,如输入用户名或密码等TextField支持placeholderTextView不支持placeholder,通常需要自定义实现TextField按返回键表示退出编辑TextView按返回键表示换行,可以判断是否是换行隐藏键盘,退出编辑实战代码具体使用效果如下:方法和属性还是蛮多的,直接看代码注释吧:classViewController:UIViewController,UITextViewDelegate,UITextFieldDelegate{//创建UITextView对象lettextView=UITextView(frame:CGRect(x:10,y:64,width:300,height:100))//创建UITextField对象lettextField=UITextField(frame:CGRect(x:10,y:200,width:300,height:40))overridefuncviewDidLoad(){super.viewDidLoad()//initTextViewinitTextView()//initTextFieldinitTextField()}funcinitTextView(){//添加到视图上view.addSubview(textView)//背景颜色设置textView.backgroundColor=UIColor(red:0.82,green:0.82,blue:0.82,alpha:0.6)//设置textview里面的字体颜色textView.textColor=UIColor.black//设置文本字体,使用系统默认字体,指定18号字号textView.font=UIFont.systemFont(ofSize:18)//设置显示内容textView.text="我是TextView,我是多行TextView,\n会滚动的的TextView哦,我是TextView,我是多行TextView,会滚动的的TextView哦,"//文本对齐方式,一般都是左对齐吧textView.textAlignment=.left//设置圆角,比较常用textView.layer.cornerRadius=10textView.layer.masksToBounds=true//是否允许进行编辑,当为fasle时,是无法获取光标的,只能选择、复制等非编辑操作textView.isEditable=true//是否可以滚动,默认为truetextView.isScrollEnabled=true//键盘类型textView.keyboardType=.default//返回键的类型,比较有用textView.returnKeyType=.done//自适应高度textView.autoresizingMask=.flexibleHeight//设置内边距textView.textContainerInset=UIEdgeInsets(top:8,left:10,bottom:8,right:4)//指定代理textView.delegate=self//监听输入NotificationCenter.default.addObserver(self,selector:#selector(self.textDidChange),name:UITextView.textDidChangeNotification,object:nil)}@objcfunctextDidChange(){print("正在输入…………")}//键盘处理overridefunctouchesEnded(_touches:Set<UITouch>,withevent:UIEvent?){//某个textview或view失去了响应者,即收起键盘了self.textView.resignFirstResponder()self.textField.resignFirstResponder()//或注销当前view(或它下属嵌入的textfields)的firstresponder状态,即可关闭其子控件键盘//self.view?.endEditing(false)}//监听输入字符,获取当前输入值//并通过判断textView点击return(换行)是否是换行,可以结束编辑,即关闭键盘functextView(_textView:UITextView,shouldChangeTextInrange:NSRange,replacementTexttext:String)->Bool{print(text)print(textView.text??"")iftext=="\n"{self.view?.endEditing(false)returnfalse}//字数限制,在这里我的处理是给了一个简单的提示,ifrange.location>=100{print("超过100字了,无法继续输入了")returnfalse}returntrue}//------------------------------------TextField----------------------funcinitTextField(){//添加到视图上view.addSubview(textField)//无边框:none,直线边框:line,圆角矩形边框:roundedRect,边框+阴影:bezeltextField.borderStyle=.roundedRect//设置TTextField提示文字textField.placeholder="请输入用户名"//TextField密码输入框,用于输入密码textField.isSecureTextEntry=true//使TextField在界面打开时就获取焦点,并弹出输入框textField.becomeFirstResponder()//使TextField失去焦点,并收回键盘//textField.resignFirstResponder()//将代理设置本控制器,并在class加入UITextFieldDelegatetextField.delegate=self//其它属性和方法,类似TextView,可以参考}}其它不仅仅如此!TextView还支持插入图片,给文字中的电话号码和网址自动加链接,自定义选择菜单,选择文本后分享等等
2020-10-19 21:04 · Swift / UIKit / UITextView / UITextField
[文章] UIKit快速入门之UIStepper和UISlider(8)
UIStepper和UISlider和UISwitch一样,UIStepper和UISlider同样都继承自UIControl。本次的Demo效果如下:UIStepperUIStepper步进器就是一个左右加减的控件。可配置属性//触发形式//--若设置为true,则长按会连续触发变化,若设置为false,只有在按击结束后,才会触发varisContinuous:Bool//长按是否触发//--若设置为YES,则长按值会一直改变,若设置为NO,则一次点击只会改变一次值,其值不随长按时间变化。varautorepeat:Bool//设置步进器是否可以循环//--其限制条件时必须设置步进器的最大和最小值varwraps:Bool//最小值varminimumValue:Double//最大值varmaximumValue:Double//加减的梯度varstepValue:Double访问stepper的值//Thenumericvalueofthestepper.varvalue:Double自定义外观//设置背景图片funcsetBackgroundImage(UIImage?,for:UIControl.State)//自定义默认按钮图标funcsetDecrementImage(UIImage?,for:UIControl.State)funcsetIncrementImage(UIImage?,for:UIControl.State)//自定义分割线funcsetDividerImage(UIImage?,forLeftSegmentState:UIControl.State,rightSegmentState:UIControl.State)添加事件stepper.addTarget(self,action:#selector(ViewController.onStepperValueChange(_:)),for:.valueChanged)@objcfunconStepperValueChange(_stepper:UIStepper){//一直点击增加:依次循环输出1、3、5、7、9、13、5、7、9print("steppervalue:\(stepper.value)")label.text="计步器的值:\(stepper.value)"}完整代码classViewController:UIViewController{lazyvarlabel:UILabel={letlable=UILabel()lable.frame=CGRect(x:20,y:64,width:150,height:40)lable.textColor=UIColor.blackreturnlable}()lazyvarstepper:UIStepper={letstepper=UIStepper()stepper.frame=CGRect(x:20,y:130,width:100,height:40)//添加事件stepper.addTarget(self,action:#selector(ViewController.onStepperValueChange(_:)),for:.valueChanged)//设置初始值stepper.value=1.0//触发形式stepper.isContinuous=falsestepper.maximumValue=10.0stepper.minimumValue=1.0//可以循环stepper.wraps=true//每次加减2stepper.stepValue=2//背景颜色stepper.backgroundColor=UIColor.gray//改变大小//stepper.transform=CGAffineTransform(scaleX:2.0,y:2.0)returnstepper}()overridefuncviewDidLoad(){super.viewDidLoad()view.addSubview(label)view.addSubview(stepper)//显示计步器的初始值到lable上label.text="计步器的值:\(stepper.value)"}@objcfunconStepperValueChange(_stepper:UIStepper){//一直点击增加:依次循环输出1、3、5、7、9、13、5、7、9print("steppervalue:\(stepper.value)")label.text="计步器的值:\(stepper.value)"}}UISliderslider和大部分属性和stepper相同。可配置属性和方法openclassUISlider:UIControl,NSCoding{//获取当前值,默认0.0openvarvalue:Float//最小值,默认0.0openvarminimumValue:Float//最大值,默认1.0openvarmaximumValue:Float//触发形式openvarisContinuous:Bool//进度槽两侧图标默认nil,min左边图标,max右边图标openvarminimumValueImage:UIImage?openvarmaximumValueImage:UIImage?//滑块两边进度颜色,min左边槽的颜色,max右边槽的颜色//对应setMinimumTrackImage,setMaximumTrackImageopenvarminimumTrackTintColor:UIColor?openvarmaximumTrackTintColor:UIColor?@available(iOS5.0,*)openvarthumbTintColor:UIColor?//设置滑块动画openfuncsetValue(_value:Float,animated:Bool)//设置滑块图标openfuncsetThumbImage(_image:UIImage?,forstate:UIControl.StateopenfuncthumbImage(forstate:UIControl.State)->UIImage?}如何注释不理解,可以看下图:示例代码lazyvarslider:UISlider={letslider=UISlider()slider.frame=CGRect(x:20,y:200,width:200,height:40)//添加事件slider.addTarget(self,action:#selector(ViewController.onSliderValueChange(_:)),for:.valueChanged)//设置初始值slider.value=1.0//触发形式slider.isContinuous=falseslider.maximumValue=10.0slider.minimumValue=1.0slider.minimumTrackTintColor=UIColor.redslider.maximumTrackTintColor=UIColor.orangereturnslider}()
2020-11-13 18:57 · UIKit / Swift / UISlider / UIStepper
[文章] C语言入门(5)
是假时就结束循环,但有continue后,即使条件为假也执行循环.continue只对所在循环内起作用,对所在外层循环无效.break的作用是无视循循环并退出一层循环,或退出switch.switch在C语言入门
2020-02-13 02:08 · C语言入门 / 循环结构
[文章] Swift快速入门之流程控制(5)
流程控制结构化的程序设计,不管是面向过程,还是面向对象,都离不开三种基本结构。即:顺序结构、选择结构、循环结构。顺序执行自然不用多说。选择结构即基于特定的条件执行不同的代码分支,如if,guard和switch等条件语句。循环结构主要是For-in,While和Repeat-While语句。Ifconditionals你可以使用if语句来判定简单的条件,比如少量的可能性。switch语句则适合更复杂的条件,比如多个可能的组合,并可以进行模式匹配。简单用法//IF//最简单的用法,条件表达式不需要小括号,大括号不能省略letage=20ifage>18{print("成年了")}letscore=61ifscore>60{print("及格")}else{print("不及格")}If-let可选绑定注意:当碰到可选类型(Optionals)时,if语句就会变得有些不可控了!letscore:Int?=61//or:letscore:Int?=nilifscore>60{print("scoreis:\(score+0)")}else{print("不及格")}根据Xcode的提示,我们有两种方式进行修复://修改方式1://使用??操作符,但是??必须提供一个默认值!恶心letscore:Int?=61ifscore??0>60{print("scoreis:\(score??0+0)")}else{print("不及格")}//输出61//修改方式2://使用!断言,我确信没有问题的,可选类型可以unwrapped为Int类型!//虽然我确信,但是程序崩了我不负责!🤮letscore:Int?=61ifscore!>60{print("scoreis:\(score!+0)")}else{print("不及格")}//修改方式3letscore:Int?=61ifscore!=nil{//即使我们已经判空了,这里还是可选的类型,不能直接运算ifscore!>60{print("及格了")}else{print("不格了")}}else{print("什么都没有")}以上方式都很恶心啊,试试iflet吧if-let可以检查一个Optional类型所持有的值,使用if-let判断后不需要解包letscore:Int?=61ifletnewScore=score{ifnewScore>60{print("及格了:\(newScore)分")}else{print("不及格")}}//输出:及格了:61分newScore的作用域仅在{}中,当然Swift推荐我们可以重用score的命名,即:letscore:Int?=61ifletscore=score{ifscore>60{print("及格了:\(score)分")}else{print("不及格")}}如果你觉得上述写法还不够爽,看看下面的写法:letscore:Int?=61ifletscore=score,score>60{print("及格了\(score)")}else{print("不及格")}参考文档:https://github.com/apple/swift-evolution/blob/master/proposals/0099-conditionclauses.mdSwift3之前的写法是:ifletscore=scorewherescore>60guardletguardlet和iflet刚好相反,guardlet守护一定有值。如果没有,直接返回。funccheckUsername(username:String){guardusername=="admin"else{print("你不是管理员,没有权限")return}print("欢迎你,管理员:\(username)")}checkUsername(username:"JackMa")//不是管理员,没有权限checkUsername(username:"admin")//欢迎你,管理员:admin如果是可选类型能,使用guardlet即可:funccheckUsername(username:String?){guardletusername=username,username=="admin"else{print("你不是管理员,没有权限")return}print("欢迎你,管理员:\(username)")//可以随心所欲的使用username了}checkUsername(username:"JackMa")//不是管理员,没有权限checkUsername(username:"admin")//欢迎你,管理员:admincheckUsername(username:nil)//你不是管理员,没有权限guardlet的用法必须掌握,真实项目中,用的非常多的。switchstatements基础用法letname="admin"switchname{case"Jack":print("Jack")case"admin":print("Admin")default:print("NotJack,notAdmin")}注意:switch语句中不需要*break,并且switch会终止执行如果如果你想在switch中让case之后的语句会按顺序继续运行,则需要使用fallthrough语句。letvalue="1"switch(value){case"1":print("go")fallthroughcase"2":print("go")fallthroughdefault:print("go")}//输出3个gogogo//是不是感觉fallthrough完全没有什么卵用高级用法文章开头我们提到,Swift适合复杂的条件判断,看看下面的示例://区间匹配letscore=60switchscore{case0:print("Zero,傻瓜")case1..<60:print("不及格")case60..<70:print("及格")case70..<90:print("良好")case90...100:print("优秀")default:print("翻天了")}//当score为0,输出Zero,傻瓜//当score为1-59,输出不及格//当score为60-69,输出及格//当score为101输出及格翻天了//匹配元祖//可以使用元组来在一个switch语句中测试多个值letsomePoint=(1,1)switchsomePoint{case(0,0):print("(0,0)isattheorigin")case(_,0):print("(\(somePoint.0),0)isonthex-axis")case(0,_):print("(0,\(somePoint.1))isonthey-axis")case(-2...2,-2...2):print("(\(somePoint.0),\(somePoint.1))isinsidethebox")default:print("(\(somePoint.0),\(somePoint.1))isoutsideofthebox")}//prints"(1,1)isinsidethebox"//匹配enumenumDireactionModel{caseEast,South,West,North}letdirection=DireactionModel.Eastswitchdirection{case.East:print("东方")case.South:print("南方")case.West:print("西方")case.North:print("北方")}//输出:东方//关于Swift的用法还有很多,比例和where一起使用,可以和class结合使用,等等循环LoopsFor-in循环使用for-in循环来遍历序列,比如一个范围的数字,数组中的元素或者字符串中的字符。//数字区间foriin0...2{print(i)}//Bothprint://0//1//2//遍历数组letnames=["Anna","Alex","Brian","Jack"]fornameinnames{print("Hello,\(name)!")}//Hello,Anna!//Hello,Alex!//Hello,Brian!//Hello,Jack!//遍历字典letnumberOfLegs=["spider":8,"ant":6,"cat":4]for(animalName,legCount)innumberOfLegs{print("\(animalName)shave\(legCount)legs")}//antshave6legs//catshave4legs//spidershave8legs//enumerated()Returnsasequenceofpairs(n,x)//enumerated()返回一个新的序列,包含了初始序列里的所有元素,以及与元素相对应的编号for(n,c)in"Swift".enumerated(){print("\(n):'\(c)'")}//Prints"0:'S'"//Prints"1:'w'"//Prints"2:'i'"//Prints"3:'f'"//Prints"4:'t'"whilevarnum=1whilenum<3{print("num:\(num)")num+=1}//num:1//num:2Repeat-whileloopvari:Int=0repeat{print(i)i+=1}whilei<3Repeat-while会比do-while更富语义吗?where子句letstudents=["Jack":13,"Lucy":59,"Jim":88,"Tom":90]for(name,score)instudentswherescore<60{print("\(name)不及格")}//Lucy不及格//Jack不及格forEach//定义/*Callsthegivenclosureoneachelementinthesequenceinthesameorderasafor-inloop.*/funcforEach(_body:(Int)throws->Void)rethrows//可见,forEach参数是一个闭包。将序列的元素作为参数letarr=[1,2,3,4]arr.forEach{print($0)}//等同于arr.forEach{numinprint(num)}好了,关于Swift中的流程控制就介绍到这里了,是不是既简单又不简单。
2020-10-19 08:41 · Swift / iOS
[分享] starter-template,Nuxt.js手脚架,快速创建项目
starter-template,Nuxt.js手脚架,快速创建项目,推荐推荐一下!
2020-02-08 23:32 · nuxtjs / js / vue / 前端 / 手脚架
[文章] Xposed系列-快速hook实现
今天我们来介绍另一个工具,帮助我们快速实现hook。易拉钩软件安装软件,激活,重启手机。go~打开软件之后,点击右上角的···按钮。加一个应用点击进入。选择你需要hook的APP。完成之后。返回。
1970-01-01 00:00 · Xposed / Android / hook / debug / 钩子
[文章] Swift快速入门基本运算符(4)
基本运算符Swift中的运算符区分了基本运算符和高级运算符。本章节我们主要学习基本运算符,对高级运算符进行一定的了解。根据操作数的不同,Swift中的基本运算符包括一元运算符、二元运算符、三元运算符:一元运算符:对一个目标进行操作(比如-a)。一元前缀运算符在目标之前直接添加(比如!b),一元后缀运算符直接在目标末尾添加(比如c!)。二元运算符:对两个目标进行操作(比如2+3),因为它们出现在两个目标之间,所以是中缀。三元运算符:操作三个目标。如同C,Swift语言也仅有一个三元运算符,三元条件运算符(a?b:c)。受到运算符影响的值叫做操作数。在表达式1+2中,+符号是一个二元运算符,其中的两个值1和2就是操作数。赋值运算符letb=10vara=5a=b//a的值现在是10let(x,y)=(1,2)//x等于1,同时y等于2//Swift的赋值符号自身不会返回值。下面的语句是不合法的:ifx=y{//这是不合法的,因为x=y并不会返回任何值。}算术运算符Swift对所有的数字类型支持四种标准算术运算符:/*加(+)减(-)乘(*)除(/)*/1+2//equals35-3//equals22*3//equals610.0/2.5//equals4.0//加法运算符同时也支持String的拼接:"hello,"+"world"//equals"hello,world"余数运算符余数运算符(a%b)可以求出多少个b的倍数能够刚好放进a中并且返回剩下的值(就是我们所谓的余数)。余数运算符(%)同样会在别的语言中称作取模运算符。总之,严格来讲的话这个行为对应着Swift中对负数的操作,所以余数要比模取更合适。//如图://你可以给9当中放进两个4去,这样就得到了1这个余数(橘黄色的部分)。9%4//equals1//即9=4*2+1余数运算符对负数同样适用:-9%4//equals-1//即-9=(4*-2)+-1//a%b与a%-b能够获得相同的答案。一元减号运算符letthree=3letminusThree=-three//minusThreeequals-3letplusThree=-minusThree//plusThreeequals3,or"minusminusthree"一元减号运算符(-)直接在要进行操作的值前边放置,不加任何空格。一元加号运算符letminusSix=-6letalsoMinusSix=+minusSix//alsoMinusSixequals-6一元加号运算符(+)直接返回它操作的值,不会对其进行任何的修改。组合赋值符号由赋值符号(=)和其他符号组成的组合赋值符号。如(+=,-=)vara=1a+=2//即a=a+2varb=1b-=1//即b=b-1print("a=\(a),b=\(b)")//输出:a=3,b=0==组合运算符不会返回任何值。例如:letb=a+=2是错误的。==比较运算符Swift支持以下的比较运算符://等于a==b//不等于a!=b//大于a>b//小于a<b//大于等于a>=b//小于等于a<=bSwift也提供恒等(===)和不恒等(!==)这两个比较符来判断两个对象是否引用同一个对象实例。每个比较运算都返回了一个标识表达式是否成立的布尔值letname="world"ifname=="world"{print("hello,world")}else{print("I'msorry\(name),butIdon'trecognizeyou")}//输出“hello,world",因为`name`就是等于"world”如果两个元组的元素相同,且长度相同的话,元组就可以被比较。比较元组大小会按照从左到右、逐值比较的方式,直到发现有两个值不等时停止。如果所有的值都相等,那么这一对元组我们就称它们是相等的。例如:(1,"zebra")<(2,"apple")//true,因为1小于2(3,"apple")<(3,"bird")//true,因为3等于3,但是apple小于bird(4,"dog")==(4,"dog")//true,因为4等于4,dog等于dogSwift标准库只能比较七个以内元素的元组比较函数。三元运算符letcontentHeight=40lethasHeader=trueletrowHeight=contentHeight+(hasHeader?50:20)//rowHeight现在是90空合运算符(NilCoalescingOperator)空合运算符(a??b)将对可选类型a进行空判断,如果a包含一个值就进行解包,否则就返回一个默认值b。表达式a必须是Optional类型。letdefaultColor="red"varcolor:String?//默认值为nilvarnowColor=color??defaultColorprint(nowColor)color定义为一个可选类型Optional,默认值为nil,我们可以使用空合运算符去判断其值,并指定默认值区间运算符//闭区间运算符:a...b包含两端forindexin1...5{print("\(index)*5=\(index*5)")}//1*5=5//2*5=10//3*5=15//4*5=20//5*5=25//半开区间运算符:a..<b,包含a,但是不包含bletnames=["Anna","Alex","Brian","Jack"]letcount=names.countforiin0..<count{print("第\(i+1)个人叫\(names[i])")}//第1个人叫Anna//第2个人叫Alex//第3个人叫Brian//第4个人叫Jack//单侧区间:可以往一侧无限延伸的区间//例如,一个包含了数组从索引2到结尾的所有值的区间。fornameinnames[2...]{print(name)}//Brian//Jackfornameinnames[...2]{print(name)}//Anna//Alex//Brianfornameinnames[..<2]{print(name)}//Anna//Alex单侧区间不止可以在下标里使用,也可以在别的情境下使用。你也可以查看一个单侧区间是否包含某个特定的值?letrange=...5range.contains(7)//falserange.contains(4)//truerange.contains(-1)//true逻辑运算符逻辑运算符的操作对象是逻辑布尔值。逻辑非(!a):操作数前没有空格,对一个布尔值取反逻辑与(a&&b):真真为真,否则为假,存在短路计算逻辑或(a||b):有一个为真即为真,存在短路计算我们也可以组合多个逻辑运算符来表达一个复合逻辑://优先计算最左边的子表达式ifenteredDoorCode&&passedRetinaScan||hasDoorKey||knowsOverridePassword{print("Welcome!")}else{print("ACCESSDENIED")}//输出“Welcome!”//也可以使用括号明确优先级,更加易读if(enteredDoorCode&&passedRetinaScan)||hasDoorKey||knowsOverridePassword{print("Welcome!")}else{print("ACCESSDENIED")}//输出“Welcome!”高级运算符高级运算符的详细介绍请参考:https://www.cnswift.org/advanced-operators高级运算符主要包含:位运算符和移位运算符。按位取反运算符按位取反运算符(**~**)对一个数值的全部比特位进行取反://操作数前不能有空格letinitialBits:UInt8=0b00001111letinvertedBits=~initialBits//等于0b11110000按位与运算符按位与运算符(**&**)对两个数的比特位进行合并。只有当两个数的对应位都为1的时候,新数的对应位才为1:letfirstSixBits:UInt8=0b11111100letlastSixBits:UInt8=0b00111111letmiddleFourBits=firstSixBits&lastSixBits//等于00111100按位或运算符按位或运算符(**|**)可以对两个数的比特位进行比较。它返回一个新的数,只要两个数的对应位中有任意一个为1时,新数的对应位就为1letsomeBits:UInt8=0b10110010letmoreBits:UInt8=0b01011110letcombinedbits=someBits|moreBits//等于11111110按位异或运算符按位异或运算符,或称“排外的或运算符”(^),可以对两个数的比特位进行比较。当两个数的对应位不相同时,新数的对应位就为1,并且对应位相同时则为0:letfirstBits:UInt8=0b00010100letotherBits:UInt8=0b00000101letoutputBits=firstBits^otherBits//等于00010001按位左移、右移运算符按位左移运算符(**<<*)和按位右移运算符(>>**)*可以对一个数的所有位进行指定位数的左移和右移。对一个数进行按位左移或按位右移,相当于对这个数进行乘以2或除以2的运算。将一个整数左移一位,等价于将这个数乘以2,同样地,将一个整数右移一位,等价于将这个数除以2。对无符号整数进行移位的规则如下:已存在的位按指定的位数进行左移和右移。任何因移动而超出整型存储范围的位都会被丢弃。用0来填充移位后产生的空白位。溢出运算符当向一个整数类型的常量或者变量赋予超过它容量的值时,Swift默认会报错,而不是允许生成一个无效的数。这个行为为我们在运算过大或者过小的数时提供了额外的安全性。Swift提供的三个溢出运算符来让系统支持整数溢出运算。这些运算符都是以&开头的:溢出加法&+溢出减法&-溢出乘法&*运算符函数类和结构体可以为现有的运算符提供自定义的实现,被称为运算符重载。下面的例子展示了如何让自定义的结构体支持加法运算符(+)。算术加法运算符是一个二元运算符,因为它是对两个值进行运算,同时它还可以称为中缀运算符,因为它出现在两个值中间。structVector2D{varx=0.0,y=0.0}extensionVector2D{staticfunc+(left:Vector2D,right:Vector2D)->Vector2D{returnVector2D(x:left.x+right.x,y:left.y+right.y)}}letvector=Vector2D(x:3.0,y:1.0)letanotherVector=Vector2D(x:2.0,y:4.0)letcombinedVector=vector+anotherVector//输出:Vector2D(x:5.0,y:5.0)print(combinedVector)除了可以扩展支持二元运算符,也可以扩展支持一元运算符。一元运算符只运算一个值。当运算符出现在值之前时,它就是前缀的(例如-a),而当它出现在值之后时,它就是后缀的(例如b!)。要重载一元运算符,需要在声明运算符函数的时候在func关键字之前指定prefix或者postfix修饰符:structVector2D{varx=0.0,y=0.0}extensionVector2D{staticprefixfunc-(vector:Vector2D)->Vector2D{returnVector2D(x:-vector.x,y:-vector.y)}}letpositive=Vector2D(x:3.0,y:4.0)letnegative=-positive//输出:Vector2D(x:-3.0,y:-4.0)print(negative)同样,也可以对复合赋值运算符(+=)进行重载,但是:赋值运算符(=),三元条件运算符(a?b:c)无法进行重载。自定义运算符除了实现标准运算符,在Swift中还可以声明和实现自定义运算符。可以使用operator关键字在全局作用域内进行定义,同时还要指定prefix、infix或者postfix修饰符://定义了一个新的名为+++的前缀运算符prefixoperator+++虽然自定义了运算符,但是对于这个运算符,在Swift中并没有已知的意义,因此还需要进行重载实现其意义:prefixoperator+++structVector2D{varx=0.0,y=0.0}extensionVector2D{staticfunc+=(left:inoutVector2D,right:Vector2D){left=left+right}//inout关键字:通过一个函数改变函数外面变量的值(将一个值类型参数以引用方式传递)staticprefixfunc+++(vector:inoutVector2D)->Vector2D{//+=同样是重载过的vector+=vectorreturnvector}}vartoBeDoubled=Vector2D(x:1.0,y:4.0)letafterDoubling=+++toBeDoubled//toBeDoubled和afterDoubling输出:Vector2D(x:2.0,y:8.0)print(toBeDoubled)print(afterDoubling)
2020-10-12 20:42 · Swift
[文章] C语言入门(3)
语句使用以及注意的相关事项这节内容可能比较多,大家可以在空余时间消化练习.之前的小编没排序,现在排个序:C语言入门(1)-----最简框架C语言入门(2)-----框架解析目录1.变量的命名规则2.变量的输入输出
2020-02-03 14:53 · C语言 / 入门 / 编程
[文章] UIKit快速入门之UIKit基础知识(3)
UIKit基础知识UIWindowclassUIWindow:UIView定义:Thebackdropforyourapp’suserinterfaceandtheobjectthatdispatcheseventstoyourviews.Youusewindowsonlywhenyouneedtodothefollowing:Provideamainwindowtodisplayyourapp’scontent.Createadditionalwindows(asneeded)todisplayadditionalcontent.UIWindow是App的渲染主窗口。在APP启动时就为其加载并设置RootViewController。App中UIWindow对象只有一个。所有的显示必须加载到UIWindow上才可以呈现在人的眼前。创建一个window//初始化方法init(windowScene:UIWindowScene)例如:varwindow:UIWindow?funcscene(_scene:UIScene,willConnectTosession:UISceneSession,optionsconnectionOptions:UIScene.ConnectionOptions){//UIWindowScene:Aspecifictypeofscenethatmanagesoneormorewindowsforyourapp.//@available(iOS13.0,*)iOS13.0可用guardletwindowScene=(sceneas?UIWindowScene)else{return}window=UIWindow(windowScene:windowScene)}设置UIWindow大小window.frame=UIScreen.main.boundswindow.frame=CGRect(x:0,y:0,width:UIScreen.main.bounds.size.width,height:UIScreen.main.bounds.size.height)例如:以下设置会将window的启动进行移动window?.frame=CGRect(x:100,y:100,width:UIScreen.main.bounds.size.width,height:UIScreen.main.bounds.size.height)设置根控制器varrootViewController:UIViewController?{getset}window?.rootViewController=ViewController();设置背景window?.backgroundColor=UIColor.white让window显示//Showsthewindowandmakesitthekeywindow.window?.makeKeyAndVisible()//如果只是简单地显示,可以将isHidden设置为false坐标坐标是数学中的一个基本概念。在二维的平面空间,相互垂直的两条数轴即可构成一个直角坐标系,其公共原点即为坐标系的原点(origin),水平的数轴叫做x轴(x-axis)或横轴,垂直的数轴叫做y轴(y-axis)或纵轴。在iOS中,也有多种坐标体系。这里我们仅讨论UIKit中的坐标体系,即固定左上角为原点(0,0)的视图坐标系。以原点向右侧为X轴正方向,原点下侧为Y轴正方向。坐标值由浮点数来表示,内容的布局和定位因此具有更高的精度,还可以支持与分辨率无关的特性。CGPoint与CGSizeiOS采用CGPoint来表示点在坐标系上X、Y位置。//创建一个坐标点let_=CGPoint(x:100,y:100)//CGPoint的其它方法属性//CGPoint.zero即CGPoint(x:0,y:0)CGPoint.zero//获取坐标点letpoint=CGPoint(x:100,y:100)print(point.x)//输出100.0iOS采用CGSize来表示视图的宽度和高度,即视图的大小。//初始化一个sizeletsize=CGSize(width:100,height:100)//获取widthprint(size.width)//输出:100.0//等同CGSize(width:0,height:0)letzeroSize=CGSize.zeroprint(zeroSize.width)//输出0.0而CGRect则是结合了CGPoint和CGSize,用来表示矩形的位置和大小。它的origin表示矩形右上角所在位置(CGPoint),size表示矩形的大小(CGSize)。CGRect(origin:<CGPoint>,size:<CGSize>)frame、bounds和center视图对象通过frame、bounds、和center属性声明来跟踪自己的大小和位置。frame属性包含一个矩形,即边框矩形,用于指定视图相对于其父视图坐标系统的位置和大小。bounds属性也包含一个矩形,即边界矩形,负责定义视图相对于本地坐标系统的位置和大小。虽然边界矩形的原点通常被设置为(0,0),但这并不是必须的。center属性包含边框矩形的中心点。即:frame描述的是在其父视图中的CGRect,而bounds描述的是在其自身视图中的CGRect。//frame定义了UILable在父视图中的坐标为(100,100)letlable=UILabel(frame:CGRect(x:100,y:100,width:100,height:100))/**获取手机屏幕宽度和高度*/letdeviceW=UIScreen.main.bounds.size.widthletdeviceH=UIScreen.main.bounds.size.height如果还不明白,可以看下图理解:PS:来源于斯坦福的iOS课程截图UIColor与CGColorUIColor是UIKit中存储颜色信息的一个重要的类,一个UIColor对象包含了颜色和透明度的值。同时,UIColor包含了一些类方法用于创建一些最常见的颜色,如白色,黑色。classUIColor:NSObjectextensionUIColor{//在浅色背景上显示文本的系统颜色。openclassvarlightText:UIColor{get}//在深色背景上显示文本的系统颜色。openclassvardarkText:UIColor{get}//分组表的背景的系统颜色。openclassvargroupTableViewBackground:UIColor{get}}openclassUIColor:NSObject,NSSecureCoding,NSCopying{//常见的颜色快捷方式openclassvarblack:UIColor{get}//0.0whiteopenclassvardarkGray:UIColor{get}//0.333whiteopenclassvarlightGray:UIColor{get}//0.667whiteopenclassvarwhite:UIColor{get}//1.0whiteopenclassvargray:UIColor{get}//0.5whiteopenclassvarred:UIColor{get}//1.0,0.0,0.0RGBopenclassvargreen:UIColor{get}//0.0,1.0,0.0RGBopenclassvarblue:UIColor{get}//0.0,0.0,1.0RGBopenclassvarcyan:UIColor{get}//0.0,1.0,1.0RGBopenclassvaryellow:UIColor{get}//1.0,1.0,0.0RGBopenclassvarmagenta:UIColor{get}//1.0,0.0,1.0RGBopenclassvarorange:UIColor{get}//1.0,0.5,0.0RGBopenclassvarpurple:UIColor{get}//0.5,0.0,0.5RGBopenclassvarbrown:UIColor{get}//0.6,0.4,0.2RGBopenclassvarclear:UIColor{get}//0.0white,0.0alpha}创建RGBA颜色://red:/**Theredvalueofthecolorobject.OnapplicationslinkedforiOS10orlater,thecolorisspecifiedinanextendedcolorspace,andtheinputvalueisneverclamped.OnearlierversionsofiOS,redvaluesbelow0.0areinterpretedas0.0,andvaluesabove1.0areinterpretedas1.0.*/UIColor(red:<CGFloat>,green:<CGFloat>,blue:<CGFloat>,alpha:<CGFloat>)即:red的值在0.0-1.0之间,和我们正常使用的有些区别,一般使用时,可以简单的封装下:extensionUIColor{//Methodreturnsacustomcolorstaticfuncrgba(red:CGFloat,green:CGFloat,blue:CGFloat,alpha:CGFloat)->UIColor{return.init(red:blue/255,green:green/255,blue:blue/255,alpha:alpha)}}//使用lable.textColor=UIColor.rgba(red:40,green:196,blue:124,alpha:1.0)如何使用16进制创建颜色?使用rgba时,还有有些不方便,如何直接使用16进制颜色呢?同样需要简单扩展一下:https://stackoverflow.com/questions/1560081/how-can-i-create-a-uicolor-from-a-hex-stringCGColor主要用于CoreGaphics框架之中。CGColor主要由CGColorSapce和ColorComponents两个部分组成,同样的颜色组成,如果颜色空间不同的话,解析出来的结果可能会有所不同。classCGColorextensionCGColor{@available(iOS2.0,*)public/*notinherited*/init?(colorSpacespace:CGColorSpace,components:UnsafePointer<CGFloat>)@available(iOS13.0,*)publicinit(genericGrayGamma2_2Graygray:CGFloat,alpha:CGFloat)@available(iOS13.0,*)publicinit(srgbRedred:CGFloat,green:CGFloat,blue:CGFloat,alpha:CGFloat)@available(iOS2.0,*)public/*notinherited*/init?(patternSpacespace:CGColorSpace,pattern:CGPattern,components:UnsafePointer<CGFloat>)}UIColor与CGColor转换//toCGColorUIColor.lightGray.cgColorUIFont与CGFont定义:UIFontprovidesyouwithaccesstothefont’scharacteristicsandalsoprovidesthesystemwithaccesstothefont’sglyphinformation,whichisusedduringlayout.Youusefontobjectsbypassingthemtomethodsthatacceptthemasaparameter.Youdonotcreatefontobjectsusingtheallocandinitmethods.Instead,youuseclassmethodsofUIFont,suchaspreferredFont(forTextStyle:),tolookupandretrievethedesiredfontobject.Thesemethodscheckforanexistingfontobjectwiththespecifiedcharacteristicsandreturnitifitexists.Otherwise,theycreateanewfontobjectbasedonthedesiredfontcharacteristics.Fontobjectsareimmutableandsoitissafetousethemfrommultiplethreadsinyourapp.classUIFont:NSObjectUIFont提供了访问字体特征的权限,同时也为系统提供了字体字形信息的权限。要使用字体对象,可以将这些字体特征和信息传递给方法(UIFont、preferredFont)作为参数即可。创建系统字体//获取指定尺寸的系统标准字体openclassfuncsystemFont(ofSizefontSize:CGFloat)->UIFont//获取指定尺寸的系统粗体openclassfuncboldSystemFont(ofSizefontSize:CGFloat)->UIFont//获取指定尺寸的系统斜体openclassfuncitalicSystemFont(ofSizefontSize:CGFloat)->UIFont//获取指定尺寸的系统标准字体,并设置UIFont.Weight@available(iOS8.2,*)openclassfuncsystemFont(ofSizefontSize:CGFloat,weight:UIFont.Weight)->UIFont示例代码如下:letlabel=UILabel(frame:CGRect(x:100,y:100,width:400,height:20));label.text=font.fontName;//使用系统标准字体,大小为18label.font=UIFont.systemFont(ofSize:18);view.addSubview(label);UIFont.Weight的定义如下:extensionUIFont.Weight{@available(iOS8.2,*)publicstaticletultraLight:UIFont.Weight@available(iOS8.2,*)publicstaticletthin:UIFont.Weight@available(iOS8.2,*)publicstaticletlight:UIFont.Weight@available(iOS8.2,*)publicstaticletregular:UIFont.Weight@available(iOS8.2,*)publicstaticletmedium:UIFont.Weight@available(iOS8.2,*)publicstaticletsemibold:UIFont.Weight@available(iOS8.2,*)publicstaticletbold:UIFont.Weight@available(iOS8.2,*)publicstaticletheavy:UIFont.Weight@available(iOS8.2,*)publicstaticletblack:UIFont.Weight}获取可用的字体名称//ReturnsanarrayoffontfamilynamesforallinstalledfontsopenclassvarfamilyNames:[String]{get}//ReturnsanarrayoffontnamesforthespecifiedfamilynameopenclassfuncfontNames(forFamilyNamefamilyName:String)->[String]例如通过以上方法可以打印系统所有字体和样式:funcgetAllSystemFonts(){//map接收一个闭包,返回一个数组UIFont.familyNames.map{UIFont.fontNames(forFamilyName:$0);}.forEach{(fonts:[String])infonts.forEach({print($0);})};}指定系统字体和大小//设置字体,同时设置大小label.font=UIFont(name:"BobzType",size:14)创建偏好字体//Returnsaninstanceofthefontassociatedwiththetextstyleandscaledappropriatelyfortheuser'sselectedcontentsizecategory.SeeUIFontDescriptor.hforthecompletelist.//根据用户设定的字体大小及粗细设置字体@available(iOS7.0,*)openclassfuncpreferredFont(forTextStylestyle:UIFont.TextStyle)->UIFont//Returnsaninstanceofthefontassociatedwiththetextstyleandscaledappropriatelyforthecontentsizecategorydefinedinthetraitcollection.//根据系统的用户偏好设置及设备的SizeClass创建字体@available(iOS10.0,*)openclassfuncpreferredFont(forTextStylestyle:UIFont.TextStyle,compatibleWithtraitCollection:UITraitCollection?)->UIFontTextStyle的样式如下:extensionUIFont.TextStyle{@available(iOS11.0,*)publicstaticletlargeTitle:UIFont.TextStyle@available(iOS9.0,*)publicstaticlettitle1:UIFont.TextStyle@available(iOS9.0,*)publicstaticlettitle2:UIFont.TextStyle@available(iOS9.0,*)publicstaticlettitle3:UIFont.TextStyle@available(iOS7.0,*)publicstaticletheadline:UIFont.TextStyle@available(iOS7.0,*)publicstaticletsubheadline:UIFont.TextStyle@available(iOS7.0,*)publicstaticletbody:UIFont.TextStyle@available(iOS9.0,*)publicstaticletcallout:UIFont.TextStyle@available(iOS7.0,*)publicstaticletfootnote:UIFont.TextStyle@available(iOS7.0,*)publicstaticletcaption1:UIFont.TextStyle@available(iOS7.0,*)publicstaticletcaption2:UIFont.TextStyle}示例代码如下:letlabel1=UILabel(frame:CGRect(x:10,y:200,width:400,height:50));label1.text="preferredFont";//使用title1样式设置字体//staticlettitle1:UIFont.TextStylelabel1.font=UIFont.preferredFont(forTextStyle:.title1);view.addSubview(label1);使用自定义字体iOS中可以使用自定义的字体,用法也很简单。由于用的不多,具体不再详述。CGFontCGFont属于CoreGraphics核心库。主要由于绘制文本。UIView的layerLayer属于UIView的属性。比如设置按钮的边框、圆角时都会使用到这个属性。//定义varlayer:CALayer{get}//示例button.layer.borderWidth=1button.layer.borderColor=UIColor.gray.cgColorbutton.layer.cornerRadius=10UIView之所以能显示在屏幕上,因为它内部有一个图层:CALayer。当UIView显示在屏幕上的时候,会调用drawRect方法进行绘图,会将所有的内容绘制在自己的图层上,绘制完毕后,系统会将图层拷贝到屏幕上,于是UIView就显示了出来。一个UIView只有一个layer属性,但是layer是可以叠加的,多个layer叠加在一起就构成了一个组合图像。一个UIView的layer层可含有附加的layer。CALayer可以有阴影,由shadowColor,shadowOpacity,shadowRadius和shadowOffset属性定义。CALayer可以有一个边框borderWidth,borderColor。CALayer可通过cornerRadius来设置圆角矩形。CALayer可以有一个遮罩(mask)。
2020-10-12 20:48 · Swift / UIKit / iOS
[文章] Swift快速入门之字符和字符串(6)
字符和字符串基本概念Swift的字符是一个单一的字符字符串字面量,数据类型为Character。Swift的字符串用String类型来表示。String的内容可以通过各种方法来访问到,包括作为Character值的集合。字符和字符串的声明放在双引号("")中。例如://字符串letgreeting="Hello!"//自动推断为String类型letchr1:Character="中"//字符类型Characterletchr2="Z"//如果不显示指定,自动推断为String类型//以下声明无效,非单一的字符//letchr3:Character="ABC"Swift的String类型是一种值类型。如果你创建了一个新的String值,String值在传递给方法或者函数的时候会被复制过去,还有赋值给常量或者变量的时候也是一样。每一次赋值和传递,现存的String值都会被复制一次,传递走的是拷贝而不是原本。字符串插值即在字符串字面量中直接注入一个表达式。语法是:\(value)例如:letnum1=10letnum2="\(num1)"//10letnum3="\(10+10)"//20letsum="num2+num3=\(Int(num2)!+Int(num3)!)"print(sum)//输出:num2+num3=30字符串拼接Swift可以通过+,+=或append()方法拼接字符串。varstr1="Hello"varstr2="World"varstr3=str1+""+str2print(str3)//输出:HelloWorldstr3+="!"print(str3)//输出:HelloWorld!str1.append("Swift")print(str1)//输出:HelloSwiftvarstrArr=["Hello","Swift"]varstr4=strArr.joined()print(str4)//输出:HelloSwiftvarstr5=strArr.joined(separator:"-")print(str5)//输出:Hello-Swift注意:+=和append会改变原有字符串,因此必须是可变的(即var声明的)joined默认的分隔符是空字符串。字符串比较ifstr5.isEmpty{print("st5isEmpty")}else{print("st5isnotEmpty")}//输出:st5isnotEmptyletresult=str5.isEmpty?"str5isempty":str5print(result)//输出:Hello-Swift"abc"=="abc""abc"=="ABC""abc"=="efg"//true//false//false字符串字符遍历可以通过for-in循环遍历String中的每一个独立的Character值:forcharacterin"Swift"{print(character)}//S//w//i//f//t分割字符串为数组letstrToArr="helloswift"letafterStrToStr1=strToArr.components(separatedBy:"")//["hello","swift"]print(afterStrToStr1)字符串转换为数字类型Int("100")//100Int("abc")//nil,若无法转换,则返回nil字符统计和索引要在字符串中取回Character值的总数,使用字符串的count属性。每一个String值都有相关的索引类型,String.Index,它相当于每个Character在字符串中的位置。//字符统计print("HelloSwift".count)//11//字符索引letstartIndex="Hello".startIndexletendIndex="Hello".endIndex//Hello'sstartIndex:Index(_rawBits:1),andendIndexIndex(_rawBits:327681)print("Hello'sstartIndex:\(startIndex),andendIndex\(endIndex)")print("Hello"[startIndex])//H//使用indices属性来访问字符串中每个字符的索引。forindexin"Hello".indices{//Helloprint("\("Hello"[index])",terminator:"")}插入和删除要给字符串的特定索引位置插入字符,使用insert(_:at:)方法。要插入另一个字符串的内容到特定的索引,使用insert(contentsOf:at:)方法。要从字符串的特定索引位置移除字符,使用remove(at:)方法。要移除一小段特定范围的字符串,使用removeSubrange(_:)方法。varwelcome="hello"welcome.insert("!",at:welcome.endIndex)//welcomenowequals"hello!"welcome.insert(contentsOf:"there",at:welcome.index(before:welcome.endIndex))//welcomenowequals"hellothere!"welcome.remove(at:welcome.index(before:welcome.endIndex))//welcomenowequals"hellothere"letrange=welcome.index(welcome.endIndex,offsetBy:-6)..<welcome.endIndexwelcome.removeSubrange(range)//welcomenowequals"hello"其他常用方法//判断是否以指定字符串开头或结尾"helloworld".hasPrefix("hello")//true"helloworld".hasSuffix("world")//true//字符串翻转,字符串本质就是字符的数组,可以直接调用reversed()方法letstrA="tfiwsolleh"varreversedStr=String(strA.reversed())print(reversedStr)//输出:helloswiftletstrWithSpace="HelloSwift\n"//删除空白字符和换行print(strWithSpace.trimmingCharacters(in:.whitespacesAndNewlines))//删除空白字符print(strWithSpace.trimmingCharacters(in:.whitespaces))//删除换行字符print(strWithSpace.trimmingCharacters(in:.newlines))//大小写转换letabcd="heLLoSwift"letuppercaseStr=abcd.uppercased()//"HELLOSWIFT"letlowercaseStr=abcd.lowercased()//"helloswift"letcapitalizedStr=abcd.capitalized//HelloSwift
2020-10-25 22:28 · Swift / iOS
[问答] Android修改AOSP中的framework某些代码之后如何快速编译刷机

比如我修改了android-5.1.0_r3\frameworks\base\location中某个类的代码,怎么快速编译我修改过的地方,然后刷入手机呢,我现在每次修改都全量编译,我快疯了。

2022-10-18 20:53 · AOSP / framework / Android
[文章] C语言入门(7)
参考一维数组(C语言入门(7))本期内容就到这里,谢谢
2020-03-14 15:40 · 一维数组 / C语言入门 / 增删查改
[文章] 10分钟快速搭建个人博客
10分钟快速搭建个人博客本方案采用docker+typecho进行快速搭建演示环境:centos7镜像构建与运行创建或进入一个目录,下载源文件mkdirbuildgitclonehttps://github.com
2022-07-24 00:56 · 建站 / 博客 / docker / typecho
[文章] 搭建React脚手架快速创建React项目
2、在指定文件夹下快速创建React项目首先在自己想创建项目文件夹的目录之下按住shift+鼠标右键打开WindowsPowerShell,不打开这个也可以,直接在该目录之下输入cmd,就可以进入到当前目录下的了
1970-01-01 00:00 · React / 项目创建 / npm
[文章] 产品快速迭代Git分支管理方法
前言该方案主要用于解决产品快速迭代开发问题,着重处理开发过程中老版本BUG修复和新版本发布冲突问题。该案面向对Git工具有一定了解的人员。
2020-03-28 10:57 · Git
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6