iOS OpenGL ES入门详解

发布时间:2017-08-19 OPENGL ES OPENGL 渲染 IOS OPENGL 三维图片 IOS

//联系人:石虎  QQ: 1224614774昵称:嗡嘛呢叭咪哄


OpenGL ES入门详解 

转入地址:http://blog.csdn.net/wangyuchun_799/article/details/7736928

      1.决定你要支持的OpenGL ES的版本。目前,OpenGL ES包含1.1和2.0两个版本,iPhone 3G+和iPad开始支持OpenGL ES2.0。而且这两个版本之间的差异非常大,不仅仅在编程思想上,API之间的差距也很大。因此,如果你想使用OpenGL ES开发3D程序或游戏,那么首先就要决定使用哪个版本,还是说两个版本都支持。OpenGL ES定义了代表不同版本的宏:

                     enum
                    {
                        kEAGLRenderingAPIOpenGLES1 = 1,     //1.1版
                        kEAGLRenderingAPIOpenGLES2 = 2      //2.0版
                    }typedef NSUInteger EAGLRenderingAPI;

以iPhone代码为例,你可以通过以下方式判断用户设备所支持的OpenGL ES版本,如果支持2.0,就使用2.0进行渲染;如果仅支持1.1,则使用1.1版进行渲染:

                   EAGLRenderingAPI api = kEAGLRenderingAPIOpenGLES2;    //默认优先使用2.0版
                  m_context = [[EAGLContext alloc] initWithAPI:api];     //使用2.0版初始化EAGLContext
                  if (!m_context ) {            //使用2.0版初始化EAGLContext失败
                      api = kEAGLRenderingAPIOpenGLES1;        //将API设为1.1版
                      m_context = [[EAGLContext alloc] initWithAPI:api];//使用1.1版初始化EAGLContext
                  }
                  if (!m_context || ![EAGLContext setCurrentContext:m_context]) {     //1.1版初始化失败,则释放内存
                      [self release];
                      return nil;
                  }
                  if (api == kEAGLRenderingAPIOpenGLES1) {
                      //使用1.1版开始渲染
                  }
                  else {
                      //使用2.0版开始渲染
                  }

         2.你想让你的OpenGL ES程序跨手机平台运行么?Android、iPhone、windows phone手机系统是当前最主流的手机系统,如何才能让我们编写出来的程序可以跨平台运行呢?好消息是,这三个平台都支持OpenGL ES,而且都支持C++语言。也许你明白了,方法就是通过C++来封装OpenGL ES,尽量少用特定平台的耦合代码。这样我们就可以将封装的OpenGL ES引擎在不同的手机平台的使用,而且仅需要修改特定平台连接OpenGL ES的代码即可。

        3.入门常见代码解析

3.1创建渲染缓冲区

    GLuint m_renderbuffer;//创建一个渲染缓冲区对象

    glGenRenderbuffers(1, &m_renderbuffer);//创建一个渲染缓冲区对象
    glBindRenderbuffer(GL_RENDERBUFFER, m_renderbuffer);//将该渲染缓冲区对象绑定到管线上

3.2创建帧缓冲区

   GLuint m_framebuffer;//创建一个帧缓冲区对象

    glGenFramebuffers(1, &m_framebuffer);//创建一个帧染缓冲区对象
    glBindFramebuffer(GL_FRAMEBUFFER, m_framebuffer);//将该帧染缓冲区对象绑定到管线上
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, m_renderbuffer);//将创建的渲染缓冲区绑定到帧缓冲区上,并使用颜色填充

3.3设置视口

glViewport(0, 0, width, height);//定义视口大小,说白了就是OpenGL ES窗口大小


3.4创建着色器

3.4.1创建一个空着色器

GLuint shaderHandle = glCreateShader(shaderType);//shaderType代表着色器的类型,可以是GL_VERTEX_SHADER(顶点着色器)或GL_FRAGMENT_SHADER(片元着色器)

3.4.2指定着色器源代码
    glShaderSource(shaderHandle, 1, &source, 0);// source代表要执行的源代码字符串数组,1表示源代码字符串数组的字符串个数是一个,0表示源代码字符串长度数组的个数为0个

3.4.3编译着色器
    glCompileShader(shaderHandle);//编译着色器

