云存储和云计算之间相比较,主要是什么关系?

现在的IT业界对于云集计算的钟爱超过了以往的任何时候,云计算产业被认为是继大型计算机、个人计算机、互联网之后的 第四次IT产业革命,IT行业进入云时代,对IT界的大小企业来说云计算就是一次炼狱。其实在某种的意义上云计算并不是一项全新的技术,是在信息化积累到一定的程度需要对于IT资源进行有效整合的客观需求催生的,因此在云计算整个的发展过程我们会看到过去很多看见过的技术跟应用模式。

云计算的概念现在已经很明晰,云计算之所以能够在*近几年快速兴起,是因为用户渴望能够充分利用IT资源来给业务提供即时按需的高效服务。云计算具体指的是:狭义云计算指IT基础设施的交付和使用模式,指通过网络以按需、易扩展的方式获得所需资源;广义云计算指服务的交付和使用模式,指通过网络以按需、易扩展的方式获得所需服务。这种服务可以是IT和软件、互联网相关,也可是其他服务。

这是云计算的一个核心的概念,其实简单的理解就是将大量用网络连接的计算资源统一管理和调度,构成一个计算资源池向用户按需服务。提供资源的网络被称为“云”。这种“云”服务,我们可以随时的享用,只是这种服务有偿的。

说了这么多的云计算究竟什么是云存储?究竟目前云存储发展到什么程度了?云存储是在云计算(cloud computing)概念上延伸和发展出来的一个新的概念,是指通过集群应用、网格技术或分布式文件系统等功能,将网络中大量各种不同类型的存储设备通过应用软件集合起来协同工作,共同对外提供数据存储和业务访问功能的一个系统。当云计算系统运算和处理的核心是大量数据的存储和管理时,云计算系统中就需要配置大量的存储设备,那么云计算系统就转变成为一个云存储系统,所以云存储是一个以数据存储和管理为核心的云计算系统。

就如同云状的广域网和互联网一样,云存储对使用者来讲,不是指某一个具体的设备,而是指一个由许许多多个存储设备和服务器所构成的集合体。使用者使用云存储,并不是使用某一个存储设备,而是使用整个云存储系统带来的一种数据访问服务。所以严格来讲,云存储不是存储,而是一种服务。

从两者的关系来看,云存储和云计算之间的关系还是很好理解的,云存储和云计算相比较,可以认为是云存储配置了大容量存储空间的一个云计算系统。

未来云计算的应用会更加细致的深入到我们日常的生活中去,未来基于云计算的云存储会更加的深入到目前的移动互联行业,而我们现在的智能有手机在未来将有一个具有大容量云端存储,正如前面所说的,云存储不是实物,是服务,未来市场潜力巨大。

云计算、雾计算、霾计算、边缘计算是什么意思,我们应该怎么理解?

未来的世界将是一个万物互联的时代,随着物联网行业技术标准的完善以及关键技术上的不断突破,数据大爆炸时代将越走越近。

我们都知道,每台服务器都有自己的CPU、内存,但分配到这些服务器的应用往往不能充分地利用这些资源。再者,为了确保服务的可靠性往往还要预留冗余的服务器、存储器、网络设备等,而很多时候,这些硬件资源往往处于空置状态,并没有得到充分的利用。*后,正确预测不同应用对服务器的计算能力和存储器的存储能力的需求又是困难的。因此,2006年Google的CEO埃里克·施密特首次提出了云计算的概念,以及后来业界衍生出来雾计算、霾计算、边缘计算等等一系列的计算方式,接下来,让我们一起去辨析一下它们到底指的是什么。

云计算

云计算是一种利用互联网实现随时随地、按需、便捷地使用共享计算设施、存储设备、应用程序等资源的计算模式。

云计算系统由云平台、云存储、云终端、云安全四个基本部分组成。云平台作为提供云计算服务的基础,管理着数量巨大的CPU、存储器、交换机等大量硬件资源,以虚拟化的技术来来整合一个数据中心或多个数据中心的资源,屏蔽不同底层设备的差异性,以一种透明的方式向用户提供计算环境、开发平台、软件应用等在内的多种服务。

通常情况下,云平台从用户的角度可分为公有云、私有云、混合云等。

公有云:第三方提供商为用户提供服务的云平台,用户可通过互联网访问公有云。

私有云:为一个用户单独使用而组建的,对数据存储量、处理量、安全性要求高。

混合云:是结合了公有云和私有云的优点而组建的。

