addObjectsFromArray 除权除息是什么意思思

ios开发小常识_中华文本库
第2页/共1页
文本预览:
杭州 java 软件培训
可以调用 closePath,从当前点画一条直线到当前子路径的初始点。如果要填充路径,应当 使用 fill 方法,此方法会填充路径中得所有封闭子路径。
[color=darkblue]三 容器 [/color]
-NSArray 和 NSMutableArray +array:创建一个空数组 +arrayWithArray:从另一个数组创建新的数组 +arrayWithContentsOfFile:读文件创建数组 +arrayWithObject:创建一个数组,其中包含一个给定对象 +arrayWithObjects +arrayWithObjects:count: 从 C 数组创建 -containsObject:是否包含一个元素 -count:数量 -lastObject:返回最后一个 -objectAtIndex:返回某一个 -objectsAtIndexes:返回一组,类型为 NSArray -indexOfObject:返回对象索引 -arrayByAddingObject:原数组最后加一个对象,产生一个新的数组 -arrayByAddingObjectsFromArray:在原数组的最后添加另一个数组中的所有对象,产生一个 新数组 -subarrayWithRange:抽取原数组中得一部分,产生一个新的数组 -isEqualToArray:比较两个数组是否相同 -writeToFile:atomically:保存数组至一个文件 -writeToURL:atomically:保存数组至一个 URL -addObject:在数组最后添加一个对象 -addObjectsFromArray:在原数组最后添加另一个数组的全部对象 -insertObject:atIndex:向原数组制定位置添加一个对象 -insertObjects:atIndexes:向原数组中一系列位置添加一系列对象 -removeAllObjects:移除数组中的全部对象 -removeLastObject:移除数组中最后一个对象 -removeObject:移除一个对象 -removeObjectAtIndex:移除位于指定位置的对象 -removeObjectsAtIndexes:移除位于一系列位置的对象 -replaceObjectAtIndex:withObject 用给定对象替换位于指定位置的对象 -replaceObjectsAtIndexes:withObjects:多对象,多位置版本 -setArray:用另一个数组中的所有对象来替换当前数组中的所有对象 -NSDictionary 与 NSMutableDictionary +dictionary +dictionaryWithContentsOfFile +dictionaryWithContentsOfURL +dictionaryWithDictionary +dictionaryWithObject:forKey +dictionaryWithObjects:forKeys +dictionaryWithObjectsAndKeys
杭州网络营销培训
第2页/共1页
寻找更多 ""NSDictionary / NSMutableDictionary 及 NSArray / NSmutableArray (实例) - Just Code - ITeye技术网站
博客分类:
NSDictionary 和 NSArray一样是不可变的对象。用来实现字典集合,在给定关键字(通常是一个NSString字符串)下存储一个数值(可以是任何类型的对象)。
NSDictionary使用类方法 dictionaryWithObjectAndKeys: 来创建字典;使用方法objectForKey: 来获取字典中的值。
NSDictionary *dict = [NSDictionary dictionaryWithObjectAndKeys:@"just",@"firstname",
@"code",@"lastname",
@"",@"email",
NSString* firstName = [dict objectForKey:@"firstname"];
NSMutableDictionary是可变对象,可以进行添加和删除操作。可以是用dictionaryWithCapacity: (这里的容量也只是个参考值,表示对大小的限制)或 dictionary 来创建可变字典。
//NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
[dict setObject:@"John" forKey:@"Firstname"];
[dict setObject:@"Doe" forKey:@"Lastname"];
[dict setObject:@"" forKey:@"Email"];
NSLog(@"%@", dict);
NSArray *keys = [dict allKeys];
// values in foreach loop
for (NSString *key in keys) {
NSLog(@"%@ is %@",key, [dict objectForKey:key]);
[dict removeObjectForKey:@"Email"];
addObject : 在数组末尾添加对象 (id)anObject
removeObjectAtIndex : 删除特定索引处的对象
Objective-C数组相关操作。
// insert code here...
NSLog(@"数组");
//指定多个字符串创建数组
array=[NSArray arrayWithObjects:@"0-asd",@"1-fds",@"2-哈咯",@"3-个人",nil];
//数组的长度
NSLog(@"数组长度%d",array.count);
//通过索引取得对象
for(int i=0;i&array.i++)
NSString *secondStr=[array objectAtIndex:i];
NSLog(secondStr,nil);
//高速枚举法取得对象,Objective-C2.0开始支持,
for(NSString *str in array)
NSLog(str,nil);
//对象的追加于删除
//创建空数组
NSMutableArray *MutArray=[NSMutableArray array];
//追加对象
[MutArray addObject:@"A"];
[MutArray addObjectsFromArray:array];
//插入对象
NSString *thstr=@"插入值";
[MutArray insertObject:thstr atIndex:4];
//替换对象
[MutArray replaceObjectAtIndex:2 withObject:@"替换"];
//删除所有对象
//[Mutarray removeAllObjects];
//删除最后的对象
[MutArray removeLastObject];
//删除索引为Index的对象
[MutArray removeObjectAtIndex:0];
//删除所有于object同值的对象
[MutArray removeObject:@"0-asd"];
//删除数组中所有与object等价的对象
[MutArray removeObjectIdenticalTo:thstr];
//删除数组中所有与数组array包含相同的元素
[MutArray removeObjectsInArray:array];
NSLog(@"%@",MutArray);
NSDictionary 常用方法总结
+(id)dictionaryWithObjectsAndKeys:obj1,key1,obj2,key2,......nil
顺序添加对象和键值来创建一个字典,注意结尾是nil
-(id)initWithObjectsAndKeys::obj1,key1,obj2,key2,......nil
初始化一个新分配的字典,顺序添加对象和值,结尾是nil
-(unsigned int)count
返回字典中的记录数
-(NSEnumerator*)keyNSEnumerator
返回字典中的所有键到一个 NSEnumerator 对象
-(NSArray*)keysSortedByValueUsingSelector:(SEL)selector
将字典中所有键按照selector 指定的方法进行排序,并将结果返回
-(NSEnumerator*)objectEnumerator
返回字典中所有的值到一个 NSEnumetator 类型对象
-(id)objectForKey:key
返回指定key 值的对象
NSMutableDictionary 常用方法总结
+(id)dictionaryWithCapacity:size
创建一个size大小的可变字典
-(id)initWithCapacity:size
初始化一个size 大小的可变字典
-(void)removeAllObjects
删除字典中所有元素
-(void)removeObjectForKey:key
删除字典中key位置的元素
-(void)setObject:obj forKey:key
添加 (key , obj)到字典中去;若key已经存在,则替换值为 obj
NSArray 不可变数组 常用方法
+(id)arrayWithObjects:obj1,obj2,...nil
创建一个新的数组,obj1,obj2......是他的元素对象,以nil对象结尾
-(BOOL)containsObject:obj
确定数组中是否包含对象obj
-(NSUInteger)count
返回数组元素个数
-(NSUInteger)indexOfObject:obj
第一个包含obj元素的索引号
-(id)objectAtIi
返回存储在位置 i 的对象
-(void)makeObjectsPerformSelector:(SEL)selector
将 selector 只是的消息发送给数组中的每个元素
-(NSArray*)sortedArrayUsingSelector:(SEL)selector
根据selector 指示的比较方法对数组进行排序
-(BOOL)writeToFile:path atomically:(BOOL)flag
将数组写入指定的文件中,如果 flag 为 YES,则需要先创建一个临时文件
NSmutableArray 常用方法总结
创建一个空数组
+(id)arrayWithCapacity:size
创建一个数组,指定容量为size
-(id)initWithCapacity:size
初始化一个新分配的数组,指定容量为size
-(void)addObject:obj
将对象obj添加到数组末尾
-(void)insertObject:obj atIndex:i
将对象 obj 插入到索引为 i 的位置
-(void)replaceObject:obj atIndex:i
将数组中索引为 i 处的元素用obj 置换
-(void)removeObject:obj
从数组中删除所有是 obj 的对象
-(void)removeObjectAtIndex:i
从数组中删除索引为 i 的对像
-(void)sortUsingSelector:(SEL)selector
用 selector 只是的比较方法将数组排序
浏览 10806
浏览: 4121617 次
来自: 洛杉矶
本地需要安装什么软件么
yekairush 写道ie11怎么好像不支持!我好像没有试过 ...
niunan 写道 终于学会啦。。感谢LZ。。。。不客气!
终于学会啦。。感谢LZ。。。。
ie11怎么好像不支持!详细整理:UITableView优化技巧
时间: 15:34:04
最近在微博上看到一个很好的开源项目,是关于如何优化UITableView的。加上正好最近也在优化项目中的类似朋友圈功能这块,思考了很多关于UITableView的优化技巧,相信这块是难点也是痛点,所以决定详细的整理下我对优化UITableView的理解。UITableView作为iOS开发中最重要的控件之一,其中的实现原理很是考究。Apple在这块的优化水平直接决定了iOS的体验能甩安卓几条街,哈哈,扯淡扯多了。。。好了,废话不多说,直接进入主题。首先来谈谈我对UITableView的认识:UITableView的简单认识UITableView最核心的思想就是UITableViewCell的重用机制。简单的理解就是:UITableView只会创建一屏幕(或一屏幕多一点)的UITableViewCell,其他都是从中取出来重用的。每当Cell滑出屏幕时,就会放入到一个集合(或数组)中(这里就相当于一个重用池),当要显示某一位置的Cell时,会先去集合(或数组)中取,如果有,就直接拿来显示;如果没有,才会创建。这样做的好处可想而知,极大的减少了内存的开销。知道UITableViewCell的重用原理后,我们来看看UITableView的回调方法。UITableView最主要的两个回调方法是tableView:cellForRowAtIndexPath:和tableView:heightForRowAtIndexPath:。理想上我们是会认为UITableView会先调用前者,再调用后者,因为这和我们创建控件的思路是一样的,先创建它,再设置它的布局。但实际上却并非如此,我们都知道,UITableView是继承自UIScrollView的,需要先确定它的contentSize及每个Cell的位置,然后才会把重用的Cell放置到对应的位置。所以事实上,UITableView的回调顺序是先多次调用tableView:heightForRowAtIndexPath:以确定contentSize及Cell的位置,然后才会调用tableView:cellForRowAtIndexPath:,从而来显示在当前屏幕的Cell。举个例子来说:如果现在要显示100个Cell,当前屏幕显示5个。那么刷新(reload)UITableView时,UITableView会先调用100次tableView:heightForRowAtIndexPath:方法,然后调用5次tableView:cellForRowAtIndexPath:方法;滚动屏幕时,每当Cell滚入屏幕,都会调用一次tableView:heightForRowAtIndexPath:、tableView:cellForRowAtIndexPath:方法。看到这里,想必大伙也都能隐约察觉到,UITableView优化的首要任务是要优化上面两个回调方法。事实也确实如此,下面按照我探讨进阶的过程,来研究如何优化:优化探索,项目拿到手时代码是这样:- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
ContacterTableCell *cell = [tableView dequeueReusableCellWithIdentifier:@&ContacterTableCell&];
if (!cell) {
cell = (ContacterTableCell *)[[[NSBundle mainBundle] loadNibNamed:@&ContacterTableCell& owner:self options:nil] lastObject];
NSDictionary *dict = self.dataList[indexPath.row];
[cell setContentInfo:dict];}- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
return cell.frame.size.}看到这段代码,对于刚毕业的我来说,觉得还是蛮巧妙的,但巧归巧,当Cell非常复杂的时候,直接卡出翔了。。。特别是在我的Touch4上,这我能忍?!好吧,依据上面UITableView原理的分析,我们先来分析它为什么卡?这样写,在Cell赋值内容的时候,会根据内容设置布局,当然也就可以知道Cell的高度,想想如果1000行,那就会调用1000+页面Cell个数次tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath方法,而我们对Cell的处理操作,都是在这个方法里的!什么赋值、布局等等。开销自然很大,这种方案Pass。。。改进代码。改进代码后:- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
NSDictionary *dict = self.dataList[indexPath.row];
return [ContacterTableCell cellHeightOfInfo:dict];}思路是把赋值和计算布局分离。这样让tableView:cellForRowAtIndexPath:方法只负责赋值,tableView:heightForRowAtIndexPath:方法只负责计算高度。注意:两个方法尽可能的各司其职,不要重叠代码!两者都需要尽可能的简单易算。Run一下,会发现UITableView滚动流畅了很多。。。基于上面的实现思路,我们可以在获得数据后,直接先根据数据源计算出对应的布局,并缓存到数据源中,这样在tableView:heightForRowAtIndexPath:方法中就直接返回高度,而不需要每次都计算了。- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
NSDictionary *dict = self.dataList[indexPath.row];CGRect rect = [dict[@&frame&] CGRectValue];
return rect.frame.}其实上面的改进方法并不是最佳方案,但基本能满足简单的界面!记得开头我的任务吗?像朋友圈那样的图文混排,这种方案还是扛不住的!我们需要进入更深层次的探究:自定义Cell的绘制。我们在Cell上添加系统控件的时候,实质上系统都需要调用底层的接口进行绘制,当我们大量添加控件时,对资源的开销也会很大,所以我们可以索性直接绘制,提高效率。是不是说的很抽象?废话不多说,直接上代码:首先需要给自定义的Cell添加draw方法,(当然也可以重写drawRect)然后在方法体中实现://异步绘制dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
CGRect rect = [_data[@&frame&] CGRectValue];
UIGraphicsBeginImageContextWithOptions(rect.size, YES, 0);
CGContextRef context = UIGraphicsGetCurrentContext();//整个内容的背景
[[UIColor colorWithRed:250/255.0 green:250/255.0 blue:250/255.0 alpha:1] set];
CGContextFillRect(context, rect);//转发内容的背景
if ([_data valueForKey:@&subData&]) {
[[UIColor colorWithRed:243/255.0 green:243/255.0 blue:243/255.0 alpha:1] set];
CGRect subFrame = [_data[@&subData&][@&frame&] CGRectValue];
CGContextFillRect(context, subFrame);
[[UIColor colorWithRed:200/255.0 green:200/255.0 blue:200/255.0 alpha:1] set];
CGContextFillRect(context, CGRectMake(0, subFrame.origin.y, rect.size.width, .5));
float leftX = SIZE_GAP_LEFT+SIZE_AVATAR+SIZE_GAP_BIG;
float x = leftX;
float y = (SIZE_AVATAR-(SIZE_FONT_NAME+SIZE_FONT_SUBTITLE+6))/2-2+SIZE_GAP_TOP+SIZE_GAP_SMALL-5;
[_data[@&name&] drawInContext:context withPosition:CGPointMake(x, y) andFont:FontWithSize(SIZE_FONT_NAME)
andTextColor:[UIColor colorWithRed:106/255.0 green:140/255.0 blue:181/255.0 alpha:1]
andHeight:rect.size.height];
//时间+设备
y += SIZE_FONT_NAME+5;
float fromX = leftX;
float size = [UIScreen screenWidth]-leftX;
NSString *from = [NSString stringWithFormat:@&%@
%@&, _data[@&time&], _data[@&from&]];
[from drawInContext:context withPosition:CGPointMake(fromX, y) andFont:FontWithSize(SIZE_FONT_SUBTITLE)
andTextColor:[UIColor colorWithRed:178/255.0 green:178/255.0 blue:178/255.0 alpha:1]
andHeight:rect.size.height andWidth:size];
}//将绘制的内容以图片的形式返回,并调主线程显示UIImage *temp = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
dispatch_async(dispatch_get_main_queue(), ^{
if (flag==drawColorFlag) {
postBGView.frame =
postBGView.image =
postBGView.image =
}}//内容如果是图文混排,就添加View,用CoreText绘制[self drawText];}}上述代码只贴出来部分功能,但大体的思路都是一样的,各个信息都是根据之前算好的布局进行绘制的。这里是需要异步绘制,但如果在重写drawRect方法就不需要用GCD异步线程了,因为drawRect本来就是异步绘制的。对于图文混排的绘制,可以移步Google,研究下CoreText,这块内容太多了,不便展开。好了,至此,我们又让UITableView的效率提高了一个等级!但我们的步伐还远远不止这些,下面我们还可以从UIScrollView的角度出发,再次找到突破口。滑动UITableView时,按需加载对应的内容直接上代码://按需加载 - 如果目标行与当前行相差超过指定行数,只在目标滚动范围的前后指定3行加载。- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset{
NSIndexPath *ip = [self indexPathForRowAtPoint:CGPointMake(0, targetContentOffset-&y)];
NSIndexPath *cip = [[self indexPathsForVisibleRows] firstObject];
NSInteger skipCount = 8;
if (labs(cip.row-ip.row)&skipCount) {
NSArray *temp = [self indexPathsForRowsInRect:CGRectMake(0, targetContentOffset-&y, self.width, self.height)];
NSMutableArray *arr = [NSMutableArray arrayWithArray:temp];
if (velocity.y&0) {
NSIndexPath *indexPath = [temp lastObject];
if (indexPath.row+33) {
[arr addObject:[NSIndexPath indexPathForRow:indexPath.row-3 inSection:0]];
[arr addObject:[NSIndexPath indexPathForRow:indexPath.row-2 inSection:0]];
[arr addObject:[NSIndexPath indexPathForRow:indexPath.row-1 inSection:0]];
[needLoadArr addObjectsFromArray:arr];
}}记得在tableView:cellForRowAtIndexPath:方法中加入判断:if (needLoadArr.count&0&&[needLoadArr indexOfObject:indexPath]==NSNotFound) {
[cell clear];}滚动很快时,只加载目标范围内的Cell,这样按需加载,极大的提高流畅度。写了这么多,也差不多该来个总结了!UITableView的优化主要从三个方面入手:提前计算并缓存好高度(布局),因为heightForRowAtIndexPath:是调用最频繁的方法;异步绘制,遇到复杂界面,遇到性能瓶颈时,可能就是突破口;滑动时按需加载,这个在大量图片展示,网络加载的时候很管用!(SDWebImage已经实现异步加载,配合这条性能杠杠的)。除了上面最主要的三个方面外,还有很多几乎大伙都很熟知的优化点:正确使用reuseIdentifier来重用Cells尽量使所有的view opaque,包括Cell自身尽量少用或不用透明图层如果Cell内现实的内容来自web,使用异步加载,缓存请求结果减少subviews的数量在heightForRowAtIndexPath:中尽量不使用cellForRowAtIndexPath:,如果你需要用到它,只用一次然后缓存结果尽量少用addView给Cell动态添加View,可以初始化时就添加,然后通过hide来控制是否显示尾巴肯定很多人会非常好奇,为什么我都是手动用代码创建Cell的?现在主流不都是Xib、Storyboard什么的嘛?我的回答是:要想提高效率,还是手动写有用!抛开Xib、Storyboard需要系统自动转码,给系统多加了一层负担不谈,自定义Cell的绘制更是无从下手,所以,在我看来,复杂的需要高效的界面,还是手动写代码吧!!!最后如果你们的项目都是用的Xib、Storyboard,并需要优化UITableView的话,sunnyxx大神提出了好的方案: 大伙可以自行研究研究。知识是需要不断学习的,作为刚上路的我,如果有什么理解不到位的,欢迎大伙留言指正,如果你有什么更牛逼的想法,希望一起交流交流。注明:本篇的分析源码来源于开源项目VVeboTableViewDemo参考:来源:addObjectsFromArray:不复制到全局的NSMutableArray
因此,这里是相关的代码的部分样本。
static NSMutableArray *radioInputA
static NSMutableArray *buttonsA
- (IBAction)lookForRadioButtons:(id)sender {
// NSLog(@"Testing");
NSString *radiostr = [NSString stringWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"getRadios" ofType:@"txt"] encoding:NSASCIIStringEncoding error: &error] ;
if (radiostr == nil)
NSLog (@"Error! %@", error);
NSLog(@"%@",radiostr);
NSString *radiotxt= [webView stringByEvaluatingJavaScriptFromString:radiostr];
NSLog(@"%@", radiotxt);
NSArray *myRadios = [radiotxt componentsSeparatedByString:@"::"];
[radioInputArray addObjectsFromArray:myRadios];
NSLog(@"%d", myRadios.count);
NSLog(@"Number of buttons in global radio array %d", radioInputArray.count);
NSLog(@"%d", scrollViewer.subviews.count);
因此,它不会引发异常,似乎除了正常后工作addObjectsFromArray:,我在全局数NSMutableArray是0(在myRadios计数=56)。我敢肯定,他们应该是平等的在这一点上,但都没有。我已经申报了NSMutableArray向上接近顶部 CodeGo.net,这样它可以在全局访问。我错过比如分配和初始化呢?这岂不是做了像自动在C#中?再次,这是我优先次涉足到Objective-C的世界从Windows编程所以请温柔又随意是至关重要的。
本文地址 :CodeGo.net/395017/
-------------------------------------------------------------------------------------------------------------------------
1. 你的两个全局数组进行初始化。
static NSMutableArray *radioInputA
static NSMutableArray *buttonsA
只是定义两个变量指针NSMutableArray,所以你需要让他们指向的类的实际实例NSMutableArray。
在你的初始化代码,或者通过访问器(最好的,如果一个你应该设置的变量为空,新分配NSMutableArray。
这里有一个方法来做到这一点:
+ (NSMutableArray*)radioInputArray
if (!radioInputArray) {
radioInputArray = [[NSMutableArray alloc] init];
return radioInputA
访问者在你的代码,而不是全局变量。
它可能会发生,如果你的radioInputArray是nil CodeGo.net,
你没有初始化的数组
你需要添加
[[radioInputArray alloc] init];
你做任何事情之前,与radioInputArray
本文标题 :addObjectsFromArray:不复制到全局的NSMutableArray
本文地址 :CodeGo.net/395017/
Copyright (C) 2014 CodeGo.net 沪ICP备号 联&系& c&o&d&e&g&o &@&1&2&6&.&c&o&mAutoLayout详解+手把手实战
首先说一下这篇博客虽然是标记为原创,但是事实并非本人亲自写出来的,知识点和例子本人花了一天各处查找和整理最终决定写一个汇总的详解,解去各位朋友到处盲目查找的必要,因为不是转载某一个人的内容,故此不标记为转载,因为加入了个人的理解和细心整理所以标为原创,请谅解!
1.首先我们要明确,当我们使用自动布局的时候为了不让Contraint和view本身的autoresize属性发生冲突,我们首先需要把控件 的属性设为setTranslatesAutoresizingMaskIntoConstraints:NO
2.分清楚两个函数的不同用处
@1 + (NSArray *)constraintsWithVisualFormat:(NSString *)format options:(NSLayoutFormatOptions)opts metrics:(NSDictionary *)metrics views:(NSDictionary *)
+(instancetype)constraintWithItem:(id)view1 attribute:(NSLayoutAttribute)attr1 relatedBy:(NSLayoutRelation)relation toItem:(id)view2 attribute:(NSLayoutAttribute)attr2 multiplier:(CGFloat)multiplier constant:(CGFloat)c;
使用之前先明确一点:既然是布局,再我们布局的时候必须是相对的对吧,所以我们布局通常都是把两个view在一起捆绑,相互之间存在某种关系做一些约束,通常不存在一个view布局的现象!
注意到第一个函数是一个格式化输入( format),外加输出的是一个数组,一般来说格式化的会包含很多信息量的,所以这个也不例外,可以包含许多布局信息
首先说一下两个函数的使用的不同方式
constraintWithItem函数的使用方式直接用addConstraint添加到父亲视图就好了
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:tfEmail
attribute:NSLayoutAttributeHeight
relatedBy:NSLayoutRelationEqual
toItem:nil
attribute:NSLayoutAttributeNotAnAttribute
multiplier:1.0
constant:35]];
创建约束的方式如下:
[NSLayoutConstraint constraintWithItem:(id)item
attribute:(NSLayoutAttribute)attribute
relatedBy:(NSLayoutRelation)relation
toItem:(id)otherItem
attribute:(NSLayoutAttribute)otherAttribute
multiplier:(CGFloat)multiplier
constant:(CGFloat)constant]
第一个参数:指定约束左边的视图view1
第二个参数:指定view1的属性attr1,具体属性见文末。
第三个参数:指定左右两边的视图的关系relation,具体关系见文末。
第四个参数:指定约束右边的视图view2
第五个参数:指定view2的属性attr2,具体属性见文末。
第六个参数:指定一个与view2属性相乘的乘数multiplier
第七个参数:指定一个与view2属性相加的浮点数constant
这个函数的对照公式为:
view1.attr1
view2.attr2 * multiplier + constant
1.如果你想设置的约束里不需要第二个view,要将第四个参数设为nil,第五个参数设为NSLayoutAttributeNotAnAttribute
[NSLayoutConstraint constraintWithItem:view1
attribute:NSLayoutAttributeLeft
relatedBy:NSLayoutRelationEqual
toItem:view2
attribute:NSLayoutAttributeRight
multiplier:1
constant:10]
翻译过来就是:view1的左侧,在,view2的右侧,再多10个点,的地方(经典)。
附视图的属性和关系的值:
typedef NS_ENUM(NSInteger, NSLayoutRelation) {
NSLayoutRelationLessThanOrEqual = -1,
//小于等于
NSLayoutRelationEqual = 0,
NSLayoutRelationGreaterThanOrEqual = 1,
//大于等于
typedef NS_ENUM(NSInteger, NSLayoutAttribute) {
NSLayoutAttributeLeft = 1,
NSLayoutAttributeRight,
NSLayoutAttributeTop,
NSLayoutAttributeBottom,
NSLayoutAttributeLeading,
NSLayoutAttributeTrailing,
NSLayoutAttributeWidth,
NSLayoutAttributeHeight,
NSLayoutAttributeCenterX,
NSLayoutAttributeCenterY,
NSLayoutAttributeBaseline,
//文本底标线
NSLayoutAttributeNotAnAttribute = 0
//没有属性
NSLayoutAttributeLeft/NSLayoutAttributeRight 和 NSLayoutAttributeLeading/NSLayoutAttributeTrailing的区别是left/right永远是指左右,而leading/trailing在某些从右至左习惯的地区会变成,leading是右边,trailing是左边。(大概是⊙n⊙b)
实战解析:
UILabel *note = [[UILabel alloc] init];
[note setText:@"欢迎提出宝贵意见!您留下的每一份心意都将浇灌母婴宝的茁壮成长。"];
[note setLineBreakMode:NSLineBreakByWordWrapping];
note.numberOfLines = 0;
[self.view addSubview:note];
//将自适应向布局约束的转化关掉(根据情况有时需要有时不需要)
[note setTranslatesAutoresizingMaskIntoConstraints:NO];
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:note
attribute:NSLayoutAttributeTop
relatedBy:NSLayoutRelationEqual
toItem:_nab //_nab是导航条
attribute:NSLayoutAttributeBottom
multiplier:1.0
constant:10]];
文字解释:这个文字处于导航条下面+10的位置:
代码解释:note.frame.origin.y = _nab.frame.origin.y+_nab.frame.size.height + 10
字面量解释: note.NSLayoutAttributeTop
NSLayoutRelationEqual _nab.NSLayoutAttributeBottom*1.0 + 10
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:note
attribute:NSLayoutAttributeLeft
relatedBy:NSLayoutRelationEqual
toItem:self.view
attribute:NSLayoutAttributeLeft
multiplier:1.0
constant:10]];
这个大家算是给你自己一个测试,看能不能对着讲出它的含义来,注意一点他们的约束都是加在他们共同的父视图self.view上
关于constraintsWithVisualFormat:函数介绍:
constraintsWithVisualFormat:参数为NSString型,指定Contsraint的属性,是垂直方向的限定还是水平方向的限定,参数定义一般如下:
V:|-(>=XXX) :表示垂直方向上相对于SuperView大于、等于、小于某个距离
若是要定义水平方向,则将V:改成H:即可
在接着后面-[]中括号里面对当前的View/控件 的高度/宽度进行设定;
options:字典类型的值;这里的值一般在定义的一个enum里面选取
metrics:nil;一般为nil ,参数类型为NSDictionary,从外部传入 //衡量标准
views:就是上面所加入到NSDictionary中的绑定的View
在这里要注意的是 AddConstraints
和 AddConstraint 之间的区别,一个添加的参数是NSArray,一个是NSLayoutConstraint
|: 表示父视图
-:表示距离
>= :表示视图间距、宽度和高度必须大于或等于某个值
<= :表示视图间距、宽度和高度必须小宇或等于某个&#20540;
== :表示视图间距、宽度或者高度必须等于某个&#20540;
:>=、<=、==
1.|-[view]-|:
视图处在父视图的左右边缘内
2.|-[view]
视图处在父视图的左边缘
视图和父视图左边对齐
4.-[view]-
设置视图的宽度高度
5.|-30.0-[view]-30.0-|:
表示离父视图 左右间距
6.[view(200.0)] : 表示视图宽度为 200.0
7.|-[view(view1)]-[view1]-| :表示视图宽度一样,并且在父视图左右边缘内
8. V:|-[view(50.0)] : 视图高度为
9: V:|-(==padding)-[imageView]->=0-[button]-(==padding)-| : 表示离父视图的距离
为Padding,这两个视图间距必须大于或等于0并且距离底部父视图为 padding。
[wideView(>=60@700)]
:视图的宽度为至少为60 不能超过
11: 如果没有声明方向默认为
使用方式:
1.首先需要创建一个数组来保存,这个约束返回的数组
NSMutableArray *tmpConstraints = [NSMutableArray array];
2.第二点就是创建约束,创建的方式按上面的规定写
[tmpConstraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[tfEmail]-10-[btnSubmit(==35)]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(tfEmail,btnSubmit)]];
[tmpConstraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-10-[btnSubmit]-10-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(btnSubmit)]];
3.把创建的约束保存到之前创建的数组中
4.把这个包含约束的总数组,加到他们共同的父视图self.view上作为一个约束数组传递进去
[self.view addConstraints:tmpConstraints];
实战解读:
[tmpConstraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-10-[btnSubmit]-10-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(btnSubmit)]];
H 水平方向
:| 父视图左边
10 10个像素
[btnSubmit] 提交按钮
10 10个像素
| 父视图右边
总的解读:这个提交按钮距离父视图左边10个像素,右边10个像素
[tmpConstraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[tfEmail]-10-[btnSubmit(==35)]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(tfEmail,btnSubmit)]];
V:垂直方向上
[tfEmail] 邮件输入框
10 10个像素
[btnSubmit(==35)] 提交按钮 height = 35
总的解读:提交按钮再输入框下面10个位置处
关于绑定元素的理解:我是这样理解的:用到两个元素时,就绑定两个。用到一个,绑定一个就行了
鉴于自动布局的复杂性,我将继续研究,更新中。。。。。
大牛给的资料大集合,超级赠送,噢耶!!赶快收藏吧!!!
http://commandshift.co.uk/blog//creating-individual-layout-constraints/
/2014/06/introduction-to-visual-format-language-for-auto-layout-on-ios/
VFL http://commandshift.co.uk/blog//visual-format-language-for-autolayout/
http://www.thinkandbuild.it/learn-to-love-auto-layout-programmatically/
autolayout 在项目中的使用
/smileyborg/TableViewCellWithAutoLayout
/smileyborg/PureLayout
pureLayout
/questions//using-auto-layout-in-uitableview-for-dynamic-cell-layouts-variable-row-heights
//use-masonry-to-quick-solve-autolayout/
自动布局中的一些讲解(setNeedsUpdateConstraints,updateConstraintsIfNeeded)等
http://my.oschina.net/w11h22j33/blog/208574
您对本文章有什么意见或着疑问吗?请到您的关注和建议是我们前行的参考和动力&&
您的浏览器不支持嵌入式框架,或者当前配置为不显示嵌入式框架。

我要回帖

更多关于 除权除息是什么意思 的文章

 

随机推荐