IOS开发 HTTP请求返回417 “Expectation Failed” 问题分析

IOS开发 HTTP请求返回417 “Expectation Failed” 问题分析

我们使用AFNetWorking请求时候,出现HTTP请求返回417 “Expectation Failed” 问题,我们必须查找具体原因。


(lldb) po error Error Domain=NSCocoaErrorDomain Code=3840 "Invalid value around character 1." UserInfo={NSDebugDescription=Invalid value around character 1., NSUnderlyingError=0x1c4443000 {Error Domain=com.alamofire.error.serialization.response Code=-1011 "Request failed: expectation failed (417)" UserInfo={NSLocalizedDescription=Request failed: expectation failed (417), NSErrorFailingURLKey=http://www.jiejiedian.com/, com.alamofire.serialization.response.error.data=<0a232323 20457272 6f722075 70646174 696e6720 64617461 62617365 2e202043 61757365 3a20636f 6d2e6d79 73716c2e 6a646263 74612074 72756e63 6174696f 6e3a204f 7574206f 66207261 6e676520 76616c75 6520666f 7220636f 6c756d6e 20275742 5f562720 61742072 6f772031 5f555345 5345525f 4e442855 525f4249 49442c20 4c4f4749 4e5f5459 50452c20 4150505f 49442c20 50484f4e 452c2057 585f4f50 454e5f49 442c2020 2057585f 554e494f 4e5f4944 2c205758 5f4e414d 452c2057 585f4156 41544152 2c204745 4e444552 2c205052 4f56494e 43452c20 43495459 2c205758 5f484944 44454e2c 20202057 425f5549 442c2057 425f562c 2057425f 56532c20 57425f4e 414d452c 2057425f 41564154 41522c20 57425f47 2c205742 5f484944 44454e2c 20435245 4154455f 41542c20 20205550 44415445 5f41542c 2056414e 4b455f49 44202920 20207661 6c756528 3f2c203f 2c203f2c 2020203f 2c202020 3f2c2020 203f2c20 3f2c203f 2c203f2c 2020203f 2c202020 3f2c3f2c 3f2c3f2c 203f2c20 3f2c2020 203f2c20 3f2c2020 203f2c20 6e6f7728 292c206e 6f772829 2c203f20 290a2323 23204361 7573653a 20636f6d 2e6d7973 716c2e6a 6462632e 4d797371 6c446174 61547275 6e636174 696f6e3a 20446174 61207472 756e6361 74696f6e 3a204f75 74206f66 2072616e 67652076 616c7565 20666f72 20636f6c 756d6e20 2757425f 56272061 7420726f 7720310a 3b205351 4c205b5d 3b204461 74612074 72756e63 6174696f 6e3a204f 7574206f 66207261 6e676520 76616c75 6520666f 7220636f 6c756d6e 20275742 5f562720 61742072 6f772031 3b206e65 73746564 20657863 65707469 6f6e2069 7320636f 6d2e6d79 73716c2e 6a646263 2e4d7973 716c4461 74615472 756e6361 74696f6e 3a204461 6f772031>, com.alamofire.serialization.response.error.response=<NSHTTPURLResponse: 0x1c4230440> { URL: http://www.jiejiedian.com/ } { Status Code: 417, Headers { Connection = ( "keep-alive" ); "Content-Length" = ( 868 ); "Content-Type" = ( "text/plain;charset=ISO-8859-1" ); Date = ( "Thu, 12 Apr 2018 03:23:49 GMT" ); Server = ( openresty ); } }}}}

这时候我们需要了解到上面的com.alamofire.serialization.response.error.data的具体内容表示什么意思?我们需要做一下操作将NSData获取到,然后转换成NSString,具体操作如下


task = [_httpSessionManager dataTaskWithRequest:request completionHandler:^(NSURLResponse * _Nonnull response, id _Nullable responseObject, NSError * _Nullable error); 第一步、首先从error根据NSErrorFailingURLKey拿到value NSError *errorFail = [error.userInfo objectForKey:@"NSErrorFailingURLKey"]; 第二步、通过errorFail根据com.alamofire.serialization.response.error.data拿到value NSData *data = [errorFail.userInfo objectForKey:@"com.alamofire.serialization.response.error.data"]; 第三部、将NSData转成NSString,因为NSString字符串比较直观 NSString *errorString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

通过最后一步拿到的errorString,我们可以看出出现417 “Expectation Failed” 的具体原因。这次请求报错原因如下


//以下内容有省略,当然只要能看出原因就行了,当然出现这个错误,直接转到服务器端同学即可,MySql数据库操作出现问题 ### Error updating database. Cause: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Out of range value for column 'LOGIN_CURRENTTIME' at row 1 ### The error may involve defaultParameterMap ### The error occurred while setting parameters ### Cause: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Out of range value for column 'LOGIN_CURRENTTIME' at row 1 ; SQL []; Data truncation: Out of range value for column 'LOGIN_CURRENTTIME' at row 1; nested exception is com.mysql.jdbc.MysqlDataTruncation: Data truncation: Out of range value for column 'LOGIN_CURRENTTIME' at row 1

本文作为初学者的学习的记录,以便之后查阅。谢谢。

谢谢您的阅读,希望本站及文档能带给你帮助,给你带来简洁明了的阅读体验。谢谢。

本文地址:http://www.laileshuo.com/?p=1166

博客地址:www.laileshuo.com www.laileshuo.cn

JS判断是否安装APP

JS判断是否安装APP

通过url scheme 打开app成功,那么当前h5会进入后台,通过计时器会有明显延迟。利用时间来判断。


var button=document.getElementById("button"); var textarea=document.getElementById("text"); function openWindow (url){ var link = document.createElement('a'); link.target = "_blank"; link.href = url; document.body.appendChild(link); link.click(); document.body.removeChild(link); } function testApp(url) { var timeout, t = 1000, hasApp = true; setTimeout(function () { if (hasApp) { alert('安装了app'); } else { alert('未安装app'); } document.body.removeChild(ifr); }, 2000) var t1 = Date.now(); var ifr = document.createElement("iframe"); ifr.setAttribute('src', url); ifr.setAttribute('style', 'display:none'); document.body.appendChild(ifr); timeout = setTimeout(function () { var t2 = Date.now(); if (!t1 || t2 - t1 < t + 100) { hasApp = false; } }, t); } //打开(下载)App function openApp(){ var ua = window.navigator.userAgent.toLowerCase(); //微信 if(ua.match(/MicroMessenger/i) == 'micromessenger'){ alert('微信'); window.location.href='downLoadForPhone'; }else{//非微信浏览器 alert('非微信浏览器'); if (navigator.userAgent.match(/(iPhone|iPod|iPad);?/i)) { var loadDateTime = new Date(); window.setTimeout(function() { var timeOutDateTime = new Date(); if (timeOutDateTime - loadDateTime < 5000) { window.location = "";//ios下载地址 } else { window.close(); } },2000); openWindow('weixin://'); }else if (navigator.userAgent.match(/android/i)) { var state = null; try { window.location = 'schema://'; setTimeout(function(){ window.location= ""; //android下载地址 },500); } catch(e) {} } } } button.addEventListener('click',function(){ var con; con=confirm("点击好进行判断"); //在页面上弹出对话框 if(con==true) { openApp(); } else { };

如何判断是否是Android手机,iPhone设备,还是微信打开呢?下面给出一个object


/** * 客户端检测 */ export const JJDBrowserInfo = function() { var json = { userAgent: navigator.userAgent.toLowerCase(), isAndroid: Boolean(navigator.userAgent.match(/android/ig)), isIphone: Boolean(navigator.userAgent.match(/iphone|ipod/ig)), isIpad: Boolean(navigator.userAgent.match(/ipad/ig)), isWeixin: Boolean(navigator.userAgent.match(/MicroMessenger/ig)), } return json; }

本文作为初学者的学习的记录,以便之后查阅。谢谢。

谢谢您的阅读,希望本站及文档能带给你帮助,给你带来简洁明了的阅读体验。谢谢。

本文地址:http://www.laileshuo.com/?p=669

博客地址:www.laileshuo.com www.laileshuo.cn

Spring mybatis相关配置 springmvc.xml、springmvc.xml、applicationContext-*.xml、SqlMapConfig.xml

Spring mybatis相关配置 springmvc.xml、springmvc.xml、applicationContext-*.xml、SqlMapConfig.xml

Spring mybatis相关配置,目录如下

image

springmvc.xml

<context:component-scan base-package="com.street.client.web" />
    <mvc:annotation-driven />

    <!-- 资源映射 -->
    <bean
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/" />
        <!-- <property name="suffix" value=".jsp" /> -->
    </bean>
    <!-- 资源映射 -->
    <mvc:resources location="/WEB-INF/css/" mapping="/css/**" />
    <mvc:resources location="/WEB-INF/js/" mapping="/js/**" />

    <!-- 定义文件上传解析器 -->
    <bean id="multipartResolver"
        class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <!-- 设定默认编码 -->
        <property name="defaultEncoding" value="UTF-8"></property>
        <!-- 设定文件上传的最大值5MB,5*1024*1024 -->
        <property name="maxUploadSize" value="5242880"></property>
    </bean>

    <!-- 输出对象转JSON支持 -->
    <bean
        class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" />
    <bean
        class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
        <property name="messageConverters">
            <list>
                <bean
                    class="org.springframework.http.converter.StringHttpMessageConverter">
                    <property name="supportedMediaTypes">
                        <list>
                            <value>application/json; charset=UTF-8</value>
                        </list>
                    </property>
                </bean>
                <bean
                    class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
                    <property name="supportedMediaTypes">
                        <list>
                            <value>application/json; charset=UTF-8</value>
                        </list>
                    </property>
                </bean>
            </list>
        </property>
    </bean>

    <!-- 配置拦截器 -->
<!--    <mvc:interceptors>
 -->        <!-- 登录拦截器,需要登录的接口根据token判断是否登录,如果未登录则返回登录处理 -->
        <!-- <mvc:interceptor>
            <mvc:mapping path="/**" />
            <mvc:exclude-mapping path="/v1/api/oauth/*" />
            <mvc:exclude-mapping path="/v1/api/area/*" />
            <mvc:exclude-mapping path="/v1/api/p/find/ptypes" />
            <mvc:exclude-mapping path="/v1/api/p/pdetail" />
            <mvc:exclude-mapping path="/v1/api/note/getNotes" />
            <mvc:exclude-mapping path="/v1/api/note/find/notes" />
            <mvc:exclude-mapping path="/v1/api/note/detail" />
            <mvc:exclude-mapping path="/v1/api/note/getComments" />
            <bean class="com.street.client.web.interceptors.LoginInterceptor" />
        </mvc:interceptor> -->
<!--    </mvc:interceptors>

applicationContext-dal.xml

<!-- 加载配置文件 -->
    <context:property-placeholder location="classpath:resource/db.properties" />

    <!-- 数据库连接池 -->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
        destroy-method="close">
        <property name="url" value="${jdbc.url}" />
        <property name="username" value="${jdbc.username}" />
        <property name="password" value="${jdbc.password}" />
        <property name="driverClassName" value="${jdbc.driver}" />
        <property name="maxActive" value="10" />
        <property name="minIdle" value="5" />
        <property name="connectionInitSqls" value="set names utf8mb4;" />
    </bean>

    <!-- 配置sqlsessionFactory -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="configLocation" value="classpath:mybatis/SqlMapConfig.xml"></property>
        <property name="mapperLocations" value="classpath:mappers/*Mapper.xml" />
        <property name="dataSource" ref="dataSource"></property>
    </bean>
    <!-- 配置扫描包,加载mapper代理对象 -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.street.client.dal"></property>
    </bean>

applicationContext-service.xml

<!-- 配置扫描包 -->
    <context:component-scan base-package="com.street.client.service" />

applicationContext-biz.xml

    <context:component-scan base-package="com.street.client.biz" />

    <!-- 配置面向切面注解支持 -->
    <aop:aspectj-autoproxy proxy-target-class="true" />
    <aop:config proxy-target-class="true" />

    <!-- 配置声明式事务管理,使用注解的方式 -->
    <bean id="dataSourceTransactionManager"
        class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>
    <tx:annotation-driven transaction-manager="dataSourceTransactionManager" />

applicationContext-trans.xml

    <!-- 事务管理器 -->
    <bean id="transactionManager"
        class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <!-- 数据源 -->
        <property name="dataSource" ref="dataSource" />
    </bean>
    <!-- 通知 -->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <!-- 传播行为 -->
            <tx:method name="save*" propagation="REQUIRED" />
            <tx:method name="insert*" propagation="REQUIRED" />
            <tx:method name="add*" propagation="REQUIRED" />
            <tx:method name="create*" propagation="REQUIRED" />
            <tx:method name="delete*" propagation="REQUIRED" />
            <tx:method name="update*" propagation="REQUIRED" />
            <tx:method name="find*" propagation="SUPPORTS" read-only="true" />
            <tx:method name="select*" propagation="SUPPORTS" read-only="true" />
            <tx:method name="get*" propagation="SUPPORTS" read-only="true" />
        </tx:attributes>
    </tx:advice>
    <!-- 切面 -->
    <aop:config>
        <aop:advisor advice-ref="txAdvice"
            pointcut="execution(* com.street.client.biz.*.*(..))" />
    </aop:config>

SqlMapConfig.xml

<configuration>
    <typeAliases>
        <!-- 用户账号相关DO配置 -->
        <typeAlias alias="account" type="com.street.client.domain.AccountDO" />

        <!-- 验证码相关DO配置 -->
<!--        <typeAlias alias="verifyCode" type="com.street.client.domain.VerifyCodeDO" />
 -->
    </typeAliases>
</configuration>

web.xml

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring/applicationContext-*.xml</param-value>
    </context-param>

本文作为初学者的学习的记录,以便之后查阅。谢谢。

谢谢您的阅读,希望本站及文档能带给你帮助,给你带来简洁明了的阅读体验。谢谢。

本文地址:http://www.laileshuo.com/?p=1152

博客地址:www.laileshuo.com www.laileshuo.cn

Mybatis配置xml、别名、数据表对应DO,DAO接口

Mybatis配置xml、别名、数据表对应DO,DAO接口

Mybatis配置

作为初学者我的理解,如下图

image

ResultMap标签的type属性通过反射实例化领域模型
ResultMap标签的type属性和id、result等标签信息将HashMap中的键值对,填充到领域模型实例中并返回

SqlMapConfig.xml

SqlMapConfig文件配置用户账号相关DO配置、验证码相关DO配置等等DO,针对数据库中的表进行相对应的配置。数据库表字段相对应相应的的DO类字段。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <typeAliases>
        <!-- 用户账号相关DO配置 -->
        <typeAlias alias="account" type="com.muye.naruto.domain.AccountDO" />

        <!-- 验证码相关DO配置 -->
        <typeAlias alias="verifyCode" type="com.muye.naruto.domain.VerifyCodeDO" />

    </typeAliases>

    <!-- 配置分页插件 -->
    <plugins>
        <plugin interceptor="com.github.pagehelper.PageHelper">
            <!-- 设置数据库类型 Oracle,Mysql,MariaDB,SQLite,Hsqldb,PostgreSQL六种数据库 -->
            <property name="dialect" value="mysql" />
        </plugin>
    </plugins>
</configuration>

applicationContext-dal.xml

applicationContext-dal配置sqlsessionFactory与配置扫描包,加载配置文件db.properties,自动扫描与装配bean,数据库连接池等。加载mapper代理对象

  • sqlsessionFactory设置configLocation,这个指定了SqlMapConfig.xml文件,配置mappers对应的配置文件mapperLocations文件,通配符表示classpath:mappers/*Mapper.xml。
<!-- 配置sqlsessionFactory -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="configLocation" value="classpath:mybatis/SqlMapConfig.xml"></property>
        <property name="mapperLocations" value="classpath:mappers/*Mapper.xml" />
    </bean>

  • 配置扫描包,加载mapper代理对象。annotationClass以及扫描包
<!-- 配置扫描包,加载mapper代理对象 -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="annotationClass" value="org.springframework.stereotype.Repository" />
        <property name="basePackage" value="com.street.client.dal"></property>
    </bean>

  • 加载数据库配置文件db.properties
    <context:property-placeholder location="classpath:resource/db.properties" />

  • 自动扫描与装配bean,这个包中对应DAO文件,DAO声明接口 增删改查功能接口
    <!-- 自动扫描与装配bean -->
    <context:component-scan base-package="com.street.client.dal" />

  • 配置数据库连接池
    <!-- 数据库连接池 -->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
        destroy-method="close">
        <property name="url" value="${jdbc.url}" />
        <property name="username" value="${jdbc.username}" />
        <property name="password" value="${jdbc.password}" />
        <property name="driverClassName" value="${jdbc.driver}" />
        <property name="maxActive" value="10" />
        <property name="minIdle" value="5" />
        <property name="connectionInitSqls" value="set names utf8mb4;" />
    </bean>

web.xml

在web.xml中配置加载spring容器。

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring/applicationContext-*.xml</param-value>
    </context-param>

本文作为初学者的学习的记录,以便之后查阅。谢谢。

谢谢您的阅读,希望本站及文档能带给你帮助,给你带来简洁明了的阅读体验。谢谢。

本文地址:http://www.laileshuo.com/?p=1145

博客地址:www.laileshuo.com www.laileshuo.cn

产品及移动客户端通用交互UI梳理

产品及移动客户端通用交互UI梳理

今天写这篇文章呢,也没有去吐槽产品经理的意思。毕竟自己不是从事产品经理这个职位,无权去做任何说明与吐槽批评。最近想做些总结与梳理。这篇文章针对我实际遇到的问题产品及客户端的一种梳理

通用UI

  • 通用异常显示UI

    当显示页面的时候,可能会因为网络问题、数据删掉等问题,导致显示异常。这个时候需要通用的异常处理页面UI,比如一下几种情况

    • 1、网络异常
    • 2、没有数据
    • 3、数据已经被删除

这类异常显示UI,可以采用通用的风格的显示样式,但是由于版本历史原因,不同的人喜欢的风格不一样,一直没有达到一种统一的风格,显得较为混乱。

image

image

其他效果图参考
pttrns – Empty States
calltoidea – Empty Page
Mobile Patterns – Empty Data Sets

  • 通用Alert弹窗提醒样式

    Alert比较常见,普遍UI采用系统默认的样式,比如IOS的UIAlertView。当然系统的比较方便,但是也有一些问题,比如不同系统版本显示的样式不统一,IOS6、IOS7、IOS8 … 版本,不同的版本Alert显示的圆框,字体等都有差别。以下借鉴微信的提示alert风格。

    • 绿色风格 (default)
    • 黄色风格 (primary)
    • 红色风格 (warn)

image

image

  • 通用按钮样式Button

    Button比较常见,Button在一个app里面会出现各式各样的button,但是app主色调,风格基本上都保持一种。风格一致的button,以下借鉴微信的提示alert风格。

    • 绿色风格 (default)
    • 黄色风格 (primary)
    • 红色风格 (warn)

image

image

  • 通用底部弹出抽屉式样式UI

    很多app,比如微信、微博,会统一底部弹出抽屉式样式UI。这种的也有很多以系统默认的样式显示,但是在不同系统下会显示不同,字体,是否有边框,是否有圆框等都会有区别。统一风格会显示更加协调。

image

image

  • 通用toast弹出

    app中都会有toast,以便提示用户网络出错、服务器异常、参数错误等等提示。toast提示完后会自动消失。这种可以使用MBProgressHUD、SVProgressHUD这种第三方的库,当然也可以自定义。

image

  • 通用底部分享菜单UI

    app中都会有分享到第三方平台,以便增加app宣传的目的。这类样式一般有以下两种样式

image

image

  • 通用POP弹出菜单样式UI

    app中可能有POP弹出菜单样式,这种风格常见于导航更多按钮,以遍提供更多的选择,如以下

image

image

image

以上列举部分通用UI样式,之后发现一些,会继续更新归类。

本文作为初学者的学习的记录,以便之后查阅。谢谢。

谢谢您的阅读,希望本站及文档能带给你帮助,给你带来简洁明了的阅读体验。谢谢。

本文地址:http://www.laileshuo.com/?p=1133

博客地址:www.laileshuo.com www.laileshuo.cn

IOS 私有pod库方案及流程

IOS 私有pod库方案及流程

Cocoapods私有库

image

制作了私有pod库,总是记不住相关命令。现在梳理下流程。

准备工作

  • 在gitHub创建项目存放私有Repo源

    repo地址:https://github.com/gloryFlow/FBBRepositories.git

  • 本地添加私有源 终端执行命令pod repo add FBBRepositories https://github.com/gloryFlow/FBBRepositories

    如果之前并未向gitHub push过文件也没有把SSH公钥保存到gitHub,这时候应该会提示你输入gitHub账号密码

  • 以上操作完成 cd ~/.cocoapods/repos目录下至少会有2个文件夹 FBBRepositories 和 master, master文件。下面存放的是公有源文件, FBBRepositories*目录下目前是空的,后面会存放我们私有源文件

配置

比如我这里创建的是FBBShopCenter项目工程。地址:https://github.com/gloryFlow/FBBShopCenter

  • git命令将项目更新到本地
git clone https://github.com/gloryFlow/FBBShopCenter.git

  • 创建FILE_LICENSE文件
echo MIT&gt;FILE_LICENSE

  • 创建podspec文件
pod spec create FBBShopCenter

  • 编辑podspec文件
vim . FBBShopCenter.podspec

FBBShopCenter.podspec 具体详情详见demo

项目工程

通过xcode创建工程,最终的工程目录如下

image

上传代码

通过git命令上传代码

  • 查看改动 git status
➜  FBBShopCenter git:(master) ✗ git status

On branch master
Your branch is up-to-date with &#039;origin/master&#039;.
Changes not staged for commit:
  (use &quot;git add &lt;file&gt;...&quot; to update what will be committed)
  (use &quot;git checkout -- &lt;file&gt;...&quot; to discard changes in working directory)

    modified:   FBBShopCenter.podspec
    modified:   ShopCenter/FBBShopCenter/FBBShopCenter.xcworkspace/xcuserdata/guobingwei.xcuserdatad/UserInterfaceState.xcuserstate
    modified:   ShopCenter/FBBShopCenter/FBBShopCenter/ShopCenter/ShopCenterPageViewController.m

no changes added to commit (use &quot;git add&quot; and/or &quot;git commit -a&quot;)

  • 执行git add
➜  FBBShopCenter git:(master) ✗ git add .

  • 提交commit
➜  FBBShopCenter git:(master) ✗ git commit -m &#039;更改代码&#039;
[master bc78411] 更改代码
 3 files changed, 2 insertions(+), 2 deletions(-)
 rewrite ShopCenter/FBBShopCenter/FBBShopCenter.xcworkspace/xcuserdata/guobingwei.xcuserdatad/UserInterfaceState.xcuserstate (85%)

  • 更新代码pull
➜  FBBShopCenter git:(master) git pull
Enter passphrase for key &#039;/Users/a/.ssh/id_rsa&#039;: 
Already up-to-date.


  • 设置tag
➜  FBBShopCenter git:(master) git tag 0.1.4

tag一定要和podspec中的version一致

  • 提交代码及tag
➜  FBBShopCenter git:(master) git push origin master --tags
Enter passphrase for key &#039;/Users/a/.ssh/id_rsa&#039;: 
Counting objects: 12, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (10/10), done.
Writing objects: 100% (12/12), 18.52 KiB | 9.26 MiB/s, done.
Total 12 (delta 5), reused 0 (delta 0)
remote: Resolving deltas: 100% (5/5), completed with 5 local objects.
To github.com:gloryFlow/FBBShopCenter.git
   984d38b..bc78411  master -&gt; master
 * [new tag]         0.1.4 -&gt; 0.1.4

–tags为了提交tag

  • 验证无法通过

我们提交命令

pod repo push FBBRepositories FBBShopCenter.podspec --verbose --allow-warnings --use-libraries --sources=&#039;https://github.com/gloryFlow/FBBRepositories.git,https://github.com/CocoaPods/Specs.git&#039;

出现.swift-version 错误时候

- ERROR | [iOS] unknown: Encountered an unknown error (The `JJDRouterManager` pod failed to validate due to 1 error.
[!] The validator for Swift projects uses Swift 3.0 by default, if you are using a different version of swift you can use a `.swift-version` file to set the version for your Pod. For example to use Swift 2.3, run: 
    `echo "2.3" > .swift-version`:
    - ERROR | license: Sample license type.
    - WARN  | homepage: The homepage has not been updated from default

.swift-version文件用来知道swift版本,需要执行以下命令

`echo "2.3" > .swift-version`:

  • 验证,定位问题所在

当错误信息比较简单的时候,我们可以使用–verbose来显示更多的调试信息,以便我们更快定位到错误。

pod spec lint FBBShopCenter.podspec --verbose --allow-warnings --use-libraries --sources
pod trunk push FBBShopCenter.podspec --verbose --allow-warnings --use-libraries --sources

当然这里我们执行pod spec lint


➜ FBBShopCenter git:(master) ✗ pod spec lint FBBShopCenter.podspec --verbose --allow-warnings --use-libraries --sources='https://github.com/gloryFlow/FBBRepositories.git,https://github.com/CocoaPods/Specs.git'

当我们出现以下成功的提示的时候:


Analyzed 1 podspec. FBBShopCenter.podspec passed validation.
  • 最后执行
➜  FBBShopCenter git:(master) ✗ pod repo push FBBRepositories FBBShopCenter.podspec --verbose --allow-warnings --use-libraries --sources='https://github.com/gloryFlow/FBBRepositories.git,https://github.com/CocoaPods/Specs.git'

.
.
.

Pushing the `FBBRepositories' repo

  $ /usr/bin/git -C /Users/guobingwei/.cocoapods/repos/FBBRepositories -C
  /Users/guobingwei/.cocoapods/repos/FBBRepositories push origin master
Enter passphrase for key '/Users/guobingwei/.ssh/id_rsa': 
  To github.com:gloryFlow/FBBRepositories.git
     d4676cb..214c73b  master -> master

执行成功。我们看下github上提交成功的记录,版本号0.1.4。

如下图所示

image

特别注意

  • –verbose

来显示更多的调试信息

  • –sources

    使用命令pod spec lint 或者 pod repo push 去验证私有库能否通过验证时,尽量添加–sources选项,不然会出现找不到repo的错误,建议加上该选项。

  • –allow-warnings

    使用命令pod spec lint 或者 pod repo push 去验证私有库能否通过验证时,使用–allow-warnings选项以允许警告,建议加上该选项。

  • –use-libraries

    使用命令pod spec lint 或者 pod repo push 去验证私有库能否通过验证时,使用–use-libraries选项以便引用私有库、静态库的情况,建议加上该选项。

希望能拆分项目

拆分项目达到以下目标

image

本文作为初学者的学习的记录,以便之后查阅。谢谢。

谢谢您的阅读,希望本站及文档能带给你帮助,给你带来简洁明了的阅读体验。谢谢。

本文地址:http://www.laileshuo.com/?p=1122

博客地址:www.laileshuo.com www.laileshuo.cn

IOS UIMenuController使用的时候遇到的坑

在工程中,消息列表中使用了拷贝删除消息的功能。
类似如下效果

image

UIMenuController

在很多应用中,当我们长按一段文字或者图片的时候会弹出一个菜单,我们通过这个菜单可以实现文字等的复制、剪切、删除以及各种操作。

UIMenuController创建及使用


NSMutableArray *menus = [[NSMutableArray alloc]initWithCapacity:0]; UIMenuItem *copyTextMenu = [[UIMenuItem alloc] initWithTitle:@&quot;拷贝&quot; action:@selector(copyTextMenuAction:)]; UIMenuItem *removeTextMenu = [[UIMenuItem alloc] initWithTitle:@&quot;删除&quot; action:@selector(removeTextMenuAction:)]; UIMenuItem *shareTextMenu = [[UIMenuItem alloc] initWithTitle:@&quot;转发&quot; action:@selector(shareTextMenuAction:)]; [menus addObjectsFromArray:@[copyTextMenu, removeTextMenu]]; UIMenuController *menuController = [UIMenuController sharedMenuController]; if ([menuController isMenuVisible]) { [menuController setMenuVisible:NO animated:NO]; } dispatch_async(dispatch_get_main_queue(), ^{ [self.sceneChatView.headView becomeFirstResponder]; [menuController setMenuItems:nil]; [menuController setMenuItems:menus]; CGRect rect = [self.sceneChatView.headView convertRect:cell.bubbleView.frame fromView:cell.bubbleView]; //[menuController setTargetRect:位置Frame inView:按钮的父视图]; [menuController setTargetRect:rect inView:self.sceneChatView.headView]; [menuController update]; [menuController setMenuVisible:YES animated:YES]; });
  • UIMenuController,默认支持UITextField、UITextView、UIWebView、UITableView控件的UIMenuController相关

  • 如果使用自定义View,menuController显示在自定义view上。需要以下处理:

//设置控件可以成为第一响应者,注意不是每个控件都可以成为第一响应者
- (BOOL)canBecomeFirstResponder;    // default is NO
/**
 *  设置控件能够执行那些具体操作
 *  @param action 具体操作
 *  @return YES:支持该操作
 */
- (BOOL)canPerformAction:(SEL)action withSender:(nullable id)sender;
// Allows an action to be forwarded to another target. By default checks -canPerformAction:withSender: to either return self, or go up the responder chain.


坑:自定义View要实现两个方法,否则会导致UIMenuController不显示的情况

具体实现如下

//设置控件可以成为第一响应者,注意不是每个控件都可以成为第一响应者
// default is NO
- (BOOL)canBecomeFirstResponder {
    return YES;
}

/**
 *  设置控件能够执行那些具体操作
 *  @param action 具体操作
 *  @return YES:支持该操作
 */
- (BOOL)canPerformAction:(SEL)action withSender:(nullable id)sender {
    if (action == @selector(copyTextMenuAction:) ||
        action == @selector(removeTextMenuAction:))
    {
        return YES;
    }
    else{
        return NO;
    }
}

// Allows an action to be forwarded to another target. By default checks -canPerformAction:withSender: to either return self, or go up the responder chain.

UIMenuController的通知


//UIMenuControllerWillShowMenuNotification //将要显示 //UIMenuControllerDidShowMenuNotification //已经显示 //UIMenuControllerWillHideMenuNotification //将要隐藏 //UIMenuControllerDidHideMenuNotification //已经隐藏 //UIMenuControllerMenuFrameDidChangeNotification //位置大小改变 //UIMenuController已经隐藏的通知 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(menuControllerDidHide) name:UIMenuControllerDidHideMenuNotification object:nil]; //通知回调的方法 - (void)menuControllerDidHide { //可以做相应的操作 }

本文作为初学者的学习的记录,以便之后查阅。谢谢。

谢谢您的阅读,希望本站及文档能带给你帮助,给你带来简洁明了的阅读体验。谢谢。

本文地址:http://www.laileshuo.com/?p=1114

博客地址:www.laileshuo.com www.laileshuo.cn

IOS 类似消息聊天顶部加载更多需要设置tableView

IOS 类似消息聊天顶部加载更多需要设置tableView

@implementation ChatTableView

- (void)setContentSize:(CGSize)contentSize{
    if (!CGSizeEqualToSize(self.contentSize, CGSizeZero)) {
        if (contentSize.height &gt; self.contentSize.height) {
            CGPoint offset = self.contentOffset;
           CGFloat H = contentSize.height - self.contentSize.height;
            offset.y += H;
            if (ABS(H) &lt; 120.0) {
                [UIView animateWithDuration:0.2 animations:^{
                    self.contentOffset = offset;
                }];
            }else{
             self.contentOffset = offset;
            }
        }
    }
    [super setContentSize:contentSize];
}


@end

在加载的时候出现一下问题,在收到消息的时候出现tableView reloadData时候,tableView抖动一下,向上滚动了一点距离。这是需要加上判断。

在判断时候同时加上isLoadMore,如果是加载更多的时候,这时候保留设置self.contentOffset = offset。否者不能进入这个判断if (!CGSizeEqualToSize(self.contentSize, CGSizeZero))。

本文作为初学者的学习的记录,以便之后查阅。谢谢。

谢谢您的阅读,希望本站及文档能带给你帮助,给你带来简洁明了的阅读体验。谢谢。

本文地址:http://www.laileshuo.com/?p=1104

博客地址:www.laileshuo.com www.laileshuo.cn

IOS 类似直播的打 CALL效果

IOS 类似直播的打 call效果

image

在工程中,需要类似直播的打 call效果。想到了粒子动画:贝塞尔曲线 关键帧动画。

贝塞尔曲线 UIBezierPath

UIBezierPath这个类在UIKit中, 是Core Graphics框架关于path的一个封装,使用此类可以定义简单的形状,比如我们常用到,矩形,圆形,椭圆,弧,或者不规则的多边形

基本使用方法

UIBezierPath对象是CGPathRef数据类型的封装。path如果是基于矢量形状的,都用直线或曲线去创建。我们一般使用UIBezierPath都是在重写view的drawRect方法这种情形。我们用直线去创建矩形或多边形,使用曲线创建弧或者圆。创建和使用path对象步骤:
1、 重写View的drawRect方法
2、 创建UIBezierPath的对象
3、 使用方法moveToPoint: 设置初始点
4、 根据具体要求使用UIBezierPath类方法绘图(比如要画线、矩形、圆、弧?等)
5、 设置UIBezierPath对象相关属性 (比如lineWidth、lineJoinStyle、aPath.lineCapStyle、color)
6、 使用stroke 或者 fill方法结束绘图

关键帧动画 CAKeyframeAnimation

关键帧动画,也是CAPropertyAnimation的子类

属性说明

  • values 关键帧数组

    上述的NSArray对象。里面的元素称为“关键帧”(keyframe)。
    动画对象会在指定的时间(duration)内,依次显示values数组中的每一个关键帧

  • path 路径轨迹

    path:可以设置一个CGPathRef、CGMutablePathRef,让图层按照路径轨迹移动。
    path只对CALayer的anchorPoint和position起作用。
    注意:如果设置了path,那么values关键帧将被忽略

  • keyTimes:关键帧所对应的时间点

    keyTimes:可以为对应的关键帧指定对应的时间点,其取值范围为0到1.0
    keyTimes中的每一个时间值都对应values中的每一帧。如果没有设置keyTimes,各个关键帧的时间是平分的

直播的打 call效果代码如下


@interface ViewController () @property (strong, nonatomic) UIButton *applauseBtn; @property (strong, nonatomic) UILabel *applauseNumLbl; @property (assign, nonatomic) NSInteger applauseNum; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; [self setUI]; } - (void)setUI { //鼓掌按钮 self.applauseBtn = [[UIButton alloc]initWithFrame:CGRectMake(self.view.frame.size.width-15-60, self.view.frame.size.height-80-60, 60, 60)]; self.applauseBtn.contentMode = UIViewContentModeScaleToFill; [self.applauseBtn setImage:[UIImage imageNamed:@&quot;applause&quot;] forState:UIControlStateNormal]; [self.applauseBtn setImage:[UIImage imageNamed:@&quot;applause&quot;] forState:UIControlStateHighlighted]; [self.applauseBtn addTarget:self action:@selector(applauseBtnClick) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:self.applauseBtn]; //鼓掌数 self.applauseNumLbl = [[UILabel alloc]init]; self.applauseNumLbl.textColor = [UIColor whiteColor]; self.applauseNumLbl.font = [UIFont systemFontOfSize:12]; self.applauseNumLbl.text = @&quot;0&quot;; [self.applauseBtn addSubview:self.applauseNumLbl]; self.applauseNumLbl.textAlignment = NSTextAlignmentCenter; self.applauseNumLbl.frame = CGRectMake(6, 43, 50, 12); [self startPlayTimer]; } - (void)applauseBtnClick { self.applauseNum++; self.applauseNumLbl.text = [NSString stringWithFormat:@&quot;%zd&quot;,self.applauseNum]; [self showTheApplauseInView:self.view belowView:self.applauseBtn]; } //鼓掌动画 - (void)showTheApplauseInView:(UIView *)view belowView:(UIButton *)v{ NSInteger index = arc4random_uniform(7); //取随机图片 NSString *image = [NSString stringWithFormat:@&quot;applause_%zd&quot;,index]; UIImageView *applauseView = [[UIImageView alloc]initWithFrame:CGRectMake(self.view.frame.size.width-15-50, self.view.frame.size.height - 150, 40, 40)];//增大y值可隐藏弹出动画 [view insertSubview:applauseView belowSubview:v]; applauseView.image = [UIImage imageNamed:image]; CGFloat AnimH = 350; //动画路径高度, applauseView.transform = CGAffineTransformMakeScale(0, 0); applauseView.alpha = 0; //弹出动画 [UIView animateWithDuration:0.2 delay:0.0 usingSpringWithDamping:0.6 initialSpringVelocity:0.8 options:UIViewAnimationOptionCurveEaseOut animations:^{ applauseView.transform = CGAffineTransformIdentity; applauseView.alpha = 0.9; } completion:NULL]; //随机偏转角度 NSInteger i = arc4random_uniform(2); NSInteger rotationDirection = 1- (2*i);// -1 OR 1,随机方向 NSInteger rotationFraction = arc4random_uniform(10); //随机角度 //图片在上升过程中旋转 [UIView animateWithDuration:4 animations:^{ applauseView.transform = CGAffineTransformMakeRotation(rotationDirection * M_PI/(4 + rotationFraction*0.2)); } completion:NULL]; //动画路径 UIBezierPath *heartTravelPath = [UIBezierPath bezierPath]; [heartTravelPath moveToPoint:applauseView.center]; //随机终点 CGFloat ViewX = applauseView.center.x; CGFloat ViewY = applauseView.center.y; CGPoint endPoint = CGPointMake(ViewX + rotationDirection*10, ViewY - AnimH); //随机control点 NSInteger j = arc4random_uniform(2); NSInteger travelDirection = 1- (2*j);//随机放向 -1 OR 1 NSInteger m1 = ViewX + travelDirection*(arc4random_uniform(20) + 50); NSInteger n1 = ViewY - 60 + travelDirection*arc4random_uniform(20); NSInteger m2 = ViewX - travelDirection*(arc4random_uniform(20) + 50); NSInteger n2 = ViewY - 90 + travelDirection*arc4random_uniform(20); CGPoint controlPoint1 = CGPointMake(m1, n1);//control根据自己动画想要的效果做灵活的调整 CGPoint controlPoint2 = CGPointMake(m2, n2); //根据贝塞尔曲线添加动画 [heartTravelPath addCurveToPoint:endPoint controlPoint1:controlPoint1 controlPoint2:controlPoint2]; //关键帧动画,实现整体图片位移 CAKeyframeAnimation *keyFrameAnimation = [CAKeyframeAnimation animationWithKeyPath:@&quot;position&quot;]; keyFrameAnimation.path = heartTravelPath.CGPath; keyFrameAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionDefault]; keyFrameAnimation.duration = 3 ;//往上飘动画时长,可控制速度 [applauseView.layer addAnimation:keyFrameAnimation forKey:@&quot;positionOnPath&quot;]; //消失动画 [UIView animateWithDuration:3 animations:^{ applauseView.alpha = 0.0; } completion:^(BOOL finished) { [applauseView removeFromSuperview]; }]; } - (void)startPlayTimer { //开始其实就是开始定时器 NSTimer *cellDisplayTimer = [NSTimer timerWithTimeInterval:0.5 target:self selector:@selector(cellDisplayAction) userInfo:nil repeats:YES]; //加到runloop [[NSRunLoop currentRunLoop] addTimer:cellDisplayTimer forMode:NSRunLoopCommonModes]; } - (void)cellDisplayAction { [self showTheApplauseInView:self.view belowView:self.applauseBtn]; }

本文作为初学者的学习的记录,以便之后查阅。谢谢。

谢谢您的阅读,希望本站及文档能带给你帮助,给你带来简洁明了的阅读体验。谢谢。

本文地址:http://www.laileshuo.com/?p=1099

博客地址:www.laileshuo.com www.laileshuo.cn

IOS 类似直播的打 call效果 CAEmitterCell等烟雾,火,雨等效果

IOS 类似直播的打 call效果 CAEmitterCell等烟雾,火,雨等效果

image

在工程中,需要类似直播的打 call效果。首先想到了粒子动画。CAEmitterLayer和CAEmitterCell。

粒子系统由两部分组成

  • 一个或多个 CAEmitterCells

CAEmitterCells:发射器电池可以看作是单个粒子的原型(例如,一个单一的粉扑在一团烟雾)。当散发出一个粒子,UIKit根据这个发射粒子和定义的基础上创建一个随机粒子。此原型包括一些属性来控制粒子的图片,颜色,方向,运动,缩放比例和生命周期。

  • 一个或多个 CAEmitterLayer

但通常只有一个CAEmitterLayers:这个发射的层主要控制粒子的形状(例如,一个点,矩形或圆形)和发射的位置(例如,在矩形内,或边缘)。这个层具有全局的乘法器,可以施加到系统内的CAEmitterCells。这些给你一个简单的方法覆盖的所有粒子的变化。比如一个人为的例子将改变x雨来模拟风的速度。

基础是简单的,但这些参数却是相当微妙的。CAEmitterLayer有超过30种不同的参数进行自定义粒子的行为。

CAEmitterLayer

CAEmitterLayer 是一个高性能的粒子引擎,被用来创建复杂的粒子动画如:烟雾,火,雨等效果,并且很好地控制了性能。

苹果给出的解释是:

The particles, defined by instances of CAEmitterCell, are drawn above the layer’s background color and border.
Listing 1 shows how to set up a simple point (the default emitterShape is kCAEmitterLayerPoint) particle emitter. It uses an image named RadialGradient.png as the cell contents and, by setting the emitter cell’s emissionRange to 2 x pi, the particles are emitted in all directions.

意思是:

CAEmitterLayer 看上去像是许多 CAEmitterCell 的容器,这些 CAEmitterCell 定义了一个例子效果。你将会为不同的例子效果定义一个或多个 CAEmitterCell 作为模版,同时 CAEmitterLayer 负责基于这些模版实例化一个粒子流。一个 CAEmitterCell 类似于一个 CALayer :它有一个 contents 属性可以定义为一个 CGImage ,另外还有一些可设置属性控制着表现和行为。

通俗理解:

CAEmitterLayer就像大炮,决定了(1)哪里发射(2)大炮有多大
CAEmitterCell就像是炮弹,觉得了(1)初速度(2)加速度(3)炮弹类型(4)发射后的角度 等等

CAEmitterLayer *snowEmitter = [CAEmitterLayer layer];
  //例子发射位置
  snowEmitter.emitterPosition = CGPointMake(120,20);
  //发射源的尺寸大小
  snowEmitter.emitterSize = CGSizeMake(self.view.bounds.size.width * 20, 20);
  //发射模式
  snowEmitter.emitterMode = kCAEmitterLayerSurface;
  //发射源的形状
  snowEmitter.emitterShape = kCAEmitterLayerLine;


- (void)viewDidLoad { [super viewDidLoad]; CAEmitterLayer *snowEmitter = [CAEmitterLayer layer]; //例子发射位置 snowEmitter.emitterPosition = CGPointMake(120,20); //发射源的尺寸大小 snowEmitter.emitterSize = CGSizeMake(self.view.bounds.size.width * 20, 20); //发射模式 snowEmitter.emitterMode = kCAEmitterLayerSurface; //发射源的形状 snowEmitter.emitterShape = kCAEmitterLayerLine; //创建雪花类型的粒子 CAEmitterCell *snowflake = [CAEmitterCell emitterCell]; //粒子的名字 snowflake.name = @&quot;snow&quot;; //粒子参数的速度乘数因子 snowflake.birthRate = 1.0; snowflake.lifetime = 120.0; //粒子速度 snowflake.velocity =10.0; //粒子的速度范围 snowflake.velocityRange = 10; //粒子y方向的加速度分量 snowflake.yAcceleration = 2; //周围发射角度 snowflake.emissionRange = 0.5 * M_PI; //子旋转角度范围 snowflake.spinRange = 0.25 * M_PI; snowflake.contents = (id)[[UIImage imageNamed:@&quot;DazFlake&quot;] CGImage]; //设置雪花形状的粒子的颜色 snowflake.color = [[UIColor colorWithRed:0.200 green:0.258 blue:0.543 alpha:1.000] CGColor]; //创建星星形状的粒子 CAEmitterCell *snowflake1 = [CAEmitterCell emitterCell]; //粒子的名字 snowflake1.name = @&quot;snow&quot;; //粒子参数的速度乘数因子 snowflake1.birthRate = 1.0; snowflake1.lifetime = 120.0; //粒子速度 snowflake1.velocity =10.0; //粒子的速度范围 snowflake1.velocityRange = 10; //粒子y方向的加速度分量 snowflake1.yAcceleration = 2; //周围发射角度 snowflake1.emissionRange = 0.5 * M_PI; //子旋转角度范围 snowflake1.spinRange = 0.25 * M_PI; //粒子的内容和内容的颜色 snowflake1.contents = (id)[[UIImage imageNamed:@&quot;DazStarOutline&quot;] CGImage]; snowflake1.color = [[UIColor colorWithRed:0.600 green:0.658 blue:0.743 alpha:1.000] CGColor]; snowEmitter.shadowOpacity = 1.0; snowEmitter.shadowRadius = 0.0; snowEmitter.shadowOffset = CGSizeMake(0.0, 1.0); //粒子边缘的颜色 snowEmitter.shadowColor = [[UIColor redColor] CGColor]; snowEmitter.emitterCells = [NSArray arrayWithObjects:snowflake,snowflake1,nil]; [self.view.layer insertSublayer:snowEmitter atIndex:0]; // Do any additional setup after loading the view. }

CAEmitterLayer和CAEmitterCell 的一些属性

CAEmitterLayer 提供了一个基于 Core Animation 的粒子 发 射系统 ,粒子用 CAEmitterCell 来初始化。 粒子画在背景 层 盒 边 界上

Properties:


birthRate: 粒子 产 生系数,默 认 1.0 ; emitterCells: 装着 CAEmitterCell 对 象的数 组 ,被用于把粒子投放到 layer 上; emitterDepth: 决定粒子形状的深度 联 系: emitter shape emitterMode: 发 射模式 NSString * const kCAEmitterLayerPoints; NSString * const kCAEmitterLayerOutline; NSString * const kCAEmitterLayerSurface; NSString * const kCAEmitterLayerVolume; emitterPosition: 发 射位置 emitterShape: 发 射源的形状: NSString * const kCAEmitterLayerPoint; NSString * const kCAEmitterLayerLine; NSString * const kCAEmitterLayerRectangle; NSString * const kCAEmitterLayerCuboid; NSString * const kCAEmitterLayerCircle; NSString * const kCAEmitterLayerSphere; emitterSize: 发 射源的尺寸大; emitterZposition: 发 射源的 z 坐 标 位置; lifetime: 粒子生命周期 preservesDepth: 不是多很清楚(粒子是平展在 层 上) renderMode: 渲染模式: NSString * const kCAEmitterLayerUnordered; NSString * const kCAEmitterLayerOldestFirst; NSString * const kCAEmitterLayerOldestLast; NSString * const kCAEmitterLayerBackToFront; NSString * const kCAEmitterLayerAdditive; scale: 粒子的缩放比例: seed :用于初始化随机数产生的种子 spin: 自旋转速度 velocity :粒子速度 CAEmitterCell CAEmitterCell 类 代从从 CAEmitterLayer 射出的粒子; emitter cell定 义 了粒子 发 射的方向。 alphaRange: 一个粒子的 颜 色 alpha 能改 变 的范 围 ; alphaSpeed: 粒子透明度在生命周期内的改变速度; birthrate :粒子参数的速度乘数因子; blueRange :一个粒子的 颜 色 blue 能改 变 的范 围 ; blueSpeed: 粒子 blue 在生命周期内的改变速度; color: 粒子的颜色 contents :是个 CGImageRef 的对象 , 既粒子要展现的图片; contentsRect :应该画在 contents 里的子 rectangle : emissionLatitude :发射的 z 轴方向的角度 emissionLongitude:x-y 平面的 发 射方向 emissionRange ;周 围发射角度 emitterCells :粒子发射的粒子 enabled :粒子是否被渲染 greenrange: 一个粒子的 颜 色 green 能改 变 的范 围 ; greenSpeed: 粒子 green 在生命周期内的改变速度; lifetime :生命周期 lifetimeRange :生命周期范围 magnificationFilter :不是很清楚好像增加自己的大小 minificatonFilter :减小自己的大小 minificationFilterBias :减小大小的因子 name :粒子的名字 redRange : 一个粒子的 颜 色 red 能改 变 的范 围 ; redSpeed; 粒子 red 在生命周期内的改变速度; scale :缩放比例: scaleRange :缩放比例范围; scaleSpeed :缩放比例速度: spin :子旋转角度 spinrange :子旋转角度范围 style :不是很清楚: velocity :速度 velocityRange :速度范围 xAcceleration: 粒子 x 方向的加速度分量 yAcceleration: 粒子 y 方向的加速度分量 zAcceleration: 粒子 z 方向的加速度分量 Class Methods defauleValueForKey: 更具健 获 得 值 ; emitterCell :初始化方法 shouldArchiveValueForKey: 是否 归 档莫 键值

本文作为初学者的学习的记录,以便之后查阅。谢谢。

谢谢您的阅读,希望本站及文档能带给你帮助,给你带来简洁明了的阅读体验。谢谢。

本文地址:http://www.laileshuo.com/?p=1096

博客地址:www.laileshuo.com www.laileshuo.cn