再者,通过从提供服务的层次可分为基础设施即服务(Iaas)、平台即服务(Paas)和软件即服务(Saas)。

雾计算

相比于云计算的高高在上和遥不可及,雾计算更为贴近地面,就在你我身边。我们知道,将数据从云端导入和导出实际上比人们想象的要更为复杂,由于接入设备越来越多,在传输数据、获取信息时,带宽就显得不够用了,这就为雾计算的产生提供了空间。

雾计算的概念在2011年被人提出,并非是些性能强大的服务器,而是由性能较弱、更为分散的各种功能计算机组成,渗入电器、工厂、汽车、街灯及人们生活中的各种物品。雾计算是介于云计算和个人计算之间的,是半虚拟化的服务计算架构模型,强调数量,不管单个计算节点能力多么弱都要发挥作用。

雾计算有几个明显特征:低延时、位置感知、广泛的地理分布、适应移动性的应用,支持更多的边缘节点。这些特征使得移动业务部署更加方便,满足更广泛的节点接入。

与云计算相比,雾计算所采用的架构更呈分布式,更接近网络边缘。雾计算将数据、数据处理和应用程序集中在网络边缘的设备中,而不像云计算那样将它们几乎全部保存在云中。数据的存储及处理更依赖本地设备,而非服务器。所以,云计算是新一代的集中式计算,而雾计算是新一代的分布式计算,符合互联网的“去中心化”特征。

霾计算

当然,无论是“云”还是“雾”,都不想成为“霾”,但是这个问题却事实存在着,如果得不到慎重的预防以及妥善的解决,那么“霾计算”就来了。

霾计算指的是什么呢?这里你可以理解为比较差劲的云计算或雾计算,因为这两者虽然概念先进,但也不是没有缺点。*,隐私与安全。现在的互联网世界,遭黑客攻击简直就是家常便饭的事,因此客户的隐私数据很容易泄漏。第二,网络延迟或者中断。云计算都是通过互联网远程访问的,虽然现在网速提高很快,但和局域网相比,速度还是有所延迟的,虽然在延时方面雾计算稍微好点,但如果网络中断,无论云计算或者是雾计算,服务都无法访问。第三,带宽会耗费预算,厂商按流量收费有时会超出预算、应用软件性能不够稳定,数据可能不值得放在云上,规模过大难以扩展,缺乏人力资本等都是造成霾计算的根源所在。

边缘计算

边缘计算指在靠近物或数据源头的网络边缘侧,融合网络、计算、存储、应用核心能力的开放平台,就近提供边缘智能服务,满足行业数字化在敏捷连接、实时业务、数据优化、应用智能、安全与隐私保护等方面的关键需求。到这里,您是否觉得边缘计算和雾计算有些相似呢?

一般而言,雾计算和边缘计算的区别在于,雾计算更具有层次性和平坦的架构,其中几个层次形成网络,而边缘计算依赖于不构成网络的单独节点。雾计算在节点之间具有广泛的对等互连能力,边缘计算在孤岛中运行其节点,需要通过云实现对等流量传输。

那么,边缘计算和云计算又有何区别?这两者都是处理大数据的计算运行方式。但不同的是,这一次,数据不用再传到遥远的云端,在边缘侧就能解决,更适合实时的数据分析和智能化处理,也更加高效而且安全。

如果说物联网的核心是让每个物体智能连接、运行,那么边缘计算就是通过数据分析处理,实现物与物之间传感、交互和控制。“边缘计算”作为一种将计算、网络、存储能力从云延伸到物联网网络边缘的架构,遵循“业务应用在边缘,管理在云端”的模式。

认知计算

认知计算包含了信息分析、自然语言处理和机器学习领域的大量技术创新,能够助力决策者从大量非结构化数据中揭示非凡的洞察。认知系统能够以对人类而言更加自然的方式与人类交互,专门获取海量的不同类型的数据,根据信息进行推论。

认知计算的一个目标是让计算机系统能够像人的大脑一样学习、思考,并做出正确的决策。人脑与电脑各有所长,认知计算系统可以成为一个很好的辅助性工具,配合人类进行工作,解决人脑所不擅长解决的一些问题。

传统的计算技术是定量的,并着重于精度和序列等级,而认知计算则试图解决生物系统中的不精确、不确定和部分真实的问题,以实现不同程度的感知、记忆、学习、语言、思维和问题解决等过程。

目前随着科学技术的发展以及大数据时代的到来,如何实现类似人脑的认知与判断,发现新的关联和模式,从而做出正确的决策,显得尤为重要,这给认知计算技术的发展带来了新的机遇和挑战。

