有大神能给我解释一下这个table么………完全真看不懂新浪博客啊

有哪位大神可以帮小弟我解释一下这段代码吗
&来源:读书人网&【读书人网():综合教育门户网站】
有哪位大神可以帮我解释一下这段代码吗?//
有哪位大神可以帮我解释一下这段代码吗?//============================================================================//&Name&&&&&&&&:&KinectTouch.cpp//&Author&&&&&&:&/robbeofficial//&Version&&&&&:&0.something//&Description&:&recognizes&touch&points&on&arbitrary&surfaces&using&kinect//&&and&maps&them&to&TUIO&cursors//&&(turns&any&surface&into&a&touchpad)//============================================================================*&*&1.&point&your&kinect&from&a&higher&place&down&to&your&table&*&2.&start&the&program&(keep&your&hands&off&the&table&for&the&beginning)&*&3.&use&your&table&as&a&giant&touchpad&*/#include&&iostream&#include&&vector&#include&&map&using&namespace&//&openCV#include&&opencv/highgui.h&#include&&opencv/cv.h&using&namespace&//&openNI#include&&XnOpenNI.h&#include&&XnCppWrapper.h&using&namespace&#define&CHECK_RC(rc,&what)\if&(rc&!=&XN_STATUS_OK)\{\printf("%s&failed:&%s\n",&what,&xnGetStatusString(rc));\return&\}//&TUIO#include&"TUIO/TuioServer.h"using&namespace&TUIO;//&TODO&smoothing&using&kalman&filter//---------------------------------------------------------------------------//&Globals//---------------------------------------------------------------------------//&OpenNIxn::Context&xnCxn::DepthGenerator&xnDepthGxn::ImageGenerator&xnImgeGbool&mousePressed&=&//---------------------------------------------------------------------------//&Functions//---------------------------------------------------------------------------int&initOpenNI(const&XnChar*&fname)&{XnStatus&nRetVal&=&XN_STATUS_OK;//&initialize&contextnRetVal&=&xnContext.InitFromXmlFile(fname);CHECK_RC(nRetVal,&"InitFromXmlFile");//&initialize&depth&generatornRetVal&=&xnContext.FindExistingNode(XN_NODE_TYPE_DEPTH,&xnDepthGenerator);CHECK_RC(nRetVal,&"FindExistingNode(XN_NODE_TYPE_DEPTH)");//&initialize&image&generatornRetVal&=&xnContext.FindExistingNode(XN_NODE_TYPE_IMAGE,&xnImgeGenertor);CHECK_RC(nRetVal,&"FindExistingNode(XN_NODE_TYPE_IMAGE)");return&0;}void&average(vector&Mat1s&&&frames,&Mat1s&&mean)&{Mat1d&acc(mean.size());Mat1d&frame(mean.size());for&(unsigned&int&i=0;&i&frames.size();&i++)&{frames[i].convertTo(frame,&CV_64FC1);acc&=&acc&+&}acc&=&acc&/&frames.size();acc.convertTo(mean,&CV_16SC1);}int&main()&{const&unsigned&int&nBackgroundTrain&=&30;const&unsigned&short&touchDepthMin&=&10;const&unsigned&short&touchDepthMax&=&20;const&unsigned&int&touchMinArea&=&50;const&bool&localClientMode&=&&//&connect&to&a&local&clientconst&double&debugFrameMaxDepth&=&4000;&//&maximal&distance&(in&millimeters)&for&8&bit&debug&depth&frame&quantizationconst&char*&windowName&=&"Debug";const&Scalar&debugColor0(0,0,128);const&Scalar&debugColor1(255,0,0);const&Scalar&debugColor2(255,255,255);int&xMin&=&110;int&xMax&=&560;int&yMin&=&120;int&yMax&=&320;Mat1s&depth(480,&640);&//&16&bit&depth&(in&millimeters)&&&&&&&&//&&&&&&typedef&Mat_&short&&Mat1s;Mat1b&depth8(480,&640);&//&8&bit&depth&&&//&&&&&&typedef&Mat_&uchar&&Mat1b;//Mat3b&rgb(480,&640);&//&8&bit&depth&&&//&&&typedef&Mat_&Vec3b&&Mat3b;Mat3b&debug(480,&640);&//&debug&visualization&&&//Mat1s&foreground(640,&480);Mat1b&foreground8(640,&480);Mat1b&touch(640,&480);&//&touch&maskMat1s&background(480,&640);vector&Mat1s&&buffer(nBackgroundTrain);initOpenNI("niConfig.xml");////&TUIO&server&object//TuioServer*&//if&(localClientMode)&{//tuio&=&new&TuioServer();
//}&else&{//tuio&=&new&TuioServer("192.168.0.2",3333,false);//}//TuioTime&//&create&some&sliders/*namedWindow(windowName);createTrackbar("xMin",&windowName,&&xMin,&640);createTrackbar("xMax",&windowName,&&xMax,&640);createTrackbar("yMin",&windowName,&&yMin,&480);createTrackbar("yMax",&windowName,&&yMax,&480);*///&create&background&model&(average&depth)for&(unsigned&int&i=0;&i&nBackgroundT&i++)&{xnContext.WaitAndUpdateAll();depth.data&=&(uchar*)&xnDepthGenerator.GetDepthMap();buffer[i]&=&}average(buffer,&background);while&(&waitKey(1)&!=&27&)&{//&read&available&dataxnContext.WaitAndUpdateAll();//&update&16&bit&depth&matrixdepth.data&=&(uchar*)&xnDepthGenerator.GetDepthMap();//xnImgeGenertor.GetGrayscale8ImageMap()//&update&rgb&image//rgb.data&=&(uchar*)&xnImgeGenertor.GetRGB24ImageMap();&//&segmentation&fault&here//cvtColor(rgb,&rgb,&CV_RGB2BGR);//&extract&foreground&by&simple&subtraction&of&very&basic&background&modelforeground&=&background&-&//&find&touch&mask&by&thresholding&(points&that&are&close&to&background&=&touch&points)touch&=&(foreground&&&touchDepthMin)&&&(foreground&&&touchDepthMax);//&extract&ROIRect&roi(xMin,&yMin,&xMax&-&xMin,&yMax&-&yMin);Mat&touchRoi&=&touch(roi);//&find&touch&pointsvector&&vector&Point2i&&&&vector&Point2f&&touchPfindContours(touchRoi,&contours,&CV_RETR_LIST,&CV_CHAIN_APPROX_SIMPLE,&Point2i(xMin,&yMin));for&(unsigned&int&i=0;&i&contours.size();&i++)&{Mat&contourMat(contours[i]);//&find&touch&points&by&area&thresholdingif&(&contourArea(contourMat)&&&touchMinArea&)&{Scalar&center&=&mean(contourMat);Point2i&touchPoint(center[0],&center[1]);touchPoints.push_back(touchPoint);}}//&send&TUIO&cursorstime&=&TuioTime::getSessionTime();tuio-&initFrame(time);for&(unsigned&int&i=0;&i&touchPoints.size();&i++)&{&//&touch&pointsfloat&cursorX&=&(touchPoints[i].x&-&xMin)&/&(xMax&-&xMin);float&cursorY&=&1&-&(touchPoints[i].y&-&yMin)/(yMax&-&yMin);TuioCursor*&cursor&=&tuio-&getClosestTuioCursor(cursorX,cursorY);//&TODO&improve&tracking&(don't&move&cursors&away,&that&might&be&closer&to&another&touch&point)if&(cursor&==&NULL&||&cursor-&getTuioTime()&==&time)&{tuio-&addTuioCursor(cursorX,cursorY);}&else&{tuio-&updateTuioCursor(cursor,&cursorX,&cursorY);}}tuio-&stopUntouchedMovingCursors();tuio-&removeUntouchedStoppedCursors();tuio-&commitFrame();//&draw&debug&framedepth.convertTo(depth8,&CV_8U,&255&/&debugFrameMaxDepth);&//&render&depth&to&debug&framecvtColor(depth8,&debug,&CV_GRAY2BGR);debug.setTo(debugColor0,&touch);&&//&touch&maskrectangle(debug,&roi,&debugColor1,&2);&//&surface&boundariesfor&(unsigned&int&i=0;&i&touchPoints.size();&i++)&{&//&touch&pointscircle(debug,&touchPoints[i],&5,&debugColor2,&CV_FILLED);}//&render&debug&frame&(with&sliders)imshow(windowName,&debug);//imshow("image",&rgb);}return&0;}
我觉得应该是没人给你解释的[解决办法]注释已经写的很清楚了:
//&Description&:&recognizes&touch&points&on&arbitrary&surfaces&using&kinect//&&and&maps&them&to&TUIO&cursors//&&(turns&any&surface&into&a&touchpad)引用://============================================================================//&Name&&&&&&&&:&KinectTouch.cpp//&Author&&&&&&:&/robbeofficial//&Version&&&&&:&0.something//&Description&:&recognizes&touch&points&on&arbitrary&surfaces&using&kinect//&&and&maps&them&to&TUIO&cursors//&&(turns&any&surface&into&a&touchpad)//============================================================================*&*&1.&point&your&kinect&from&a&higher&place&down&to&your&table&*&2.&start&the&program&(keep&your&hands&off&the&table&for&the&beginning)&*&3.&use&your&table&as&a&giant&touchpad&*/#include&&iostream&#include&&vector&#include&&map&using&namespace&//&openCV#include&&opencv/highgui.h&#include&&opencv/cv.h&using&namespace&//&openNI#include&&XnOpenNI.h&#include&&XnCppWrapper.h&using&namespace&#define&CHECK_RC(rc,&what)\if&(rc&!=&XN_STATUS_OK)\{\printf("%s&failed:&%s\n",&what,&xnGetStatusString(rc));\return&\}//&TUIO#include&"TUIO/TuioServer.h"using&namespace&TUIO;//&TODO&smoothing&using&kalman&filter//---------------------------------------------------------------------------//&Globals//---------------------------------------------------------------------------//&OpenNIxn::Context&xnCxn::DepthGenerator&xnDepthGxn::ImageGenerator&xnImgeGbool&mousePressed&=&//---------------------------------------------------------------------------//&Functions//---------------------------------------------------------------------------int&initOpenNI(const&XnChar*&fname)&{XnStatus&nRetVal&=&XN_STATUS_OK;//&initialize&contextnRetVal&=&xnContext.InitFromXmlFile(fname);CHECK_RC(nRetVal,&"InitFromXmlFile");//&initialize&depth&generatornRetVal&=&xnContext.FindExistingNode(XN_NODE_TYPE_DEPTH,&xnDepthGenerator);CHECK_RC(nRetVal,&"FindExistingNode(XN_NODE_TYPE_DEPTH)");//&initialize&image&generatornRetVal&=&xnContext.FindExistingNode(XN_NODE_TYPE_IMAGE,&xnImgeGenertor);CHECK_RC(nRetVal,&"FindExistingNode(XN_NODE_TYPE_IMAGE)");return&0;}void&average(vector&Mat1s&&&frames,&Mat1s&&mean)&{Mat1d&acc(mean.size());Mat1d&frame(mean.size());for&(unsigned&int&i=0;&i&frames.size();&i++)&{frames[i].convertTo(frame,&CV_64FC1);acc&=&acc&+&}acc&=&acc&/&frames.size();acc.convertTo(mean,&CV_16SC1);}int&main()&{const&unsigned&int&nBackgroundTrain&=&30;const&unsigned&short&touchDepthMin&=&10;const&unsigned&short&touchDepthMax&=&20;const&unsigned&int&touchMinArea&=&50;const&bool&localClientMode&=&&//&connect&to&a&local&clientconst&double&debugFrameMaxDepth&=&4000;&//&maximal&distance&(in&millimeters)&for&8&bit&debug&depth&frame&quantizationconst&char*&windowName&=&"Debug";const&Scalar&debugColor0(0,0,128);const&Scalar&debugColor1(255,0,0);const&Scalar&debugColor2(255,255,255);int&xMin&=&110;int&xMax&=&560;int&yMin&=&120;int&yMax&=&320;Mat1s&depth(480,&640);&//&16&bit&depth&(in&millimeters)&&&&&&&&//&&&&&&typedef&Mat_&short&&Mat1s;Mat1b&depth8(480,&640);&//&8&bit&depth&&&//&&&&&&typedef&Mat_&uchar&&Mat1b;//Mat3b&rgb(480,&640);&//&8&bit&depth&&&//&&&typedef&Mat_&Vec3b&&Mat3b;Mat3b&debug(480,&640);&//&debug&visualization&&&//Mat1s&foreground(640,&480);Mat1b&foreground8(640,&480);
Mat1b&touch(640,&480);&//&touch&maskMat1s&background(480,&640);vector&Mat1s&&buffer(nBackgroundTrain);initOpenNI("niConfig.xml");////&TUIO&server&object//TuioServer*&//if&(localClientMode)&{//tuio&=&new&TuioServer();//}&else&{//tuio&=&new&TuioServer("192.168.0.2",3333,false);//}//TuioTime&//&create&some&sliders/*namedWindow(windowName);createTrackbar("xMin",&windowName,&&xMin,&640);createTrackbar("xMax",&windowName,&&xMax,&640);createTrackbar("yMin",&windowName,&&yMin,&480);createTrackbar("yMax",&windowName,&&yMax,&480);*///&create&background&model&(average&depth)for&(unsigned&int&i=0;&i&nBackgroundT&i++)&{xnContext.WaitAndUpdateAll();depth.data&=&(uchar*)&xnDepthGenerator.GetDepthMap();buffer[i]&=&}average(buffer,&background);while&(&waitKey(1)&!=&27&)&{//&read&available&dataxnContext.WaitAndUpdateAll();//&update&16&bit&depth&matrixdepth.data&=&(uchar*)&xnDepthGenerator.GetDepthMap();//xnImgeGenertor.GetGrayscale8ImageMap()//&update&rgb&image//rgb.data&=&(uchar*)&xnImgeGenertor.GetRGB24ImageMap();&//&segmentation&fault&here//cvtColor(rgb,&rgb,&CV_RGB2BGR);//&extract&foreground&by&simple&subtraction&of&very&basic&background&modelforeground&=&background&-&//&find&touch&mask&by&thresholding&(points&that&are&close&to&background&=&touch&points)touch&=&(foreground&&&touchDepthMin)&&&(foreground&&&touchDepthMax);//&extract&ROIRect&roi(xMin,&yMin,&xMax&-&xMin,&yMax&-&yMin);Mat&touchRoi&=&touch(roi);//&find&touch&pointsvector&&vector&Point2i&&&&vector&Point2f&&touchPfindContours(touchRoi,&contours,&CV_RETR_LIST,&CV_CHAIN_APPROX_SIMPLE,&Point2i(xMin,&yMin));for&(unsigned&int&i=0;&i&contours.size();&i++)&{Mat&contourMat(contours[i]);//&find&touch&points&by&area&thresholdingif&(&contourArea(contourMat)&&&touchMinArea&)&{Scalar&center&=&mean(contourMat);Point2i&touchPoint(center[0],&center[1]);touchPoints.push_back(touchPoint);}}//&send&TUIO&cursorstime&=&TuioTime::getSessionTime();tuio-&initFrame(time);for&(unsigned&int&i=0;&i&touchPoints.size();&i++)&{&//&touch&pointsfloat&cursorX&=&(touchPoints[i].x&-&xMin)&/&(xMax&-&xMin);float&cursorY&=&1&-&(touchPoints[i].y&-&yMin)/(yMax&-&yMin);TuioCursor*&cursor&=&tuio-&getClosestTuioCursor(cursorX,cursorY);//&TODO&improve&tracking&(don't&move&cursors&away,&that&might&be&closer&to&another&touch&point)if&(cursor&==&NULL&[解决办法]&cursor-&getTuioTime()&==&time)&{tuio-&addTuioCursor(cursorX,cursorY);}&else&{tuio-&updateTuioCursor(cursor,&cursorX,&cursorY);}}tuio-&stopUntouchedMovingCursors();tuio-&removeUntouchedStoppedCursors();tuio-&commitFrame();//&draw&debug&framedepth.convertTo(depth8,&CV_8U,&255&/&debugFrameMaxDepth);&//&render&depth&to&debug&framecvtColor(depth8,&debug,&CV_GRAY2BGR);debug.setTo(debugColor0,&touch);&&//&touch&maskrectangle(debug,&roi,&debugColor1,&2);&//&surface&boundariesfor&(unsigned&int&i=0;&i&touchPoints.size();&i++)&{&//&touch&pointscircle(debug,&touchPoints[i],&5,&debugColor2,&CV_FILLED);}//&render&debug&frame&(with&sliders)imshow(windowName,&debug);//imshow("image",&rgb);}return&0;}[解决办法]recognizes&touch&points&on&arbitrary&surfaces&using&kinect&&and&maps&them&to&TUIO&cursors&&(turns&any&surface&into&a&touchpad)苹果Xcode帮助文档阅读指南
| 更新于 8月前
一直想写这么一个东西,长期以来我发现很多初学者的问题在于不掌握学习的方法,所以,Xcode那么好的SDK文档摆在那里,对他们也起不到什么太大的作用。从论坛、微博等等地方看到的初学者提出的问题,也暴露出他们不知道很多他们的疑惑其实在文档里面写的非常清楚。而有时候。或者有些人意识到了,。
中国的技术社区有一个很没意思的毛病,就是技术深了,看不懂骂不知所云,技术浅了,看得懂骂没有技术含量。不过管那么孙子做啥,对于现在可能还不知道怎么阅读文档的人,希望这篇文章有所教益吧。
Xcode文档的结构
如上图,打开后,整个文档界面有左面的侧栏和右面的内容区域构成。左面的侧栏可以选择不同的文档库。你的Xcode里面一般来说有一组不同版本的iOS文档库、一组不同版本的OS X文档库,以及一个Xcode文档库。
如果你这里没有你要查看的文档库,你可以选择Xcode的Preferences菜单,然后选择Downloads -> Documentation。在这里可以看到已经下载安装了的文档库,还没有下载的文档库,可以酌情选择。如下图:
然后我们看,文档内容区域的左侧导航区域,这里揭示了文档库的结构。如下图:
首先是,Resource Types,也就是资源类型。文档库里面全部的文档都是这几个类型中的一个:
Getting Started —— 新手入门,一般来说,是给完全的新手看的。建议初学者看看,这里面有一些建立观念的东西,有了这些建立观念的东西,后面的学习就比较容易了。
Guides —— 指南,指南是Xcode里面最酷最好的部分,学会看指南则大多数情况完全不用买书。Xcode文档里面的指南,就是一个一个问题的,从一个问题,或者系统的一个方面出发,一步一步详细介绍怎么使用Cocoa库的文档。一般程序员比较熟悉的是Reference,就是你查某个类、方法、函数的文档时候,冒出来的东西。那些其实是一点一点的细碎知识,光看那些东西就完全没有脉络。而Guides就是帮你整理好的学习的脉络。
Reference —— 参考资料。一个一个框架一个一个类组织起来的文档,包含了每个方法的使用方法。
Release Notes —— 发布说明。一个iOS新版本带来了哪些新特性,这样的信息,熟悉新iOS,比较不同iOS版本API不同,都需要参考这些文档。
Sample Code —— 示例代码。苹果官方提供的一些示例代码,帮助你学习某些技术某些API。非常强烈建议学习的时候参考,一方面光看文档有时候还是很难弄明白具体实现是怎么回事儿。另外一方面这些示例代码都是苹果的工程师写的,你从示例代码的变迁可以看到苹果官方推荐的代码风格流变。
Technical Notes —— 技术说明。一些技术主题文章,有空的时候可以浏览一下。往往会有一些收获。
Technical Q&A —— 常见技术问答。这是技术社区里面一些常见问题以及回答的整理。
Video —— 视频。目前主要是WWDC的视频,实际上是登录到开发者网站上去浏览的,这里就是快捷方式。想深入学习的话,一定不能错过,大量的看,不仅可以学好技术,还可以练好英文。
总结一下,这里面的Reference、Release Notes、Sample Code、Technical Notes、Technical Q&A,一般来说只是备查的。主要要看的是Getting Started和Guides。
然后下面是Topics,也就是话题,被分为:
Audio & Video —— 音视频
Languages & Utilities —— 语言和工具,Objective-C的一些知识,App Store的管理工具等。
Mathematical Computation —— 数学计算。
Data Management —— 数据管理。
General —— 一般性的问题。
Graphics & Animation —— 图形和动画。
Networking & Internet —— 网络问题。
Performance —— 性能。
Security —— 安全。
User Experience —— 用户体验。
这里不多说,大多数都是顾名思义的问题。但是值得一提的就是有很多初学者说,我想好好了解下图形和动画的技术,但是文档里面找不到,这就只能说,你睁着大大的眼睛,为毛左看右看看不到呢?
最下面是Frameworks(框架),分为:
Cocoa Touch Layer
Media Layer
Core Services Layer
Core OS Layer
这里我们先不讨论这个东西,后面会仔细讲。
总体来说左边的导航区域就是用三种不同的维度,来帮你精准定位你需要的内容。
现在我们看内容区域的右边。注意上面的文档过滤器。如下图:
假设,你现在想看关于性能方面的Guides,那么你应该做的就是在左面的导航,点击Topics -> Performance,然后在右边的文档过滤器上面输入Guides。或者你也可以在左边的导航,点击 Resource Types -> Guides,然后在文档过滤器里面输入 Performance。
熟练使用导航和文档过滤器的话,学习就会非常方便快捷。
猜你喜欢:
共149条回复
| 更新于 8月前
前面我们讲Xcode的文档结构是在介绍如何能够快速定位到你要找的内容。但是很多人的问题可能是一开始就根本不知道要读什么。
这里我们就介绍自学iOS开发应该遵循或者说我们推荐的必读文档的阅读顺序。
阅读顺序:
《马上着手开发 iOS 应用程序 (Start Developing iOS Apps Today)》
《Your First iOS App》
《Your Second iOS App: Storyboards》
《Your Third iOS App: iCloud》
《iOS Technology Overview》
《iOS Human Interface Guidelines》
《Learning Objective-C: A Primer》和《Programming with Objective-C》
《iOS App Programming Guide》
《View Programming Guide for iOS》和《View Controller Programming Guide for iOS》
《Table View Programming Guide for iOS》
首先应该看的是Getting Started里面的《马上着手开发 iOS 应用程序 (Start Developing iOS Apps Today)》(中英文版本皆有,苹果官方的翻译)。这个文档讲的很浅,但是是建立概念的文档,你以后在开发里面经常遇到的概念,在这里都有包含,特别注意是,这个文档看起来简单,但是每页下面的相关文章,不是选读,都是必读。
即使是很多做了iOS开发很久的同学,其实也有很多概念上的误解,现代程序开发越来越简单,工具越来越强大,往往有些误解也可以继续前行,但是实际上不建立扎实的基础是很吃亏的,往往后面理解和解决一个不难解决小问题都要付出很多辛苦。
阅读这个文档的目的和检测标准是,以后你看到iOS开发中的基本概念,都大致所有了解。
读完《马上着手开发 iOS 应用程序 (Start Developing iOS Apps Today)》后,应该去看Your XXX iOS App系列这个系列不是什么很难的文章,你也不必着急先去学习Objective-C,学什么C语言就更不要着急。我推荐的学习方法是有成就的逐步学习法。在学习系统体系架构、Objective-C之前,你可以先按照文档写一个全天下最简单的App,完成学习过程中第一个里程碑。在这个过程中不用担心有什么疑问,有什么不懂,先照着做就是。
阅读这三个文档的目的和检测标准是,把这三个Demo App做出来在模拟器上跑起来。
在这个过程中,你对开发工具的基本认识就建立起来了,也有了成就感,去了魅(就是消除了对iOS开发的神秘感)。
再往下,建议你去看《iOS Technology Overview》(iOS技术概览),iOS不是一个技术,而是一堆技术,前一篇讲到文档导航区域的分类,框架分类的时候,我说不细讲的原因就在于此,你要做一个动画应该用Core Animation还是OpenGL?你要做一些文本相关操作应该用Core Text还是什么,就是看这里。
学习现代的程序开发,语言和框架并重。我们Tiny4Cocoa叫做这个名字的原因就是,iOS/Mac开发者的代表往往就是这个Cocoa框架,就是这个SDK。大多数你所需要的功能都躺在框架里面,你知道框架的结构,你才知道怎么去寻找相关的技术资料。
阅读这个文档的目的和检测标准是,遇到具体问题,知道应该去看哪方面的文档。
再下来,建议阅读的是《iOS Human Interface Guidelines》,Mac/iOS平台虽然也是百花齐放各类程序、App都有,但是总体看来,大多数优秀App的UI看起来都和整个系统很协调。这和Windows以及很多其他平台完全不同。这是为什么呢?
很大程度就归功于《Human Interface Guidelines》文化,所谓Human Interface Guidelines就是用户界面的规范,在苹果它还专门有一个缩写叫做HIG,是天条一样的东西。所有的App都推荐遵循HIG,遵循了HIG,你做的东西用户看起来就会觉得和整个系统很协调。即使是你要做一些创新的设计,你势必会打破HIG的限制,但是你这个时候仍旧应该遵循HIG的精神。
此外,你阅读HIG的很重要一点是了解整个UI结构和UE行为的逻辑机理,这样才能在你设计界面的时候有所依据。
阅读这个文档的目的和检测标准是,看到任何一个App,你可以知道它的任何一个UI是系统控件,还是自定义控件,它的层次关系等等。
《Learning Objective-C: A Primer》是非常初级和简单的入门,适合先阅读。《Programming with Objective-C》超微复杂一点点,适合后阅读。
一般人建议先学习语言,我反之建议先做了一个App,然后再学习语言。原因有几个,首先现代开发工具,往往不是用来开发控制台程序的,上来就会有框架,光懂语言不会使用IDE,甚至可能会更麻烦。再其次就是,其实现代语言发展到了面向对象以后,库往往比语言更复杂,更重要,或者说更多的时候,我们是在学习库,而不是语言,语言只是库的一个载体。
比如,Delegate和Block等等都和Cocoa的UI异步机制关系紧密,光看代码,这些语言元素非常难以学习,也完全不知道其意义在哪里。
阅读这个文档的目的和检测标准是,看得懂基本的Objective-C代码,方便后面的学习和阅读各种示例代码。
《iOS App Programming Guide》基本上介绍的就是开发一个App的完整流程,包括App的生命周期、休眠、激活等等,里面介绍的细节颇多。正式开发第一个上线的App之前必看。或者开发了一个App,临到提交前必看才文档。
阅读这个文档的目的和检测标准是,了解全部流程和很多细节问题。
《View Programming Guide for iOS》和《View Controller Programming Guide for iOS》非常重要。View是整个图形界面里面最重要的概念。所有的图形、界面绘制都基于View。你看到的一切复杂的用户界面,就是各种不同的View的组合堆叠。
View Controller是View和某种逻辑在一起的组合,本质上这种组合不是必须的,但是是大大降低编程复杂度的一种设计。很多人不懂什么是View什么是View Controller,这样写起代码来就很痛苦。
阅读这个文档的目的和检测标准是,深刻理解什么是View,什么是View Controller,理解什么情况用View,什么情况用View Controller。
UITableView是最重要的一个控件,是最常用的UI界面元素。在UICollectionView出现之前,大量的内容列表展示的自定义控件都是基于UITableView,比如很多书架、图片Grid其实都是UITableView做的。
所以《Table View Programming Guide for iOS》非常重要,一定要好好阅读。
阅读这个文档的目的和检测标准是,深刻理解UITableView/UITableViewController的理论和使用方法。
我推荐的必读文档就这么多,仔细看的话,最多也就是今天就看完了。学习一个东西,如果有一点点耐心,有正确的方法其实不难,不是说脑子非要很聪明,大多数人都可以做到一个星期就学会iOS开发,其实就是读完这些文档,大多数人就会了。
就像我强调了无数次,阅读英文文档不难,我自己从当年看英文文档非常吃力,必须查词典开始,认真的看英文文档,不会就查词典,一个多月过去,读英文文档就完全不需要查词典了。
我们公司主程 @ 老师,也说他原来英语也很不好,甚至现在英语仍旧很烂,但是看英文文档完全没有问题,也就是几个星期的认真学习以后就突破了。
其实学习iOS也如此。当然我不是说你看懂这10组文档就再也不用看别的了。而是说,如果你看懂了这10组文档,你就从初学者,或者是虽然会写一些程序,但是对iOS其实还不懂的状态,变成了一个入门者。
我不希望这个文章可以一句一句的帮你学会iOS是什么,这个文章的目的是帮你快速入门。一旦你入门了,你再遇到问题该看什么,你就不需要我讲了,你自己就知道了。一旦入门了,你就会发现,Xcode里面别的文档讲的内容虽然不同,但是结构你已经很清楚了,你学习起来很方便。
阅读本文的目的和检测标准是,遇到问题,知道看什么文档,想提升自己技术的时候,知道按照什么脉络自己组织阅读。
| 更新于 8月前
如何查询文档
Quick Help
最快捷的查询帮助文档的方法是不需要键入任何关键词的。你只需要在Xcode代码编辑器里,按住Option键,然后点击你想查询的关键词,就会获得关键词的帮助信息。如下图:
帮助信息会包括,一些简单的描述、哪个iOS操作系统开始提供,头文件,参考文档。头文件和参考文档是可以直接点击的。
即使你点击的关键字不是Cocoa库的内容,是自己代码里面的类或者方法,也可以获得相关的定义信息。如下图:
与之相关的热键是Command键加鼠标点击,即可跳到任何一个类名或者方法名的所定义的头文件。
快速查询帮助的另外一个方法是直接打开Quick Help栏,如下图,首先找到“右侧栏开关”,然后找到“Quick Help”开关即可打开。
Quick Help栏的作用机制是,只要它在打开状态,只要输入光标在什么关键字上,Quick Help栏就会显示跟关键字相关的简要帮助信息,跟Option键加点击的信息基本一致,但可能略微丰富一点。
写代码的时候,在大多数情况下,查询下快速帮助,看看头文件,就足以了。
文档阅读界面最左面的上端的放大镜按钮就是搜索界面。下图是我们搜索uiimage,得到的搜索结果。
首先值得注意的是,结果也是分类的,分为Reference、System Guides、Tools Guides、Sample Code这四类。类别很利于我们快速找到我们需要的信息。前面已经介绍过类别,跟那个基本一致,参照即可。
另外需要注意的是,搜索框下面的选项,首先是Hits Must(什么样的结果才会命中),包含了三项:
contain search term 这是最常见的就是结果包含搜索词
start with search term 由搜索词开始
match search term 必须完全匹配搜索词
然后是Languages(语言选项),包含Javascript、C++、Java、Objective-C、C语言。
然后是,Find in(在哪些文档库搜索),包含了你Xcode里面安装的全部文档库。
最后,我们简单介绍下怎么阅读文档。文档的阅读界面如下图:
值得注意的是,标题下面这几样:
Inherits from
继承关系,继承自
Conforms to 遵循什么协议
Framework 属于什么框架
Availability 从什么iOS版本开始支持
Declared in 头文件
Related sample code 相关例子代码
Companion guide 相关的指南(UIImage没有,很多其他的类有)
在其次一个很重要的东西,其实是标题上面那一条窄窄的导航栏,那是一个多层树状导航栏,看文档的时候,可以点击那个栏的不同位置浏览。
其实这个栏包含了整个文档库的组织结构树状图,可惜只有在这个界面才能浏览。有兴趣的可以慢慢浏览,里面信息量其实非常大。
前排广告招租。
这个帖子太好了:)期待更新啊:)
对你的感谢真想用星爷的一句话来表达。......
对于真正要入学iOS者,真的非常有用,因为她的学习跟其他的学习真的太不相同了。本身的reference太丰富,太好了!很多人都不知道学习的方法。
期待。。。。。
现在流行的语言或者技术,其提供的文章是最好的学习资料。
其实,有自学能力的同学就应该好好吃提供的文档,其他的书籍资料倒不是非常推荐!
Xcode里的文档还是相当齐全的,很多人懒得看大概主要是因为英文吧。
这个真的很帮忙!
这个整理对于想进一步写好IOS的人来说真的很有帮助啊。
本帖有149个回复,因为您没有注册或者登录本站,所以,只能看到本帖的10条回复。如果想看到全部回复,请注册或者登录本站。
),然后在出现的“enter code here”处贴入你的代码。
回复特定回复的时候,请点击该回复右侧的回复链接,系统将自动创建楼号和@通知。
@他人的时候注意,id后面请加一个空格。
使用左侧工具栏“贴链接”按钮()创建的优酷、土豆、youtube视频链接,将自动生成播放区域,不需要使用其他包含方式。
如果要创作长篇格式复杂的帖子,本站建议Mac用户使用,离线写好,贴入即可。

我要回帖

更多关于 一张图片几亿人看不懂 的文章

 

随机推荐