微博iphone客户端连接socket需要什么客户端

android网游开发之socket的容易设计和实现_InstallSheild 打包软件ODBC的有关问题_iPhone开发中的技能整理__脚本百事通
稍等,加载中……
^_^请注意,有可能下面的2篇文章才是您想要的内容:
android网游开发之socket的容易设计和实现
InstallSheild 打包软件ODBC的有关问题
iPhone开发中的技能整理
android网游开发之socket的容易设计和实现
android网游开发之socket的简单设计和实现对于普通应用的网络模块一般使用http文本协议,在android开发中使用http协议比较简单,sdk已经做了很好的封装了,具体使用方法可以参考我的这篇博文。而在游戏开发中,可以结合使用http和socket,当然了http协议底层也是基于tcp协议的。http协议是无连接、无状态的,每次连接只能处理一个请求,然后就断了,而且发一个请求需要附加额外信息(请求行、请求头),每次请求都需要重新建立连接;使用socket的好处是更高效和省流量,建立一次连接后,只要不手动或者出现异常断开,就可以一直互相发送数据,而且是直接以字节的形式发送,不需要额外的附加信息,缺点就是难度加大了,需要服务端和客户端很好的配合,保证发送和读取时数据的顺序一致。本文通过一个简单的demo介绍开发android网游时socket的使用方法,主要包括:android客户端和一个简单的使用java实现的server端,实现客户端和服务端互相发送数据的功能。1.客户端代码实现首先创建一个Android应用,名称:AndroidSocketTest然后分别创建4个文件:BytesUtil.java、BytesReader.java、BytesWriter.java、TCPCommunication.java,下面分别介绍这几个文件的用处和源码:BytesUtil.java:包含了一些静态工具方法:基本类型和字节数组的相互转换,字符串和字节数组的相互转换,字节数组的赋值和大小重置,对输入流进行读取保存等。比较简单,下面直接看源码:/**
author:alexzhou
public final class BytesUtil {
*整型转换成字节数组
* @param value 要转换的整型值
public static byte[] shortToBytes(int value) {
byte []write = new byte[2];
write[0] = (byte)( (value &&& 8) & 0xFF);
write[1] = (byte)( (value &&& 0) & 0xFF);
public static byte[] intToBytes(int value) {
byte []write = new byte[4];
write[0] = (byte)( (value &&& 24) & 0xFF);
write[1] = (byte)( (value &&& 16) & 0xFF);
write[2] = (byte)( (value &&& 8) & 0xFF);
write[3] = (byte)( (value &&& 0) & 0xFF);
public static byte[] longToBytes(long value) {
byte []write = new byte[8];
write[0] = (byte)( (value &&& 56) & 0xFF);
write[1] = (byte)( (value &&& 48) & 0xFF);
write[2] = (byte)( (value &&& 40) & 0xFF);
write[3] = (byte)( (value &&& 32) & 0xFF);
write[4] = (byte)( (value &&& 24) & 0xFF);
write[5] = (byte)( (value &&& 16) & 0xFF);
write[6] = (byte)( (value &&& 8) & 0xFF);
write[7] = (byte)( (value &&& 0) & 0xFF);
* 字节数组转换成整型
* @param value
public static int bytesToInt(byte []value) {
int i1 = (value[0] & 0xFF) && 24;
int i2 = (value[1] & 0xFF) && 16;
int i3 = (value[2] & 0xFF) && 8;
int i4 = (value[3] & 0xFF) && 0;
return (i1 | i2 | i3 | i4);
public static short bytesToShort(byte[] value) {
int s1 = (value[0] & 0xFF) && 8;
int s2 = (value[1] & 0xFF) && 0;
return (short)(s1 | s2);
public static long bytesToLong(byte[] value) {
long L1 = (value[0] & 0xFF) && 56;
long L2 = (value[1] & 0xFF) && 48;
long L3 = (value[2] & 0xFF) && 40;
long L4 = (value[3] & 0xFF) && 32;
long L5 = (value[4] & 0xFF) && 24;
long L6 = (value[5] & 0xFF) && 16;
long L7 = (value[6] & 0xFF) && 8;
long L8 = (value[7] & 0xFF) && 0;
return (L1 | L2 | L3 | L4 | L5 | L6 | L7 | L8);
* 从指定字节数组中拷贝部分数据
* @param origin
* @param from
* @param to
public static byte[] copyBytes(byte[] origin,int from,int to) {
int len = to -
if(len & 0 || origin.length - from &= 0) {
throw new IllegalArgumentException("copyBytes-&error arguments:to="+to+",from="+from);
byte[] ret = new byte[len];
if(len == 0)
System.arraycopy(origin, from, ret, 0, Math.min(len, origin.length - from));
* 重置字节数组的大小,然后把原内容复制到新的字节数组中
* @param origin
* @param newSize
public static byte[] resizeBytes(byte[] origin,int newSize) {
if(newSize & 0) {
throw new IllegalArgumentException("resizeBytes-&newSize must &= 0");
byte[] ret = new byte[newSize];
if(newSize == 0)
System.arraycopy(origin,0,ret,0,Math.min(origin.length, newSize));
* 读取输入流中字节,并保存到指定的字节数组中
* @param is
* @param data
* @param off
* @param len
public static void readData(InputStream is, byte data[], int off, int len) {
int hasRead = 0;
final int BUFFER = 1024;
while(hasRead & len) {
int remain = len - hasR
int count = is.read(data, off + hasRead, remain & BUFFER ? BUFFER : remain);
if(count & 0) throw new IOException("readData-&read data error");
hasRead +=
} catch (IOException e) {
e.printStackTrace();
BytesReader.java:从服务端接收数据时使用,定义了一个字节数组类型的成员变量,用来保存从输入流中读取的数据。封装了一些从该字节数组中读取相应数据类型的函数,源码如下:/**
* 接受服务端数据时,读取字节并转换到相应类型
author:alexzhou
public final class BytesReader {
private final byte []
//字节数组的大小
//当前读取的位置
public BytesReader(byte []data) {
this.data =
this.size = data.
this.position = 0;
public byte[] read(int len) {
if(len & 0)
byte[] value = BytesUtil.copyBytes(data, position, position + len);
this.position +=
public int getSize() {
public boolean isAvailable() {
return size - position & 0;
public short readShort() {
byte[] value = read(2);
return BytesUtil.bytesToShort(value);
public int readInt() {
byte[] value = read(4);
return BytesUtil.bytesToInt(value);
public long readLong() {
byte[] value = read(8);
return BytesUtil.bytesToLong(value);
public byte readByte() {
int value = this.isAvailable() ? (0xFF & data[position++]) : -1;
return (byte)
public byte[] readBytes() {
int len = readShort();
//读取大数据
if(len &= 0xFFFF) {
len = this.readInt();
return len == 0 ? null : read(len);
public String readUTF() {
byte[] bytes = readBytes();
if(null != bytes) {
return new String(bytes,"UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
BytesWriter.java:向服务端发送数据时使用,跟BytesReader.java对应,也是把需要发送的数据保存到字节数组中,然后一次性发送给服务器。源码如下:/**
author:alexzhou
public final class BytesWriter {
private byte[]
public BytesWriter() {
public BytesWriter(int size) {
this.data = new byte[size];
public byte[] getBytes() {
return this.data.length == count ? data : count == 0 ? null : BytesUtil.resizeBytes(this.data, count);
public void write(byte[] value) {
this.write(value, 0, value == null ? 0 : value.length);
public void write(byte[] d, int offset, int len) {
if(d == null || len == 0)
int newCount = count +
if(newCount & this.data.length) {
int newSize = Math.max(this.data.length && 1, newCount);
this.data = BytesUtil.resizeBytes(this.data, newSize);
System.arraycopy(d, offset, this.data, this.count, len);
this.count = newC
public void writeInt(int value) {
this.write(BytesUtil.intToBytes(value));
public void writeShort(int value) {
this.write(BytesUtil.shortToBytes(value));
public void writeLong(long value) {
this.write(BytesUtil.longToBytes(value));
public void writeByte(byte value) {
int newCount = count + 1;
if(newCount & this.data.length) {
int newSize = Math.max(this.data.length && 1, newCount);
this.data = BytesUtil.resizeBytes(this.data, newSize);
this.data[count] =
this.count = newC
public void writeBytes(byte[] value) {
int length = (value == null ? 0 : value.length);
//发送大数据时
if(length &= 0xFFFF) {
this.writeShort(0xFFFF);
this.writeInt(length);
//告诉服务端发送的数据的大小
this.writeShort(length);
this.write(value);
public void writeUTF(String value) {
if(value == null || value.length() == 0) {
this.writeShort(0);
byte[] bytes =
bytes = value.getBytes("UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
this.writeBytes(bytes);
TCPCommunication.java:上面的三个类都是辅助工具类,是给它使用的,它负责socket的创建和连接服务器、读取和发送数据,以及通过Handler发送消息给UI线程更新界面显示数据。由于我们的目的是使用socket通信,所以去掉了很多代码,这里只是简单的建立一次连接,发送和接收完数据后就关闭连接了。源码如下:public class TCPCommunication implements Runnable {
private Socket mS
private DataInputStream mD
private DataOutputStream mD
private Handler mH
private volatile boolean isRunning =
public TCPCommunication(Handler handler) {
this.mHandler =
public boolean isRunning() {
return isR
public void startWork() {
Thread t = new Thread(this);
t.setPriority(Thread.MAX_PRIORITY);
t.start();
public void stopWork() {
this.isRunning =
public void run() {
mSocket = new Socket("10.0.2.2",8888);
mDis = new DataInputStream(mSocket.getInputStream());
mDos = new DataOutputStream(mSocket.getOutputStream());
//开始发送数据到服务端
BytesWriter bw = new BytesWriter();
String username = "alexzhou";
String password = "123456";
int flag1 = 12345;
short flag2 = 12;
long flag3 = L;
bw.writeUTF(username);
bw.writeUTF(password);
bw.writeInt(flag1);
bw.writeShort(flag2);
bw.writeLong(flag3);
byte[] data = bw.getBytes();
BytesWriter out =
if(data.length &= 0xFFFF) {
out = new BytesWriter(data.length + 6);
out.writeShort(0xFFFF);
out.writeInt(data.length);
out = new BytesWriter(data.length + 2);
out.writeShort(data.length);
out.write(data);
mDos.write(out.getBytes());
//开始从服务端接收数据
int len = mDis.readShort();
if(len == 0xFFFF) {
len = mDis.readInt();
byte[] inputData = new byte[len];
BytesUtil.readData(mDis, inputData, 0, len);
BytesReader br = new BytesReader(inputData);
String user_id = br.readUTF();
String recv_username = br.readUTF();
String nickname = br.readUTF();
int i = br.readInt();
short s = br.readShort();
long l = br.readLong();
String result = "登录成功~您的信息如下\n id:"+user_id + "\n用户名:" + recv_username + "\n昵称:" + nickname + "\n 序列号:" + i + "-" + s + "-" +
Message msg = mHandler.obtainMessage();
msg.what = 0;
mHandler.sendMessage(msg);
mDis.close();
mDos.close();
mSocket.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
MainActivty.java的代码比较简单,源码:public class MainActivity extends Activity {
private TextView mTextV
private Button mB
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextView = (TextView)this.findViewById(R.id.text);
mButton = (Button)this.findViewById(R.id.button_send);
mButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
new TCPCommunication(mHandler).startWork();
private Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
String result = (String)msg.
mTextView.setText(result);
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
到此为止,Android客户端的代码已经全部完成了,记得给应用添加访问网络的权限哦:在配置文件中添加&uses-permission android:name="android.permission.INTERNET" /&
2.服务端代码实现服务端的代码比较简单,当然了,一般在实际的开发中,服务端和客户端不是同一个人写的,这里我就把客户端里的那几个工具类拿来直接用了。创建一个java项目,然后把BytesReader.java、BytesWriter.java、BytesUtil.java三个文件拷贝到项目的包下,然后创建Server.java,功能比较简单,监听8888端口,然后等待客户端连接,接收和发送数据。源码如下:/**
author:alexzhou
public final class Server implements Runnable{
private ServerSocket mServerS
private Socket mC
private DataInputStream mD
private DataOutputStream mD
private boolean isRunning =
public void start() {
this.isRunning =
Thread t = new Thread(this);
t.start();
public void stop() {
this.isRunning =
public static void main(String []args) {
new Server().start();
public void run() {
mServerSocket = new ServerSocket(8888);
System.out.println("start server");
while(isRunning) {
System.out.println("wait client connect!!");
mClient = mServerSocket.accept();
//接收客户端发送的数据
mDis = new DataInputStream(mClient.getInputStream());
//数据的长度
int len = mDis.readShort();
if(len == 0xFFFF) {
len = mDis.readInt();
System.out.println("client data size:" + len);
byte[] inputData = new byte[len];
BytesUtil.readData(mDis, inputData, 0, len);
BytesReader br = new BytesReader(inputData);
String username = br.readUTF();
String password = br.readUTF();
int i = br.readInt();
short s = br.readShort();
long l = br.readLong();
System.out.println("username:"+username+";password="+password+"Long="+l);
//向客户端发送数据
mDos = new DataOutputStream(mClient.getOutputStream());
BytesWriter bw = new BytesWriter(32);
String user_id = "123456";
String nickname = "周江海";
bw.writeUTF(user_id);
bw.writeUTF(username);
bw.writeUTF(nickname);
bw.writeInt(i);
bw.writeShort(s);
bw.writeLong(l);
byte[] data = bw.getBytes();
BytesWriter out =
if(data.length &= 0xFFFF) {
out = new BytesWriter(data.length + 6);
out.writeShort(0xFFFF);
out.writeInt(data.length);
out = new BytesWriter(data.length + 2);
out.writeShort(data.length);
out.write(data);
mDos.write(out.getBytes());
mDos.close();
mDis.close();
mClient.close();
} catch (IOException e) {
e.printStackTrace();
现在验证一下,先启动Server,然后运行Android客户端应用,屏幕中间会出现TextView和一个button,TextView的内容是HelloWorld,点击button就会发送登陆信息给服务端,然后服务端返回数据显示到TextView上。下面分别是服务端的打印消息和客户端的显示截图。
主要需要掌握基本数据类型和字符串跟字节数组的转换,然后按照指定的顺序发送。最重要的是要注意客户端和服务端从字节数组读取和往字节数组写入数据时的顺序要对应。下面是源码链接:http://download.csdn.net/detail/zhoujianghai/4751981
转载请注明来自:Alex
Zhou的程序世界,本文链接:/android/884.html
InstallSheild 打包软件ODBC的有关问题
InstallSheild 打包软件ODBC的问题我在打包一个PB做的软件时候遇到了问题。我的软件用access数据库,使用ODBC数据源。但是不知道怎么去打包软件,使得安装后能自动根据数据库的位置去创建ODBC,每次我创建的数据库位置都错误,大概是我在ODBC里面选择的ODBC是一个固定路径吧。有没有人能告诉我。我用的是InstallShield 12。另外,打包的软件卸载后,在PB里面看不见ODBC了。------解决方案--------------------
一种方式是用is,这个不熟悉。。另一种方法是在程序中写注册代码自动注册数据源,odbc//获取程序所在目录String ls_curdir
//ls_curdir=Space(256)
////为字符缓冲区开辟内存空间
//GetCurrentDirectoryA(256,ls_curdir)
ls_curdir = GetCurrentDirectory()gs_path = ls_curdirstring ls_obRegistryget("HKEY_LOCAL_MACHINE\Software","ODBC", RegString!, ls_ob)
if ls_ob = '' thenregistryset("HKEY_LOCAL_MACHINE\Software\",'odbc',regstring!,'')end ifregistryset("HKEY_LOCAL_MACHINE\Software\odbc",'odbcinst.ini',regstring!,'')ulong ul_numInt Answer,Answer1,Answer2,Answer3,Answer4,Answer5,Answer6,Answer7,ansApp
string ls_driver,ls_start,ls_location,apppath,db_path,db_name,ODBCStr,ds_name,ls_dbpath//设置Adaptive Server Anywhere 8.0的驱动程序路径ls_Location =ls_curdirls_dbpath=ls_curdir+"\gjcx.db"//判断Adaptive Server Anywhere 8.0的驱动程序是否正确安装ls_Driver=ls_Location+"\dbodbc8.dll"ls_Start=ls_Location+"\dbeng8.exe"//IF Not (FileExists(ls_Driver) AND FileExists(ls_Start)) Then//MessageBox("错误!","系统中没有安装Adaptive Server Anywhere 7.0"+&//"的驱动程序,系统将终止运行!",StopSign!)//Return//End IF//设置ODBC\ODBCINST.INI\ODBC DRIVERSAnswer=RegistrySet("HKEY_LOCAL_MACHINE\Software\ODBC\ODBCINST.INI"+&"\ODBC Drivers","Adaptive Server Anywhere 8.0", RegString!, "Installed")IF Answer = -1 ThenMessageBox("错误!","应用程序无法设置ODBC\ODBCINST.INI\"+&"ODBC DRIVERS,系统将终止运行",Information!)ReturnEnd if//设置ODBC\ODBCINST.INI\Answer1=RegistrySet("HKEY_LOCAL_MACHINE\Software\ODBC\ODBCINST."+&"Adaptive Server Anywhere 8.0", "CPTimeout", RegString!, "not pooled")Answer2=RegistrySet("HKEY_LOCAL_MACHINE\Software\ODBC\ODBCINST."+&"INI\Adaptive Server Anywhere 8.0", "Driver", RegString!,ls_Driver)Answer3=RegistrySet("HKEY_LOCAL_MACHINE\Software\ODBC\ODBCINST."+&"INI\Adaptive Server Anywhere 8.0", "Setup", RegString!,ls_Driver)IF Answer1 = -1 OR Answer2 = -1 OR Answer3 = -1 ThenMessageBox("错误!","应用程序无法设置ODBC\ODBCINST.INI,"+&"系统将终止运行!",Information!)//程序中不折行ReturnEnd ifdb_path = ""+ls_dbpath+""//设置数据库路径及文件名db_name = "gjcx"
//设置数据库名称ds_name = "gjcx"
//设置ODBC数据源名//设置ODBC DATA SOURCE名称Answer=RegistrySet("HKEY_LOCAL_MACHINE\Software\ODBC\ODBC.ini\"+&"ODBC Data Sources", ds_name, RegString!, "Adaptive Server Anywhere 8.0")Answer1=RegistrySet("HKEY_LOCAL_MACHINE\Software\ODBC\ODBC.ini\"+&ds_name,"driver", Regstring!, ls_Driver)Answer2=RegistrySet("HKEY_LOCAL_MACHINE\Software\ODBC\ODBC.ini\"+&ds_name,"start", Regstring!, ls_Start)Answer3=RegistrySet("HKEY_LOCAL_MACHINE\Software\ODBC\ODBC.ini\"+&ds_name,"autostop", Regstring!, "yes")Answer4=RegistrySet("HKEY_LOCAL_MACHINE\Software\ODBC\ODBC.ini\"+&ds_name,"DataBaseFile", Regstring!, db_path)Answer5=RegistrySet("HKEY_LOCAL_MACHINE\Software\ODBC\ODBC.ini\"+&ds_name,"DataBaseName", Regstring!, db_name)Answer6=RegistrySet("HKEY_LOCAL_MACHINE\Software\ODBC\ODBC.ini\"+&ds_name,"PWD", Regstring!, "sql")
Answer7=RegistrySet("HKEY_LOCAL_MACHINE\Software\ODBC\ODBC.ini\"+&ds_name,"UID", Regstring!, "dba")IF Answer = -1 ThenMessageBox("错误!","应用程序无法设置ODBC DATA SOURCE名称,"+&"系统将终止运行!",Information!) //程序中不折行ReturnEnd if//====================================================================// 设置ODBC.ini细节//====================================================================answer1 = RegistrySet("HKEY_current_user\software\odbc\odbc.ini\"+&ds_name,"driver", regstring!, ls_driver)answer2 = RegistrySet("HKEY_current_user\software\odbc\odbc.ini\"+&ds_name,"start", regstring!, ls_start)answer3 = RegistrySet("HKEY_current_user\software\odbc\odbc.ini\"+&ds_name,"autostop", regstring!, "yes")answer4 = RegistrySet("HKEY_current_user\software\odbc\odbc.ini\"+ds_name,&"DataBaseFile", regstring!, db_path)answer5 = RegistrySet("HKEY_current_user\software\odbc\odbc.ini\"+ds_name,&"DataBaseName", regstring!, db_name)answer6 = RegistrySet("HKEY_current_user\software\odbc\odbc.ini\"+ds_name,&"pWD", regstring!, "sql")answer7 = RegistrySet("HKEY_current_user\software\odbc\odbc.ini\"+ds_name,&"UID", regstring!, "dba")If answer1 = -1 Or answer2 = -1 Or answer3 = -1 Or &answer4 = -1 Or answer5 = -1 Or answer6 = -1 Or answer7 = -1 ThenMessageBox("错误!","应用程序无法设置ODBC.INI细节,"+& "系统将终止运行!",information!)ReturnEnd Ifodbcstr = 'dsn=' + ds_name +';databasename=' + db_name + ';databasefile=' + db_pathsqlca.DBMS = "ODBC"sqlca.Database = db_namesqlca.DBParm = "c"CONNECT UIf sqlca.SQLCode = -1 ThenMessageBox("数据库连接失败", "不能连接到数据库上,请检查。"+& "~r~n出错的详细原因为:"+sqlca.SQLErrText)HaltEnd If
iPhone开发中的技能整理
iPhone开发中的技巧整理1、NSCalendar用法
-(NSString *) getWeek:(NSDate *)d
NSCalendar *calendar = [[NSCalendar alloc]
initWithCalendarIdentifier:NSGregorianCalendar];
unsigned units = NSYearCalendarUnit | NSMonthCalendarUnit |
NSDayCalendarUnit | NSWeekCalendarU
NSDateComponents *components = [calendar components:units
fromDate:d];
[calendar release];
switch ([components weekday]) {
return @"Monday";
return @"Tuesday";
return @"Wednesday";
return @"Thursday";
return @"Friday";
return @"Saturday";
return @"Sunday";
return @"NO Week";
NSLog(@"%@",components);
2、将网络数据读取为字符串
-(NSString *)getDataByURL:(NSString *)url {
return [[NSString alloc] initWithData:[NSData dataWithContentsOfURL: [NSURL URLWithString:[url stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]] encoding:NSUTF8StringEncoding];
3、读取?络图?
-(UIImage *)getImageByURL:(NSString *)url {
return [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL: [NSURL URLWithString:[url stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]]];
4、多线程(这种方式,只管建立线程,不管回收线程)
[NSThread detachNewThreadSelector:@selector(scheduleTask) toTarget:self withObject:nil];
-(void)scheduleTask
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
[pool release];
如果有参数,则这么?
[NSThread detachNewThreadSelector:@selector(scheduleTask:) toTarget:self withObject:[NSDate date]];
-(void)scheduleTask:(NSDate *)mdate
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
[pool release]; }
在线程?运?主线程?的?法
[self performSelectorOnMainThread:@selector(moveToMain) withObject:nil waitUntilDone:FALSE];
5、?户缺省值NSUserDefaults读取:
NSUserDefaults *df = [NSUserDefaults standardUserDefaults];
NSArray *languages = [df objectForKey:@"AppleLanguages"];
NSLog(@"all language is %@",languages);
NSLog(@"index is %@",[languages objectAtIndex:0]);
NSLocale *currentLocale = [NSLocale currentLocale];
NSLog(@"language Code is %@",[currentLocale objectForKey:NSLocaleLanguageCode]);
NSLog(@"Country Code is %@",[currentLocale objectForKey:NSLocaleCountryCode]);
6、view之间转换的动态效果设置
SecondViewController *secondViewController = [[SecondViewController alloc] init];
secondViewController.modalTransitionStyle = UIModalTransitionStyleFlipH//?水平翻转
[self.navigationController presentModalViewController:secondViewController animated:YES];
[secondViewController release];
7、UIScrollView 滑动用法: -(void)scrollViewDidScroll:(UIScrollView *)scrollView
NSLog(@"正在滑动中。。")
//?户直接滑动UIScrollView,可以看到滑动条
-(void)scrollViewDidEndDelerating:(UIScrollView *)scrollView {
//通过其他控件触发UIScrollView滑动,看不到滑动条
-(void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView {
//UIScrollView 设置滑动不超出本?身范围
[scrollView setBounces:NO];
8、iphone的系统目录:
//得到Document:目录
NSArray *paths =
NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
//得到temp临时目录
NSString *temPath = NSTemporaryDirectory();
//得到目录上的文件地址
NSString *address = [paths stringByAppendingPathComponent:@"1.rtf"];
9、状态栏显?示indicator
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
10、app Icon显示数字:
- (void)applicationDidEnterBackground:(UIApplication *)application
[[UIApplication sharedApplication] setApplicationIconBadgeNumber:5];
11、sqlite保存地址:
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectoryNSUserDomainMask, YES);
NSString *thePath = [paths objectAtIndex:0];
NSString *filePath = [thePath stringByAppendingPathComponent:@"kilometer.sqlite"];
NSString *dbPath = [[[NSBundle mainBundle] resourcePathstringByAppendingPathComponent:@"kilometer2.sqlite"];
12、键盘弹出隐藏,textfield变位置
_tspasswordTF = [[UITextField alloc] initWithFrame: CGRectMake(100,
150, 260, 30)];
_tspasswordTF.backgroundColor = [UIColor redColor];
_tspasswordTF.tag = 2;
Use this method to release shared resources, save user data,
_tspasswordTF.delegate =
[self.window addSubview: _tspasswordTF];
- (void)textFieldDidBeginEditing:(UITextField *)textField {
[self animateTextField: textField up: YES];
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
[self animateTextField: textField up: NO];
[textField resignFirstResponder];
return YES;
- (void) animateTextField: (UITextField*) textField up: (BOOL) up {
const int movementDistance = 80;
// tweak as needed
const float movementDuration = 0.3f;
// tweak as needed
int movement = (up ? -movementDistance : movementDistance);
[UIView beginAnimations: nil context: nil]; [UIView setAnimationBeginsFromCurrentState: YES]; [UIView setAnimationDuration: movementDuration];
self.window.frame = CGRectOffset(self.window.frame, 0, movement);
[UIView commitAnimations];
13、获取图片的尺?
CGImageRef img = [imageView.image CGImage];
NSLog(@"%d",CGImageGetWidth(img));
NSLog(@"%d",CGImageGetHeight(img));
14、AlertView,ActionSheet的cancelButton点击事件:
- (void)alertView:(UIAlertView *)alertView willDismissWithButtonIndex: (NSInteger)buttonI // before animation and hiding view
NSLog(@"cancel alertView... buttonindex = %d",buttonIndex); //当?用户按下Cancel按钮
if (buttonIndex == [alertView cancelButtonIndex]){
- (void)actionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSInteger)buttonIndex
NSLog(@"%s %d button = %d cancel actionSheet.....",__FUNCTION__,__LINE__, buttonIndex);
//当?用户按下Cancel按钮
if (buttonIndex == [actionSheet cancelButtonIndex]) {
15、给window设置全局背景图片
self.window.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@""]];
16、tabcontroller随意切换tabbar
-(void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController
-(BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController
_tabBarController.selectedIndex = tabI
17、计算字符串?度:
CGFloat w = [title sizeWithFont:[UIFont fontWithName:@"Arial" size: 18]].
18、计算点到线段的最短距离
根据结果坐标使?用CLLocation类的函数计算实际距离。 double
x1, y1, x2, y2, x3, y3;
double px =x2 -x1;
double py = y2 -y1;
double som = px *px + py *
double u =((x3 - x1)*px +(y3 - y1)*py)/ if(u & 1)
if (u & 0) { u =0;
//the closest point
double x = x1 + u * double y = y1 + u * double dx = x - x3; double dy = y - y3;
double dist = sqrt(dx*dx + dy*dy);
19、UISearchBar背景透明
在使用UISearchBar时,将背景?设定为clearColor,或者将translucent设为YES,都
不能使背景透明,经过一番研究,发现了一种超级简单和实用的?法:
[[searchbar.subviews objectAtIndex:0] removeFromSuperview];
背景完全消除了,只剩下搜索框本身了。
20、图像与缓存 :
UIImageView *wallpaper = [[UIImageView alloc] initWithImage: [UIImage imageNamed:@"icon.png"]]; // 会缓存图片
UIImageView *wallpaper = [[UIImageView alloc] initWithImage: [UIImage imageWithContentsOfFile:@"icon.png"]]; // 不会缓存图?片
21、iphone对视图层的操作
// 将textView的边框设置为圆角
_textView.layer.cornerRadius = 8;
_textView.layer.masksToBounds = YES;
//给textView添加一个有色边框
_textView.layer.borderWidth = 5;
_textView.layer.borderColor = [[UIColor colorWithRed:0.52 green:0.09
blue:0.07 alpha:1] CGColor];
//textView添加背景图片
_textView.layer.contents = (id)[UIImage imageNamed:@"31"].CGI
22、关闭当前应用
[[UIApplication sharedApplication] performSelector:@selector(terminateWithSuccess)];
23、给iPhone程序添加欢迎界面
1、将你需要的欢迎界面的图片,存成Default.png
[NSThread sleepForTimeInterval:10.0]; 这样欢迎页面就停留10秒后消失了。
24、NSString NSDate转换
NSString* myString= @"testing";
NSData* data=[myString dataUsingEncoding: [NSString defaultCStringEncodi ng]];
NSString* aStr =
[[NSString alloc] initWithData:aData encoding:NSASCIIStringEncoding];
25、UIWebView中的dataDetectorTypes
如果你希望在浏览页面时,页面上的电话号码显示成链接形式,点击电话号码就拨打电话,这时你就需要用到dataDetectorTypes了。
NSURL *url = [NSURL URLWithString:@""];
NSURLRequest *requestObj = [NSURLRequest requestWithURL:url]; webView.dataDetectorTypes = UIDataDetectorTypePhoneN
[webView loadRequest:requestObj];
26、打开苹果电脑浏览器的代码
如您想在 Mac 软件中集成一键打开浏览器功能,可以使用以下代码
[[NSWorkspace sharedWorkspace] openURLs: urls withAppBundleIdentifier:@"com.apple.Safari"
options: NSWorkspaceLaunchDefault additionalEventParamDescriptor: NULL launchIdentifiers: NULL];
27、设置StatusBar以及NavigationBar的样式
[UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleBlackO self.navigationController.navigationBar.barStyle = UIBarStyleB
28、隐藏Status Bar 你可能知道一个简易的方法,那就是在程序的viewDidLoad中加入以下代码:
[UIApplication sharedApplication].statusBarHidden = YES;
此法可以隐藏状态条,但问题在于,状态条所占空间依然无法为程序所用。
本篇介绍的方法依然简单,但更为奏效。通过简单的3个步骤,在plist中加入一 个键值来实现。
1. 点击程序的Info.plist
2. 右键点击任意一处,选择Add Row
3. 加入的新键值,命名为UIStatusBarHidden或者Status bar is initially hidden,然后选上这一项。
29、产生随机数的最佳方案
arc4random()会返回一个整型数,因此,返回1至100的随机数可以这样写:
arc4random()%100 + 1;
30、string 和char转换
NSString *cocoaString = [[NSString alloc] initWithString:@"MyString"];
const char *myCstring = [cocoaString cString];
const char *cString = "Hello";
NSString *cocoString = [[NSString alloc] initWithCString:cString];
31、用UIWebView在当前程序中打开网页 如果URL中带中文的话,必须将URL中的中文转成URL形式的才行。
NSString *query = [NSString stringWithFormat:@"?q=苹 果"];
NSString *strUrl = [query stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSURL *url = [NSURL URLWithString:strUrl];
NSURLRequest *requestObj = [NSURLRequest requestWithURL:url];
[webView loadRequest:requestObj];
32、阻止ios设备锁屏
[[UIApplication sharedApplication] setIdleTimerDisabled:YES];
[UIApplication sharedApplication].idleTimerDisabled = YES;
33、一条命令卸载Xcode和 iPhone SDK
sudo /Developer/Library/uninstall-devtools --mode=all
34、获取按钮的title
-(void)btnPressed:(id)sender {
NSString *title = [sender titleForState:UIControlStateNormal];
NSString *newText = [[NSString alloc] initWithFormat:@"%@",title];
label.text = newT
[newText release];
35、NSDate to NSString
NSString *dateStr = [[NSString alloc] initWithFormat:@"%@", date];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
NSString *strDate = [dateFormatter stringFromDate:[NSDate date]];
NSLog(@"%@", strDate);
[dateFormatter release];
36、图片由小到大缓慢显示的效果
UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 0, 0)];
[imageView setImage:[UIImage imageNamed:@"4.jpg"]];
self.ANImageView = imageV
[self.view addSubview:imageView];
[imageView release];
CGContextRef context = UIGraphicsGetCurrentContext();
[UIView beginAnimations:nil context:context];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
[UIView setAnimationDuration:2.5];
CGImageRef img = [self.ANImageView.image CGImage];
[ANImageView setFrame:CGRectMake(0, 0, CGImageGetWidth(img), CGImageGetHeight(img))];
[UIView commitAnimations];
NSLog(@"%lu",CGImageGetWidth(img));
NSLog(@"%lu",CGImageGetHeight(img));
37、数字转字符串
NSString *newText = [[NSString alloc] initWithFormat:@"%d",number];
numberlabel.text = newT
[newText release];
38、随机函数arc4random() 的使用.
在iPhone中,RAND_MAX是0x7fffffff (),而arc4random()返回的 最大值则是 0x (),从而有更好的精度。使用 arc4random()还不需要生成随机种子,因为第一次调用的时候就会自动生成。
arc4random() 来获取0到100之间浮点数
#define ARC4RANDOM_MAX 0x
double val = floorf(((double)arc4random() / ARC4RANDOM_MAX) * 100.0f);
1. self.view.backgroundColor = [UIColor colorWithHue: arc4random() % 2 55 / 255
saturation: arc4random() % 2 brightness: arc4random() % 2
alpha: 1.0];
39、改变键盘颜色的实现
iPhone和iPod touch的键盘颜色其实是可以通过代码更改的,这样能更匹配 App的界面风格,下面是改变iPhone键盘颜?色的代码。
-(void)textFieldDidBeginEditing:(UITextField *)textField {
NSArray *ws = [[UIApplication sharedApplication] windows];
for(UIView *w in ws)
NSArray *vs = [w subviews];
for(UIView *v in vs)
if([[NSString stringWithUTF8String:object_getClassName(v)] isEqualToString:@"UIPeripheralHostView"])
<div style="border-width:0 padding:0 margin:0 list-
如果您想提高自己的技术水平,欢迎加入本站官方1号QQ群:&&,&&2号QQ群:,在群里结识技术精英和交流技术^_^
本站联系邮箱:

我要回帖

更多关于 草榴社区iphone客户端 的文章

 

随机推荐