就像“云”“雾”和“霾”的关系,物联网和大数据也是如影随形,相信通过业界人士的共同努力,定能找到更为先进的计算方式。在物联网时代来临时,我们定能合理、安全地让大数据技术为我们服务,因此不必太过恐慌,也不必杞人忧天。

Apache限制下载线程数与带宽详解

2014年放了一台服务器到数据中心,发现下载量很大,大部份是用迅雷下载这样会造成服务器负担过大,有人下载时会打不开网页的现象,所以网上查找解决下载限制的方法。
找到mod_limitipconn与mod_bw这两个模块,前者是限制下载线程数,后者是限制带宽但是发现,网上90%是转载的文章,有些根本没有实际使用过,经过我花大量的时间,才真正用上了这两个模块。现在一个一个介绍。

首先要使用这两个模块,必须在httpd.conf找到
LoadModule status_module modules/mod_status.so
将前面的#去掉
同时在这句下面写上
ExtendedStatus On
LoadModule limitipconn_module modules/mod_limitipconn.dll
LoadModule bw_module modules/mod_bw.dll
我使用的是windows 如果是其它系统,dll 换成so
我使用的环境是XAMPP1.7.7 apache 2.2.21

mod_limitipconn
官网下载地址:http://dominia.org/djao/limitipconn.html
限制下载线程模块,我希望用户只能开5个线程进行下载,只对ZIP,RAR做限制,不对其它文件做

限制,所以用户可以打开N多个网页,根据官方使用说明是这样的
<Location />
# 全局设置,对所有网站进行
MaxConnPerIP 1
NoIPLimit image/*
<Location /somewhere>
# 对指定目录设置,/somewhere代表网站根目录下的somewhere
目录
MaxConnPerIP 3
OnlyIPLimit audio/mpeg video
</Location>

</Location>
上面表示什么意思呢,就是说,对所有网站所有目录,限制同一个IP只能访问一次网站
但是 NoIPLimit image/* 对图片不影响,也就是说,你打开网页只能打开一次,你马上打开另一

个页面会出现503的错
OnlyIPLimit audio/mpeg video 表示仅对 音频与视频文件做IP线制,而且是somewhere目录 。

这就是官方的例子,也是大部份网站转载的例子,但实际上根本不符合要求。
比如说 audio/mpeg video image/* 是怎么来的呢,如何写呢,这里我告诉大家,这是MIME类型

,在apache的conf目录中有一个mime.types文件里面列出了常用的MIME类型
现在,我要对ZIP,RAR文件做限制,下载嘛,也就是这两种文件的包大,正确成功的写法如下

<Location />
MaxConnPerIP 5
#OnlyIPLimit application/zip application/octet-stream application/x-rar-compressed
OnlyIPLimit application/zip application/x-rar-compressed
</Location>
看到没,只允许用户下载zip,rar同时开5个线程下载,打开第6个就会返回503的错
这里有一点要注意,这个限制线程的模块MIME*好是确定的类型,像application/octet-stream
是不能成功的,这个表示bin iso等多种类型的MIME
只有像application/zip这种确定唯一类型的才会生效成功,多种类型之间用空格隔开

NoIPLimit的写法和OnlyIPLimit是一样的,这里就不列出了,一般是用不上,下面这张图是监控出来的效果,用的是卡巴网络监视

如何配置微信公众号服务器

在现代社会中,公众号已经普遍开来,那么作为开发者的人们首先要做的就是服务器的配置,配置不成功下面的事情也进行不下去,那么如何配置呢?身为小白的我就简单总结一下。

共分为3个步骤:

填写服务器配置
验证信息是否来自微信服务器
依据借口文档实现业务逻辑
首先你得有自己的一个公众号,进入平台后进入基本设置界面点修改配置会出现如下图(本人的已经填写)

Url:填写的URL即是你服务器验证代码的地址。

Token:这里的值可以根据要求随意设置,但必须与上面的URL地址的Token值保持一致,不一致也会导致验证失败,从而配置不成功。
%title插图%num

点提交即可。

运行

<?php
/**
* wechat php test
*/

//define your token
define(“TOKEN”, “weixin”);//Tolen 记得和基础设置里面的Token一致,不一定就是weixin
$wechatObj = new wechatCallbackapiTest();
$wechatObj->valid();//首次配置使用此方法

