第一篇:好程序员学习笔记-IOS 利用core text对文字进行排版
core text 这个包默认是没有的,要自己手动添加进来。在IOS中利用core text对文本进行排版的几个关键点如下: 字间距:kCTKernAttributeName
行间距:kCTParagraphStyleSpecifierLineSpacingAdjustment kCTParagraphStyleSpecifierLineSpacing(不推荐使用)
段间距:kCTParagraphStyleSpecifierParagraphSpacing
文本对齐方式:kCTParagraphStyleSpecifierAlignment;还有一点就是core text显示出来的字是颠倒的,使用时要翻转下: CGContextRef context = UIGraphicsGetCurrentContext();CGContextSetTextMatrix(context,CGAffineTransformIdentity);CGContextTranslateCTM(context,0,self.bounds.size.height);CGContextScaleCTM(context,1.0,-1.0);最后一点要注意的是Mac下的回车和Windows的是不一样的,Windows下的回车是由r n组成的而Mac下只有一个n,所以如果没有去掉的话在每一段的最后都会多出一个空行来,去掉的方法如下:
NSString *myString = [labelString stringByReplacingOccurrencesOfString “rn” withString “n”];具体的代码实现如下: importimport importimport @interface TextLayoutLabel : UILabel { @private [size=1em] [color=white!important][size=1em]? long linesSpacing_;//行间距 } @property(nonatomic,assign)CGFloat characterSpacing;@propery(nonatomic,assign)long linesSpacing;@end import “TextLayoutLabel.h”import @implementation TextLayoutLabel @synthesize characterSpacing = characterSpacing_;@synthesize linesSpacing = linesSpacing_;-(id)initWithFrame CGRect)frame {//初始化字间距、行间距
if(self =[super initWithFrame:frame]){ self.characterSpacing = 2.0f;self.linesSpacing = 5.0f;}
或 return self;}-(void)setCharacterSpacing CGFloat)characterSpacing //外部调用设置字间距 { characterSpacing_ = characterSpacing;[self setNeedsDisplay];}-(void)setLinesSpacing long)linesSpacing //外部调用设置行间距 { linesSpacing_ = linesSpacing;[self setNeedsDisplay];}-(void)drawTextInRect CGRect)requestedRect { //去掉空行
NSString *labelString = self.text;NSString *myString = [labelString stringByReplacingOccurrencesOfString “rn” withString:“n”];//创建AttributeString NSMutableAttributedString *string =[[NSMutableAttributedString alloc]initWithString:self.text];//设置字体及大小 CTFontRef helveticaBold = CTFontCreateWithName((CFStringRef)self.font.fontName,self.font.pointSize,NULL);[string addAttribute id)kCTFontAttributeName value id)helveticaBold range:NSMakeRange(0,[string length])];//设置字间距
if(self.characterSpacing){ long number = self.characterSpacing;CFNumberRef num = CFNumberCreate(kCFAllocatorDefault,kCFNumberSInt8Type,&number);[string addAttribute id)kCTkernAttributeName value id)num rang:NSMakeRange(0,[string length])];CFRelease(num);} //设置字体颜色
[string addAttribute id)kCTForegroundColorAttributeName value id)(self.textColor.CGColor)range:NSMakeRange(0,[string length])];//创建文本对齐方式
CTTextAlignment alignment = kCTLeftTextAlignment;if(self.textAlignment == UITextAlignmentCenter){ alignment = kCTCenterTextAlignment;} if(self.textAlignment == UITextAlignmentRight){ alignment = kCTRightTextAlignment;} CTParagraphStyleSetting alignmentStyle;alignmentStyle.spec = kCTParagraphStyleSpecifierAlignment;alignmentStyle.valueSize = sizeof(alignment);alignmentStyle.value = &alignment;//设置文本行间距
CGFloat lineSpace = self.linesSpacing;CTParagraphStyleSetting lineSpaceStyle;lineSpaceStyle.spec = kCTparagraphStyleSpecifierLineSpacingAdjustment;lineSpaceStyle.valueSize = sizeof(lineSpace);lineSpaceStyle.value =&lineSpace;//设置文本段间距
CGFloat paragraphSpacing = 5.0;CTparagraphStyleSetting paragraphSpaceStyle;paragraphSpaceStyle.spec = kCTparagraphStyleSpecifierParagraphSpacing;paragraphSpaceStyle.valueSize = sizeof(CGFloat);paragraphSpaceStyle.value = ¶graphSpacing;//创建设置数组
CTParagraphStyleSetting settings[ ] ={alignmentStyle,lineSpaceStyle,paragraphSpaceStyle};CTParagraphStyleRef style = CTParagraphStyleCreate(settings ,3);//给文本添加设置
[string addAttribute:(id)kCTParagraphStyleAttributeName value:(id)style range:NSMakeRange(0 , [string length])];//排版
CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((CFAttributedStringRef)string);CGMutablePathRef leftColumnPath = CGPathCreateMutable();CGPathAddRect(leftColumnPath, NULL ,CGRectMake(0 , 0 ,self.bounds.size.width , self.bounds.size.height));CTFrameRef leftFrame = CTFramesetterCreateFrame(framesetter,CFRangeMake(0, 0), leftColumnPath , NULL);//翻转坐标系统(文本原来是倒的要翻转下)
CGContextRef context = UIGraphicsGetCurrentContext();CGContextSetTextMatrix(context , CGAffineTransformIdentity);CGContextTranslateCTM(context , 0 ,self.bounds.size.height);CGContextScaleCTM(context, 1.0 ,-1.0);//画出文本
CTFrameDraw(leftFrame,context);//释放
CGPathRelease(leftColumnPath);CFReleale(framesetter);CFRelease(helveticaBold);[string release];UIGraphicsPushContext(context);}
第二篇:好程序员学习笔记-Java网络
1、网络基础知识
2、JAVA网络编程网络与分布式集群系统的区别:每个节点都是一台计算机,而不是各种计算机内部的功能设备。Ip:具有全球唯一性,相对于internet,IP为逻辑地址。端口(port):一台PC中可以有65536个端口,进程通过端口交换数据。连线的时候需要输入IP也需要输入端口信息。计算机通信实际上的主机之间的进程通信,进程的通信就需要在端口进行联系。192.168.0.23:21协议:为了进行网络中的数据交换(通信)而建立的规则、标准或约定。不同层的协议是不同的。网络层:寻址、路由(指如何到达地址的过程)传输层:端口连接TCP模型:应用层/传输层/网络层/网络接口端口是一种抽象的软件结构,与协议相关:TCP23端口和UDT23端口为两个不同的概念。端口应该用1024以上的端口,以下的端口都已经设定功能。套接字(socket)的引入:
Ip+Port=Socket(这是个对象的概念。)Socket为传输层概念,而JSP是对应用层编程。例: java.net.*;(Server端定义顺序)ServerSocket(intport)Socket.accept();//阻塞方法,当客户端发出请求是就恢复 如果客户端收到请求: 则Socket SI=ss.accept();注意客户端和服务器的Socket为两个不同的socket。Socket的两个方法:getInputStream():客户端用getOutputStream()服务器端用使用完毕后切记Socket.close(),两个Socket都关,而且不用关内部的流。在client
端,Socket s=new Socket(“127.0.0.1”,8000);127.0.0.1为一个默认本机的地址。
练习:
1、客户端向服务器发出一个字符串,服务器转换成大写传回客户端。大写的函数:String.toUpperCase()
2、服务器告诉客户端:“自开机以来你是第n 个用户”。12.12UDP编程:DatagramSocket(邮递员):对应数据报的Socket概念,不需要创建两个socket,不可使用输入输出流。DatagramPacket(信件):数据包,是UDP下进行传输数据的单位,数据存放在字节数组中。UDP也需要现有Server端,然后再有Client端。两端都是DatagramPacket(相当于电话的概念),需要NEW两个DatagramPacket。InetAddress:网址这种信息传输方式相当于传真,信息打包,在接受端准备纸。模式:发送端:Server:DatagramPacketinDataPacket=new DatagramPacket((msg,msg.length);InetAdress.getByName(ip),port);接收端:clientAddress=inDataPack.getAddress();//取得地址 clientPort=inDataPack.getPort();//
datagramSocket.send;//Server
datagramSocket.accept;//Client URL:
在应用层的编程 注意比较:
http://Localhost:8080/directory//查找网络服务器的目录 file://directory//查找本地的文件系统 java的开发主要以http为基础。反射:主要用于工具和框架的开发。反射是对取得端口号
于类的再抽象;通过字符串来抽象类。JAVA类的运行:classLoader:加载到虚拟机(vm)Vm中只能存储对象(动态运行时的概念),.class文件加载到VM上就成为一个对象,同时初始静态成员及静态代码(只执行一次)。
Lang包下有一个类为Class:在反射中使用。此类中的每个对象为VM中的类对象,每个类都对应类类的一个对象(class.class)。例:对于一个Object类,用getClass()得到其类的对象,获得类的对象就相当于获得类的信息,可以调用其下的所有方法,包括类的私有方法。注意:在反射中没有简单数据类型,所有的编译时类型都是对象。反射把编译时应该解决的问题留到了运行时。
第三篇:【好程序员学习笔记】C语言 编译预处理命令
文件包含:
把指定的文件插入到预处理命令行所在的位置并取代该命令行,即把指定的文件和当前的源程序文件连接成一个源文件。#include<文件名>
在文件包含目录中去查找指定的文件,并将该文件添加到源文件中。一个被包含的文件中可以含有文件包含命令来包含另一个文件。#include“文件名”
命令中文件名的位置是当前源文件的位置,若在当前目录中未找到该文件,则再到“包含目录”中去查找。
宏
用一个标识符表示一个字符串,称为宏,被定义为宏的标识符称为宏名。在编译预处理时对程序中所有出现的宏名用宏定义中的字符串去代换,这就是宏替换。它是由系统编译程序时自动完成的。
无参宏定义
#define 标识符 字符串 如
#define PI 3.14 使用宏时要注意:
(1)宏定义是用宏名来表示一个字符串,在宏展开时用字符串取代宏名。
2)宏定义不是变量定义或语句,在行末不能加分号,如果加上分号则分号也成为字符串的一部分。
(3)宏定义可以出现在程序的任何地方,其作用域是宏定义命令所在位置开始到源程序结束。如果要终止其作用域可使用#undef命令。
(4)宏定义允许嵌套,在宏定义的字符串中可以使用已经定义的宏名。在宏展开时将逐层替换。
(5)#define PI 3.1415926 #define AREA PI*y*y 有参宏定义
#define 宏名(形参表)字符串
对带参数的宏,在调用中不仅要进行宏展开,而且还要用实参去替换形参。带参宏调用的语法格式如下: 宏名(实参表); #define M(x)x+1 K=M(3);K=3+1 定义有参宏时要注意以下几点:
(1)有参宏定义中,宏名和形参表之间不能有空格出现。
(2)在函数中,调用时要把实参的值赋给形参,进行“值传递”。而在带参宏调用中,只是符号替换,不存在值传递问题。
(3)宏定义中的形参只能是标识符,而宏调用中的实参可以是表达式。
字符串内的形参通常用括号括起来以避免出错。
在使用宏时不仅要将形式参数用括号括起来,还应将其整体用括号括起来。#define S(y)((y)*(y))条件编译
条件编译可以按不同的条件去编译不同的程序段。1#ifdef #ifdef 标识符 程序段1 #else 程序段2 #endif 功能:如果标识符已被#define定义过,则对程序段1进行编译,否则对程序段2进行编译。格式中的#else部分可以没有,即: #ifdef 标识符
程序段 #endif
2、#ifndef 语法格式如下: #ifndef 标识符 程序段1
#else 程序段2 #endif 功能与ifdef形式的功能正好相反。
3、#if 常量表达式 #if 常量表达式 程序段1 #else 程序段2 #endif 功能:如果常量表达式的值为真(非0),则对程序段1进行编译,否则对程序段2进行编译,因此可以使程序在不同条件下,完成不同的功能。
上面介绍的条件编译实现的逻辑也可以用条件语句来实现,但是用条件语句将会对整个源程序进行编译,生成的目标代码程序较长,运行时间也较长,采用条件编译则根据条件只编译其中的程序段1或程序段2,生成的目标程序较短。