3.4.4检查编译是否成功
    GLint compileSuccess;
    glGetShaderiv(shaderHandle, GL_COMPILE_STATUS, &compileSuccess);//查看编译着色器是否成功,可选的查询状态有L_DELETE_STATUS,GL_COMPILE_STATUS, GL_INFO_LOG_LENGTH, GL_SHADER_SOURCE_LENGTH

//如果编译出错,则记录出错信息
    if (compileSuccess == GL_FALSE) {
        GLchar messages[256];
        glGetShaderInfoLog(shaderHandle, sizeof(messages), 0, &messages[0]);
        std::cout << messages;
        exit(1);
    }

3.5创建渲染源程序

3.5.1创建一个空源程序

GLuint programHandle = glCreateProgram();//创建一个渲染程序

3.5.2向源程序中添加着色器
    glAttachShader(programHandle, shaderHandle);//将着色器添加到程序中

3.5.3链接源程序
    glLinkProgram(programHandle);//你可能添加了多个着色器,链接程序

3.5.4检查链接程序是否成功
    GLint linkSuccess;
    glGetProgramiv(programHandle, GL_LINK_STATUS, &linkSuccess);//查看连接是否成功

//链接失败记录失败信息

    if (linkSuccess == GL_FALSE) {
        GLchar message[256];
        glGetProgramInfoLog(programHandle, sizeof(message), 0, &message[0]);
        std::cout << message;
        exit(1);
    }

3.6顶点结构体

//此处定义了一个代表顶点的结构体,内部包含一个有两个点(x,y)组成的顶点的位置信息,和一个四个值(r, g, b, a)表示的颜色信息

struct Vertex{
    float Position[2];
    float Color[4];
};
//创建顶点数组,里面有6个顶点信息
const Vertex vertices[] = {
    {{-0.5, -0.866}, {0.5, 1, 0.5, 1}},
    {{0.5, -0.866}, {0.2, 0.6, 0.5, 1}},
    {{0, 1}, {0.6, 0.1, 0.8, 1}},
    {{0.5, -0.866}, {0.5, 0.5, 0.5, 1}},
    {{1.5, -0.866}, {0.5, 0.5, 0.5, 1}},
    {{1, 0.4}, {0.5, 0.5, 0.5, 1}}
};

3.7着色器

3.7.1顶点着色器

#define STRINGIFY(A) #A

const char *SimpleVertexShader = STRINGIFY(
attribute vec4 Position;//位置,vec4说明有4个点组成,attribute表示属性,由程序提供输入值
attribute vec4 SourceColor;//源颜色,RGBA
varying vec4 DestinationColor;//目标颜色,输出值,用来传递到片元着色器,vary表示可变传出变量
uniform mat4 Projection;//投影矩阵,mat4表示一个4*4的矩阵,uniform表示统一的,不变的,每个顶点都是固定的这个值
uniform mat4 Modelview;//模型矩阵
void main(void){
    DestinationColor = SourceColor;//简单的将源颜色赋给目标颜色
    gl_Position = Projection * Modelview * Position;//通过矩阵乘法获得目标位置,gl_Position是OpenGL ES内定的值,必须指定
}
);

3.7.2片元着色器

const char *SimpleFragmentShader = STRINGIFY(
varying lowp vec4 DestinationColor;//由顶点着色器传入,lowp表示低精度
void main(void){
    gl_FragColor = DestinationColor;//片元颜色,gl_FragColor也是OpenGL ES内定的,必须指定
}
);

3.8开始渲染

3.8.1填充(清理)屏幕

glClearColor(0.1f, 0.9f, 0.5f, 1);//指定填充屏幕的RGBA值
glClear(GL_COLOR_BUFFER_BIT);//指定要清除哪些缓冲区,GL_COLOR_BUFFER_BIT表示颜色缓冲区,GL_DEPTH_BUFFER_BIT表示深度缓冲区,GL_STENCIL_BUFFER_BIT表示模板缓冲区

3.8.2从着色器代码中获取属性信息

    GLuint m_simpleProgram = programHandle;    

    GLuint positionSlot = glGetAttribLocation(m_simpleProgram, "Position");//从着色器源程序中的顶点着色器中获取Position属性
    GLuint colorSlot = glGetAttribLocation(m_simpleProgram, "SourceColor");//从着色器源程序中的顶点着色器中获取SourceColor属性

3.8.3开启顶点属性数组
    glEnableVertexAttribArray(positionSlot);
    glEnableVertexAttribArray(colorSlot);