class wechatCallbackapiTest
{
public function valid()
{
$echoStr = $_GET[“echostr”];//首次配置会传输

//valid signature , option
if($this->checkSignature()){//此处调用方法 判断是否来自微信服务器
echo $echoStr;
exit;
}
}

public function responseMsg()//配置完成后调用此方法
{
//get post data, May be due to the different environments
$postStr = $GLOBALS[“HTTP_RAW_POST_DATA”];

//extract post data
if (!empty($postStr)){

$postObj = simplexml_load_string($postStr, ‘SimpleXMLElement’, LIBXML_NOCDATA);//将字符串转换为对象
$fromUsername = $postObj->FromUserName;
$toUsername = $postObj->ToUserName;
$keyword = trim($postObj->Content);
$time = time();
$textTpl = “<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[%s]]></MsgType>
<Content><![CDATA[%s]]></Content>
<FuncFlag>0</FuncFlag>
</xml>”;
if(!empty( $keyword ))
{
$msgType = “text”;
$contentStr = “Welcome to wechat world!”;
$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
echo $resultStr;
}else{
echo “Input something…”;
}

}else {
echo “”;
exit;
}
}

private function checkSignature()
{
$signature = $_GET[“signature”];
$timestamp = $_GET[“timestamp”];
$nonce = $_GET[“nonce”];

$token = TOKEN;
$tmpArr = array($token, $timestamp, $nonce);
sort($tmpArr);
$tmpStr = implode( $tmpArr );//数组转换为字符串
$tmpStr = sha1( $tmpStr );//加密

if( $tmpStr == $signature ){
return true;
}else{
return false;
}
}
}

?>

%title插图%num

点击提交若显示配置成功,那祝你成功配置好了,接下来就开动你的脑筋编写你的代码吧!

iphone编程之UILabel 用法详解

这段代码动态的创建了一个UILabel,并且把相关常用的属性都列举了.希望对大家有用.

– (void)viewDidLoad {

//创建uilabel

UILabel *label1 = [[UILabel alloc] initWithFrame:CGRectMake(20, 40, 280, 80)];

//设置背景色

label1.backgroundColor = [UIColor grayColor];

//设置tag

label1.tag = 91;

//设置标签文本

label1.text = @”CCBASE.NET!”;

//设置标签文本字体和字体大小

label1.font = [UIFont fontWithName:@”Arial” size:30];

//设置文本对其方式

label1.textAlignment = UITextAlignmentCenter;

//文本对齐方式有以下三种

//typedef enum {

// UITextAlignmentLeft = 0,左对齐

// UITextAlignmentCenter,居中对齐

// UITextAlignmentRight, 右对齐

//} UITextAlignment;

//文本颜色

label1.textColor = [UIColor blueColor];

//超出label边界文字的截取方式

label1.lineBreakMode = UILineBreakModeTailTruncation;

//截取方式有以下6种

//typedef enum {

// UILineBreakModeWordWrap = 0, 以空格为边界,保留整个单词

// UILineBreakModeCharacterWrap, 保留整个字符

// UILineBreakModeClip, 到边界为止

// UILineBreakModeHeadTruncation, 省略开始,以……代替

// UILineBreakModeTailTruncation, 省略结尾,以……代替

// UILineBreakModeMiddleTruncation,省略中间,以……代替,多行时作用于*后一行

//} UILineBreakMode;

//文本文字自适应大小

label1.adjustsFontSizeToFitWidth = YES;

//当adjustsFontSizeToFitWidth=YES时候,如果文本font要缩小时

//baselineAdjustment这个值控制文本的基线位置,只有文本行数为1是有效

label1.baselineAdjustment = UIBaselineAdjustmentAlignCenters;

//有三种方式

//typedef enum {

// UIBaselineAdjustmentAlignBaselines = 0, 默认值文本*上端于label中线对齐

// UIBaselineAdjustmentAlignCenters,//文本中线于label中线对齐

// UIBaselineAdjustmentNone,//文本*低端与label中线对齐

//} UIBaselineAdjustment;

//文本*多行数,为0时没有*大行数限制

label1.numberOfLines = 2;

//*小字体,行数为1时有效,默认为0.0

label1.minimumFontSize = 10.0;

//文本高亮

label1.highlighted = YES;

//文本是否可变

label1.enabled = YES;

//去掉label背景色

//label1.backgroundColor = [UIColor clearColor];

//文本阴影颜色

label1.shadowColor = [UIColor grayColor];

//阴影大小

label1.shadowOffset = CGSizeMake(1.0, 1.0);

//是否能与用户交互

label1.userInteractionEnabled = YES;

[self.view addSubview:label1];

[label1 release];

[super viewDidLoad];

}