3.8.4为着色器属性赋值
    GLsizei stride = sizeof(Vertex);//单个顶点的数据长度
    const GLvoid *pCoords = &vertices[0].Position[0];//顶点数组中的位置数组首地址
    const GLvoid *pColors = &vertices[0].Color[0];/顶点数组中的颜色数组首地址
    glVertexAttribPointer(positionSlot, 2, GL_FLOAT, GL_FALSE, stride, pCoords);//为顶点着色器位置信息赋值,positionSlot表示顶点着色器位置属性(即,Position);2表示每一个顶点信息由几个值组成,这个值必须位1,2,3或4;GL_FLOAT表示顶点信息的数据类型;GL_FALSE表示不要将数据类型标准化(即fixed-point);stride表示数组中每个元素的长度;pCoords表示数组的首地址
    glVertexAttribPointer(colorSlot, 4, GL_FLOAT, GL_FALSE, stride, pColors);//同上

3.8.5渲染顶点
    GLsizei vertexCount = sizeof(vertices)/sizeof(Vertex);//顶点个数
    glDrawArrays(GL_TRIANGLES, 0, vertexCount);//将顶点数组使用三角形渲染,GL_TRIANGLES表示三角形, 0表示数组第一个值的位置,vertexCount表示数组长度

3.8.6渲染完毕,关闭顶点属性数组
    glDisableVertexAttribArray(positionSlot);
    glDisableVertexAttribArray(colorSlot);

4.OpenGL 1.1和2.0在编程上的区别

4.1函数命名上的区别

1.1版API函数和宏末尾通常都为加上OES(即OpenglES的缩写),2.0版本基本上都把这个后缀名给去掉了,如:

1.1API函数和宏:glBindRenderbufferOES(GL_RENDERBUFFER_OES, m_renderbuffer);

2.0API函数和宏:glBindRenderbuffer(GL_RENDERBUFFER, m_renderbuffer);

4.2渲染方式不同

1.1版是基于不可编程管线,2.0版是基于可编程管线的,明显的差别是1.1不支持着色器而2.0支持着色器,如下:

在1.1版将顶点渲染到屏幕上一般这样写:

    glMatrixMode(GL_PROJECTION);
    const float maxX = 2;
    const float maxY = 3;
    glOrthof(-maxX, maxX, -maxY, maxY, -1, 1);
    glMatrixMode(GL_MODELVIEW);

2.0版支持着色器,就不再这么渲染顶点了。将顶点属性和变换方式全部放在顶点着色器和片元着色器中,然后程序中通过着色器来渲染

4.3编写同样的程序API不同

如,同样是激活和关闭顶点数组,在1.1中是glEnableClientState(GL_VERTEX_ARRAY);和glDisableClientState(GL_VERTEX_ARRAY);

但在2.0中,就变成了:glEnableVertexAttribArray(*);和glDisableVertexAttribArray(*);

差别的来源就在于1.1不使用着色器,而2.0使用着色器。

4.4编程难易程度不同。

1.1是基于不可编程管线的,因此,管线的各个组件都是写好的,我们仅需要调用即可。而2.0是基于可编程管线的,灵活性大大增加了,但是编写的难度和复杂度也增加了,因为什么功能都得自己写了。

5.着色器的使用流程

刚开始学习OpenGL ES2.0,对其着色器十分不感冒,什么是着色器,着色器该怎么使用,着色器包含哪些内容呢?

着色器就是一段包含着色信息的源代码字符串。通常着色器分为顶点着色器(Vertex Shader)和片元着色器(Fragment Shader),两个着色器分别写在不同的文件中,文件没有固定的后缀名,可以根据你自己的爱好写,但是最好能区别文件中写的是顶点着色器还是片元着色器,不然时间长了自己都不知道哪个文件中写的是什么信息了。如你可以给你的顶点着色器后缀名命名为:vert, ver, v, vsh等,给你的片元着色器后缀名命名为:frag, fra, f, fsh等。

着色器源代码和OpenGL源代码不是一起编译的,所以要特别强调我刚才说的“着色器是一段包含着色信息的源代码字符串”。所以,OpenGL源代码肯定是和工程一起编译的,但是着色器源代码是在运行期编译的。你可能会问,着色器的源代码是一个字符串怎么编译呢?所以OpenGL ES提供了一套运行期动态编译的流程:

(1)创建着色器:glCreateShader

(2)指定着色器源代码字符串:glShaderSource

(3)编译着色器:glCompileShader

(4)创建着色器可执行程序:glCompileShader

(5)向可执行程序中添加着色器:glAttachShader

(6)链接可执行程序:glLinkProgram 谢谢!!!

更多相关推荐


IOS之Quartz

http://space.189works.com/home-space-uid-10430378-do-blog-id-71065.htmlIOS之Quartz已有22次阅读2012-10-1913:03 | 的, 是, interface, 应用程序, current14.1Quartz概述14.2绘制基本几何图形14.3绘制图像和文本14.4坐标14.5变换14.6图像拾取器 14.1Qua...

ios--截屏--UIGraphicsBeginImageContext(CGSize)

发布时间:2014-05-22 UIGRAPHICSBEGINIMAGE IOS开发 IOS
原文转自:http://blog.csdn.net/ch_soft/article/details/7338012UIGraphicsBeginImageContext(CGSize)截图,是从屏幕原点开始截取size大小的图片如何截取任意起点开始size大小的图片,办法就是用CGContextTranslateCTM转换原点坐标//导入头文件//创建一个基于位图的图形上下文并指定大小为CGSiz...

stretchableImageWithLeftCapWidth 的使用

发布时间:2016-02-19 UIIMAGE IOS
UIImagestretchableImageWithLeftCapWidth的使用一直比较迷惑,不明白,并且在开始的使用中总是失败,结合着网上的资料,经过多次实验,终于明白他的用处了, leftCapWidth,是左侧需要保留的像素数,topCapHeight是顶部需要保留的像素数,然后中间的1像素用于中间的平铺,达到最后所需要的尺寸。效果相当于只能保持一边固定,拉伸另一边。 并且以前使用ima...

iOS_计算文件大小