IOS几个基本界面元素window(窗口)、视图(view)

要在屏幕上显示内容首先要创建一个窗口承载内容,要创建一个窗口,需要一个边框(frame),含有边框信息的底层 结构就CGRect。每个能够在屏幕上显示自己的对象都有一个边框,定义了他的显示区域,不过许多高层的视图类会自动计算这一信息。其他的那些类则在视图初始化时通过一个initWithFrame的初始化方法来设置。

再来认识一个类:UIScreen。UIScreen类代表了屏幕,通过这个类我们可以获取一些想要的东东。

CGrect screenBounds = [ [UIScreen mainScreen]bounds];//返回的是带有状态栏的Rect
CGRect viewBounds = [ [UIScreen mainScreen]applicationFrame];//不包含状态栏的Rect
//screenBounds 与 viewBounds 均是相对于设备屏幕来说的
//所以 screenBounds.origin.x== 0.0 ; screenBounds.oringin.y = 0.0; screenBounds.size.width == 320; screenBounds.size.height == 480(或者其他分辨率有所差异)
//所以 screenBounds.origin.x== 0.0 ; screenBounds.oringin.y = 20.0;(因为状态栏的高度是20像素) screenBounds.size.width == 320; screenBounds.size.height == 480
UIView

下面来认识一下UIView类,这个类继承自UIResponder,看这个名字我们就知道它是负责显示的画布,如果说把window比作画框的话。我们就是不断地在画框上移除、更换或者叠加画布,或者在画布上叠加其他画布,大小当然 由绘画者来决定了。有了画布,我们就可以在上面任意施为了。很多简单的东西我会把库里面的内容贴出来,如果东西太多贴出来就不太好,朋友们自己去库文件里面看吧。这个类在UIView.h里面。下面我们先学习一些基础的东西,其他的东东会在以后慢慢展开。

 

UIView* myView =[[ UIView alloc]initWithFrame:CGRectMake(0.0,0.0,200.0,400.0)];//这里创建了一块画布,定义了相对于父窗口的位置, 以及大小。
我们可以把这块画布加到其他画布上,具体方法后面会讲到。我们还可以在这块画布上画上其它好玩的东东,具体情形后面会一一讲解。
UIWindow

UIWindow继承自UIView,关于这一点可能有点逻辑障碍,画框怎么继承自画布呢?不要过于去专牛角尖,画框的形状不就是跟画布一样吗?拿一块画布然后用一些方法把它加强,是不是可以当一个画框用呢?这也是为什么 一个view可以直接加到另一个view上去的原因了。

看一下系统的初始化过程(在application didFinishLauchingWithOptions里面):

self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
self.window.backgroundColor = [UIColor grayColor];//给window设置一个背景色
[self.window makeKeyAndVisible];//让window显示出来
实战演练:
没结束我会用一个综合的 例子来总结我的学习成果,彻底理解所学,我觉得既然选择写代码,就要理解原理,否则只知其然不知其所以然是不能做一个好的程序员的。

1)新建一个工程选择Empty Application   名字为LW1
2)在application didFinishLaunchingWithOptions里面,你会发现系统已经建好一个画框了,我们现在就用系统帮我们建好的画框,你当然也可以自己建一个画框,不过没这个必要了,忘了讲了,一个应用程序只能有一个画框。

– (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];//系统帮你建画框
// Override point for customization after application launch.

//自己测试一下 bounds与aplicationFrame的区别
CGRect bound = [[UIScreen mainScreen]bounds];
NSLog(@”boundwidth:%f boundheight:%f “,bound.size.width, bound.size.height);
NSLog(@”boundx:%f boundy:%f “,bound.origin.x, bound.origin.y);

CGRect appBound = [[UIScreen mainScreen]applicationFrame];
NSLog(@”appBoundwidth:%f appBoundheight:%f “,appBound.size.width, appBound.size.height);
NSLog(@”appBoundx:%f appBoundy:%f “,appBound.origin.x, appBound.origin.y);

//画*块画布然涂成蓝色,大小是320 X 100
CGRect CGone = CGRectMake(0.0, 0.0, 320, 100);//画个矩形,初始化位置与大小
UIView *v_one = [[UIView alloc]initWithFrame:CGone];//初始化view
v_one.backgroundColor = [UIColor blueColor];// 涂成蓝色
[self.window addSubview:v_one];//直接加到画框上