发布时间:2015-04-15 文件大小 IOS
+(float)folderSizeAtPath:(NSString*)folderPath{NSFileManager*manager=[NSFileManagerdefaultManager];if(![managerfileExistsAtPath:folderPath])return0;NSEnumerator*childFilesEnumerator=[[managersubpathsA...

iOS_计算文件大小,删除缓存

发布时间:2016-03-02 XCODE IOS开发 IOS
//获得缓存路径self.cachesPath=NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask,YES).lastObject;/***********************缓存管理***********************/#pragmamark单个文件的大小+(longlong)fileSize...

猫猫学IOS(三十一)UI之Quartz2D图形上下文栈

发布时间:2016-09-12 QUARTZ2D IOS
转载自:http://blog.csdn.net/u013357243/article/details/45500879地址:http://blog.csdn.net/u013357243?viewmode=contents首先,前面博客说过。qurza2d的上下文中有绘图信息和绘图的属性。但是他是怎么绘制到上下午中的呢?我们画图时候一半会用这三个步骤:(1)获取上下文(2)绘图(3)渲染这里引申...

利用预渲染加速iOS设备的图像显示

发布时间:2014-04-14 IOS图像预加载 IOS
最近在做一个UITableView的例子,发现滚动时的性能还不错。但来回滚动时,第一次显示的图像不如再次显示的图像流畅,出现前会有稍许的停顿感。于是我猜想显示过的图像肯定是被缓存起来了,查了下文档后发现果然如此。后来在《ImprovingImageDrawingPerformanceoniOS》一文中找到了一些提示:原来在显示图像时,解压和重采样会消耗很多CPU时间;而如果预先在一个bitmapc...

iOS开发系列--打造自己的“美图秀秀”

发布时间:2017-03-03 IOS 绘图 IOS
概述在iOS中可以很容易的开发出绚丽的界面效果,一方面得益于成功系统的设计,另一方面得益于它强大的开发框架。今天我们将围绕iOS中两大图形、图像绘图框架进行介绍:Quartz2D绘制2D图形和CoreImage中强大的滤镜功能。Quartz2D基本图形绘制视图刷新其他图形上下文CoreImageQuartz2D在iOS中常用的绘图框架就是Quartz2D,Quartz2D是CoreGraphics...

OC/IOS 基础 获取屏幕信息

发布时间:2022-11-25 OC基础 XCODE SWIFT IOS
一直觉得自己写的不是技术,而是情怀,一个个的教程是自己这一路走来的痕迹。靠专业技能的成功是最具可复制性的,希望我的这条路能让你们少走弯路,希望我能帮你们抹去知识的蒙尘,希望我能帮你们理清知识的脉络,希望未来技术之巅上有你们也有我。浅红色文字:代码如下(示例):提示:这里对文章进行总结:前言正题OC下面的方法貌似是过iPhone12mini检测不出来.//如果有新出的机型打开模拟器截图查看尺寸(就知...

iOS 地图缩放级别问题

发布时间:2016-11-24 缩放 IOS
最直观的设置方式是   [self.GaoapViewsetZoomLevel:16.5animated:YES]; 但是在创建地图的时候设置总是没有效果,网上找到的是一个是换设置位置,即将地图的其他设置完成后再设置缩放级别,一个是用   MACoordinateRegiontheRegion=MACoordinateRegionMake(myCoordinate,MACoordinateSpan...

通知

发布时间:2015-09-01 搭建联系 OC 通知 IOS
通知什么时候使用通知:当两个对象没有联系的时候,使用通知。让两个没有联系的对象产生关系。发出通知(postNotification)新建一个通知(NSNotification)对象一个完整的通知一般包含三个属性:(NSString*)name;//通知的名称(id)object;//通知发布者(是谁要发布通知)(NSDictionary*)userInfo;//一些额外的信息(通知发布者传递给通知...

在iOS上实现Android风格的控件Toast

发布时间:2012-06-06 APPLE ANDROID UIVIEW INTERFACE TIMER IOS
iOS的风格和Apple其他产品一样,简单而粗暴。没有给人其他选择的余地,让你又爱又恨。同样的,Apple对待iOS平台的开发人员和对待大众消费者一样,也不给你留余地。UIAlertView就是一个鲜明标志。功能简单,甚至单一,定制性差,消耗资源。在资源紧张的设备上,UIAlertView的动画效果都会稍微卡一下,很是别扭。  这时还是很希望在iOS上有一个Android风格的Toast控件。  ...

开始使用CSDN博客

发布时间:2012-09-04 移动开发 C ANDROID PYTHON 闲话 WEB IOS
接触的东西越多就越发觉得脑子不够用了,之前一直随手用OneNote随手记录遇到的问题和解决方案感觉也是颇为方便,不过在老贺的倡议下还是开始使用博客喽.最近在向ios方向发展,之前学过C++,做过一些Android,还稍微学了点Python.目前的计划是每周更新两篇移动开发方面的内容和一篇其他的东西(C++,Python或Web前端).一方面是做一个学习记录方便日后查找,另一方面便于大家交流嘛!PS...

ios中利用NSDateComponents、NSDate、NSCalendar判断当前时间是否在一天的某个时间段内。

发布时间:2016-05-06 NSDATECOMPONENTS IOS
应用中设置一般会存在这样的设置,如夜间勿扰模式,从8:00-23:00,此时如何判断当前时间是否在该时间段内。难点主要在于如何用NSDate生成一个8:00的时间和23:00的时间,然后用当前的时间跟这俩时间作对比就好了。下面提供两条思路:法1.用NSDate生成当前时间,然后转为字符串,从字符串中取出当前的年、月、日,然后再拼上时、分、秒,然后再将拼接后的字符串转为NSDate,最后用当前的时间...

iOS开发系列--触摸事件、手势识别、摇晃事件、耳机线控

发布时间:2015-07-20 -- IOS
--iOS事件全面解析http://www.cnblogs.com/kenshincui/p/3950646.html概览iPhone的成功很大一部分得益于它多点触摸的强大功能,乔布斯让人们认识到手机其实是可以不用按键和手写笔直接操作的,这不愧为一项伟大的设计。今天我们就针对iOS的触摸事件(手势操作)、运动事件、远程控制事件等展开学习:iOS事件简介触摸事件手势识别运动事件远程控制事件iOS事件...

用 iPad 来写代码,GitHub 又一代码编辑器,开源了!

发布时间:2022-11-17 IOS GITHUB 编辑器 IPAD
公众号关注 “GitHubDaily”设为 “星标”,每天带你逛GitHub!大家好,我是小G。大部分拥有iPad的同学,其日常使用场景,应该是看番、煲剧、玩游戏以及偶尔的办公协作吧。但是,自从我入手第一台iPad起,便动过拿它来编程的念头。可惜,当时找不到一款与iPad兼容较好的代码编辑器,能同时满足多种不同编程语言的运行环境,无奈只得将此事作罢。前阵子逛GitHub的时候,偶然看到了一款iPa...

openGL 第十一篇:摄像机二 =》应用与总结

发布时间:2021-10-21 3D渲染 OPENGL 渲染管线
摄像机应用与总结一、使用GLM第三方库创建lookAt  与手动创建lookAt二、观察目标位置不变,手动控制摄像机位置的改变三、摄像机位置不变,手动控制观察目标位置的改变四、摄像机类的实现五、归纳与总结六、相关API参数的解释...

IOS沙盒(sandbox)机制和文件操作(一)

发布时间:2013-07-24 SANDBOX IOS
1、IOS沙盒机制 IOS应用程序只能在为该改程序创建的文件系统中读取文件,不可以去其它地方访问,此区域被成为沙盒,所以所有的非代码文件都要保存在此,例如图像,图标,声音,映像,属性列表,文本文件等。 1.1、每个应用程序都有自己的存储空间 1.2、应用程序不能翻过自己的围墙去访问别的存储空间的内容 1.3、应用程序请求的数据都要通过权限检测,假如不符合条件的话,不会被放行。   通过这张图只能从...

iOS 邮箱开发学习汇总

发布时间:2017-07-28 邮箱 IOS
前言近期公司项目中需要嵌套一个邮箱,对这方面知识没有什么储备,因此查资料开始研究,顺便记录下自己所遇到的问题什么是POP3、SMTP和IMAP?POP3POP3是PostOfficeProtocol3的简称,即邮局协议的第3个版本,它规定怎样将个人计算机连接到Internet的邮件服务器和下载电子邮件的电子协议。它是因特网电子邮件的第一个离线协议标准,POP3允许用户从服务器上把邮件存储到本地主机...

iOS Vuforia:TextReco 增加自己的单词库

发布时间:2017-09-14 VUFORIA IOS
       Vuforia的文字识别引擎提供了很好的文字识别功能。引擎依赖于UTF-8字符编码,现支持的字符有A-Za-z,换行符、空格、单引号、短斜杠。Note:不支持中文及数字。能识别的字体是:serif和sansserif字体,支持的文字样式有平实、加粗、斜体以及下划线。i.e.详细介绍,查看官网:https://developer.vuforia.com/resources/dev-gu...

AVAudioPlayer音频播放器—IOS开发

发布时间:2013-04-24 IOS
AVAudioPlayer在AVFoundation框架下,所以我们要导入AVFoundation.framework。#import&lt;AVFoundation/AVFoundation.h&gt;AVAudioPlayer类封装了播放单个声音的能力。播放器可以用NSURL或者NSData来初始化,要注意的是NSURL并不可以是网络url而必须是本地文件URL,因为AVAudioPlayer...

Flutter TextField(加深探索)

发布时间:2022-11-19 FLUTTER基础 FLUTTER IOS
距离上次探索TextField已经过去了12天,那么现在看看这将近两周时间中,我又探索到了什么呢?首先就是TextField的焦点,可以使用于点击前和点击后的变化还有一个指定焦点,可以在你跳转到这个页面后,自动锁定文本输入框:首先是获取TextField焦点后的样式转换:先看点击前(未获取焦点前的)效果: 然后是点击后(获取焦点后)的效果:  然后上代码:classMyApp1extendsSta...

IOS中Json解析的四种方法

发布时间:2013-12-06 JSON IOS
来自: http://blog.csdn.net/enuola/article/details/7903632作为一种轻量级的数据交换格式,json正在逐步取代xml,成为网络数据的通用格式。有的json代码格式比较混乱,可以使用此“http://www.bejson.com/”网站来进行JSON格式化校验(点击打开链接)。此网站不仅可以检测Json代码中的错误,而且可以以视图形式显示json中的...

动态计算cell得高度

发布时间:2014-06-06 IOS
   往往在开发iPhone的应用过程中用得最多的应该算是UITableVIew了,凭着IOS给UITableView赋予了这种灵活的框架结构,让它不管在显示列表方面还是在排版方面都有着一定的优势。虽然UITableView功能强大,但是对于一些复杂的应用需求在开发的过程中会出现一些问题,如动态改变UITableView显示的Cell高度就是其中之一    其实想要改变UITableView的Ce...

XCode生成调用静态链接库

发布时间:2012-11-13 IOS
今天尝试将静态链接库引入工程:Objective-C的试验成功!!建立一个CocoaTouch库工程,然后写代码操文件,编译出来。将在建立一个Client工程,这个工程是app工程,由这个可以引用刚才的那个库工程,将库工程生成的.a加到Target的link下(使静态库可被引用),然后进入"GetInfo"-&gt;"Generat"关联依赖项(在工程下可以交叉编译),再将头文件地址加入Heade...

UISegmentedControl基本使用方法

发布时间:2014-11-27 IOS
UISegmentedControl分段控件基本使用方法。创建UISegmentedControl*mySegmentedControl=[[UISegmentedControlalloc]initWithItems:nil];它不需要指定大小,高度默认为44,不能写0设置宽度:[mySegmentedControlsetWidth:100forSegmentAtIndex:0];//设置Item...

UIControl 使用全面解析

发布时间:2012-11-06 OBJECTIVE-C UICONTROL IOS
前面写过UILable使用全面解析 UIButton使用全面解析 UITextField使用全面解析 它们有共同父类UIControl,对UIControl的理解有助全面理解iOS中的控件。UIKit提供了一组控件:UISwitch开关、UIButton按钮、UISegmentedControl分段控件、UISlider滑块、UITextField文本字段控件、UIPageControl分页控件。...

iOS开发网络篇—网络请求(HTTP协议)小结

发布时间:2014-12-18 网络 IOS
iOS开发网络篇—网络请求(HTTP协议)小结iOS开发网络篇—网络请求(HTTP协议)小结 1.聊一下HTTP协议(协议的完整的通信过程) 2.通信过程1&gt;请求*客户端--&gt;服务器*请求的内容a.请求行(请求方法\HTTP协议\请求资源路径)b.请求头(描述客户端的信息)c.请求体(POST请求才需要有,存放具体数据) 2&gt;响应*服务器--&gt;客户端*响应的内容a.状态行(...

[iOS]终极横竖屏切换解决方案

发布时间:2017-07-27 IOS
转载于https://mp.weixin.qq.com/s?__biz=MjM5OTM0MzIwMQ==&amp;mid=2652550529&amp;idx=1&amp;sn=ea697b16545a744970483cfe8da3258c&amp;chksm=bcd2f08f8ba57999daa3eba8f8dcf9e63221d6e8c308a329dff4b9e15e4488600f67...

IOS代码管控APP页面横竖屏切换

发布时间:2014-09-09 IOS
IOS如何使用代码管控APP页面横竖屏切换?这个我写了个小demo,下载链接 http://code4app.com/ios/53c78e77933bf098108b4ea01。⾸首先是AppDelegate,这⾥里加载rootViewController⽅方法要变⼀下:-(BOOL)application:(UIApplication*)applicationdidFinishLaunching...

iOS知识小集·NSNumber to NSString出错啦

发布时间:2018-03-07 NSNUMBER IOS
起因某一次准备把一个NSNumber显示在lable上。NSString*text=[NSStringstringWithFormat:@"%@",value];复制代码嗯。很完美。问题写下如下代码:self.label.text=[NSStringstringWithFormat:@"%@",@(8.0)];self.label1.text=[NSStringstringWithFormat:@...

IOS调试技巧-崩溃定位

发布时间:2013-03-28 崩溃 MAC OS/IOS DEBUG IOS
    如果你的程序崩溃了,而你又恰好没有捕获异常,那么你的控制台可能会输出如下内容:2013-03-1313:30:10.186Picross[43233:1303]***Terminatingappduetouncaughtexception'NSInvalidArgumentException',reason:'-[AppDelegatecrash]:unrecognizedselector...

把Stable Diffusion模型塞进iPhone里,做成APP一分钟出图

发布时间:2022-11-10 IPHONE STABLE DIFFUSION IOS
关注公众号,发现CV技术之美本文转自机器之心,作者:liuliu。StableDiffusion可能很快就会在移动端普及。在iPhone上运行StableDiffusion到底难不难?今天我们要介绍的这篇文章,作者给出了答案:不难,而且iPhone还剩余50%的性能。众所周知,每年苹果都会推出一款声称在各方面都更快、更好的新款iPhone,这主要得益于新的视觉模型和图像传感器的快速发展。就拿拍照来...

iOS 触摸事件处理

发布时间:2016-01-20 IOS
触摸事件有三种方法,分别是碰到屏幕时,在屏幕上滑动时,离开屏幕时,这三个方法都是自动触发的;-(void)touchesBegan:(NSSet&lt;UITouch*&gt;*)toucheswithEvent:(UIEvent*)event{[supertouchesBegan:toucheswithEvent:event];//让下一个响应者可以有机会继续处理}-(void)touchesM...

将 Json读入 NSArry中

发布时间:2012-03-29 ENCODING JSON 网易 INTERFACE RESOURCES IOS
将JSON读入NSArray中博客分类:iOSIOSJSONNSArray1、将JSON中的所有文件拷入项目的Classes中2、新建一个MyDataSource类,用来解析JSONIos代码@interfaceMyDataSource:NSObject{  }  +(id)dataSource; @end @interfaceMyDataSource:NSObject{}+(id)dataSou...

啥牌子的无线蓝牙耳机好用?无线蓝牙耳机推荐2022

发布时间:2022-11-25 IOS
蓝牙耳机这几年技术越好越高,其最大的魅力就是随时随地听音乐,无论是上下班还是日常使用,出门携带也方便,市面上的蓝牙耳机众多,很多人不知道该如何选择,下面整理了几款音质清晰,综合性能优秀的蓝牙耳机。一、南卡小音舱蓝牙耳机音质推荐指数:★★★★★网友推荐指数:★★★★★发烧级推荐指数:★★★★★防水推荐指数:★★★★★耳机采用了人体工学设计,带来了佩戴的舒适度和稳固性。单只耳机的重量也只有3.1g,让...

iOS开发 超详细Flutter开发环境搭建

发布时间:2022-11-25 FLUTTER IOS
1、安装Flutter此文章针对针对移动开发者,关于Flutter环境搭建,仅供参考,也可参考官网&lt;https://flutter.dve/&gt;1.1、下载FlutterSDK进入Flutter官网&lt;https://flutter.dve/&gt; 此网站为中国网站,无需翻墙即可进入进入后,此处便为FlutterSDK下载地址了,根据自己的操作系统选择(本人为MacOS系统,下面以...

Xcode弃用Bitcode,导致应用体积大幅增加

发布时间:2022-11-18 XCODE MACOS IDE SWIFT IOS
👇👇关注后回复 “进群” ,拉你进程序员交流群👇👇出品|OSC开源社区(ID:oschina2013)Emerge是一个监测和减少应用程序大小的平台,可以持续监测并分析应用程序二进制大小,帮助开发者编写更小、更好的代码。近日Emerge发布了一份报告,显示最新版本的Xcode存在会无意中增加应用程序体积的问题。Xcode14于今年9月份正式发布,新版本添加了对Swift5.7的支持,并针对macO...

绘图小结

发布时间:2014-06-13 IOS
CGContextRef context= UIGraphicsGetCurrentContext(); //设置上下文    //画一条线    CGContextSetStrokeColorWithColor(context,[UIColor redColor].CGColor);//线条颜色    CGContextSetLineWidth(context, 5.0);//线条宽度    C...

OPengl学习(一)——初识opengl

发布时间:2022-11-28 学习 2D/3D显示 OPENGL
**OpenGL(OpenGraphicsLibrary)*是一个跨编程语言、跨平台的编程图形程序接口,它将计算机的资源抽象称为一个个OpenGL的对象,对这些资源的操作抽象为一个个的OpenGL指令。OpenGLES(OpenGLforEmbeddedSystems)是OpenGL三维图形API的子集,针对手机、PDA和游戏主机等嵌入式设备而设计,去除了许多不必要和性能较低的API接口。Open...

彩色星球科技冠名著名钢琴艺术家吴牧野世界巡演《肖邦圆舞曲全集》长沙站演出...

发布时间:2020-11-03 微软 LESS QML ARCGIS IOS
近日,专业从事娱乐文化科技服务的彩色星球科技公司(纳斯达克代码:CSCW以下简称:彩色星球)正式宣布,11月15号将冠名国际著名钢琴艺术家吴牧野的钢琴独奏世界巡演《肖邦圆舞曲全集》长沙站的演出。11/15吴牧野《肖邦圆舞曲全集》独奏世界巡演长沙站吴牧野吴牧野先生毕业于法国巴黎国立高等音乐学院,师从钢琴史上最伟大钢琴家FranzLiszt的直系血脉传人、法国钢琴正统学派大师JacquesRouvie...