//第二块注意它的位置
CGRect CGtwo = CGRectMake(0.0, 100, 160, 100);//画个矩形、初始化位置与大小
UIView *v_two = [[UIView alloc]initWithFrame:CGtwo];//初始化view
v_two.backgroundColor = [UIColor redColor];//涂成红色
[self.window addSubview:v_two];//叠加到画框

//第三块注意他的位置
CGRect CGthree = CGRectMake(160, 100, 160, 100);//
UIView *v_three = [[UIView alloc]initWithFrame:CGthree];//
v_three.backgroundColor = [UIColor greenColor];//
[self.window addSubview:v_three];//
//第四块注意它的位置
CGRect CGfour = CGRectMake(0.0, 260, 320, 200);//
UIView *v_four = [[UIView alloc]initWithFrame:CGfour];//
v_four.backgroundColor = [UIColor orangeColor];//
[self.window addSubview:v_four];//
//第五块,计算一下它的位置,看看它的效果,你可以让试一下把这段代码移到*快初始化的上面试试,会有意想不到的效果
CGRect CGfive = CGRectMake(100, 150, 160, 200);
UIView *v_five = [[UIView alloc]initWithFrame:CGfive];
v_five.backgroundColor = [UIColor yellowColor];
[self.window addSubview:v_five];
self.window.backgroundColor = [UIColor grayColor];//
[self.window makeKeyAndVisible];//
return YES;
}

iOS UIWindow:获取屏幕*上层的窗口

##简介 UIWindow表示应用程序的窗口,在APP启动时就为其加载并设置RootViewController。它是应用程序的入口,只有将界面添加到窗口中才能在设备上展示。

获取window有两种方式:

  1. 通过当前控制器的view获取:(不建议使用)
  1. // 当前窗口
  2. UIWindow *window = self.view.window;
  3. //(有时候window为null,原因是view没有完全加载完成或者在ViewDidload中才刚刚加载完,view的window属性无法被获取)
  4. 复制代码
  1. 通过UIApplication获取:(推荐,随时都可以获取到window)
  1. UIWindow *window = [UIApplication sharedApplication].keyWindow;
  2. 复制代码

##使用 在项目需求中,需要将某一UIView控件添加到*上层,可以考虑获取当前顶层的窗口来添加UIView控件。

  1. UIView *aView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 150, 300)];
  2. aView.backgroundColor = [UIColor redColor];
  3. // 当前顶层窗口
  4. UIWindow *window = [[UIApplication sharedApplication].windows lastObject];
  5. // 添加到窗口
  6. [window addSubview:aView];
  7. 复制代码

但是会有一种情况出现,当键盘(也是一个窗口:UITextEffectsWindow)被弹出时可能会将要展示的UIView覆盖,这是必然的,因为有一个先后关系,后者居上。 这种情况下可以监听键盘的弹出,在当前顶层的窗口来添加UIView控件。

iOS 去掉tableViewCell 点击效果 三个简单方法

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{

// 1 松开手选中颜色消失

[tableView deselectRowAtIndexPath:indexPath animated:YES];

UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
// 2
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
// 3点击没有颜色改变
cell.selected = NO;

}

Xcode10 打开旧项目报错Multiple commands produce定位到Info.plist解决方案

今天一早升级了Xcode10 结果一打开项目直接闭门停了。

报错内容如下:

————————————————————–

Showing Recent Messages

:-1: Multiple commands produce ‘/Users/apple/Library/Developer/Xcode/DerivedData/spor-alxyeeddbojurrdoaxniuovitgdw/Build/Products/Debug-iphoneos/spor.app/Info.plist’:

1) Target ‘spor’ (project ‘spor) has copy command from ‘/Users/apple/Downloads/NoAppNoPush/spor/External/Masonry/Info.plist’ to ‘/Users/apple/Library/Developer/Xcode/DerivedData/spor-alxyeeddbojurrdoaxniuovitgdw/Build/Products/Debug-iphoneos/spor.app/Info.plist’

2) Target ‘spor’ (project ‘spor’) has process command with output ‘/Users/apple/Library/Developer/Xcode/DerivedData/spor-alxyeeddbojurrdoaxniuovitgdw/Build/Products/Debug-iphoneos/spor.app/Info.plist’

————————————————————-

解决方案:

选择 xcode -> File -> Project Seetongs…. -> Shared Project Seetings: -> Build System -> Legacy Build System ->Done

选择蓝色的 -> Done  -> 编译通过