frame和约束哪个高优先级中断高

当前访客身份:游客 [
一只想要改变世界的小菜鸟
:标记,真在努力学习语法中
:写的好不错,谢谢[0]
:引用来自“wqh_iOS”的评论博主,我想请教你下,...
:引用来自“wqh_iOS”的评论博主,我想请教你下,...
:博主,我想请教你下,,自己做完缓存后,我向定时...
:引用来自“芳仔小脚印”的评论 发现你所有地方的...
今日访问:21
昨日访问:172
本周访问:398
本月访问:2060
所有访问:11006
列表模式: |
用Swift实现的FlappyBird小游戏
& & & 伴随着apple公司对swift的推广态度深入,swift火的很快,并且swift精简便捷的语法和强大的功能,对于使用Object—C开发iOS的开发者来说,也有必要了解学习一下swift。这篇博客跳过swift干涩的语法,直接从一个小游戏项目开始使用swift,将其中收获总结如下:
& & FlappyBird是前段时间很火的一款小游戏,通过手指点击屏幕平衡小鸟通过障碍。我是将以前OC版的项目拿来改成了swift,所以整体的思路还是OC的开发思路。
&&&&首先,我需要定义两个宏,一个用来模拟重力加速度G,一个用来便捷获取设备屏幕尺寸。因为这个游戏非常简单,开发起来也只需要几个小时,所以我们只需要在一个文件中写代码:viewController.swift。
&&&&swift中没有一般语言中的宏定义,但是可以通过定义常量的形式实现宏的效果:
//用常量的形式代理OC中的宏定义
let&G:Float=9.8
let&SCREEN_SIZE&=&UIScreen.mainScreen().bounds
& &&我们需要定义一些成员变量,如下:
class&ViewController:&UIViewController&{
&&&&var&timer:NSTimer?//背景移动的定时器
&&&&var&i:Int=0//背景移动的速度
&&&&var&timer2:NSTimer?//柱子和地面移动的定时器
&&&&var&timer3:NSTimer?//小鸟移动的定时器
&&&&var&bird:UIImageView?
&&&&var&t:Float=0.0//小鸟下落的速度
&&&&var&isDowm:Bool=false//标记小鸟是否在下落
&&&&var&isGameOver:Bool=false//标记是否游戏结束
& & 对于?和!号的理解,网上概念很多,简单理解声明变量时如果不初始化系统是不会给变量赋nil的,会报错,?的作用就是告诉系统这里如果没有初始化就是nil。同理,在用这类变量的时候,也需要加上?解包,如果加!就是强制解包,可以理解为让系统认为这个变量一定不是nil。
& & 对于UI的创建等部分函数和OC一样,只是调用的方式略有不同,后面会附上源码。
&&&&在控制小鸟下落的部分代码如下,其中有一点需要注意,在swift中没有隐士转换这个概念,比如你要使用int a + float b 你必须手动将int转为float:(Float)(a)+b
func&birdMove(){
&&&&&&&&if&!isDowm{
&&&&&&&&&&&&if&bird?.frame.origin.y&&&SCREEN_SIZE.height-100{
&&&&&&&&&&&&&&&&var&rant:CGRect=bird!.frame
&&&&&&&&&&&&&&&&rant.origin.y&+=&(CGFloat)(G*(t*t/2))
&&&&&&&&&&&&&&&&bird?.frame=rant
&&&&&&&&&&&&&&&&t+=0.025
&&&&&&&&&&&&}
&&&&&&&&}else{
&&&&&&&&&&&&if&t&0.24{
&&&&&&&&&&&&&&&&var&rant&=&bird?.frame
&&&&&&&&&&&&&&&&rant?.origin.y&-=&4.9-(CGFloat)(G*t*t/2)
&&&&&&&&&&&&&&&&bird?.frame=rant!
&&&&&&&&&&&&&&&&t+=0.025
&&&&&&&&&&&&}else{
&&&&&&&&&&&&&&&&isDowm=false
&&&&&&&&&&&&}
& 游戏效果图如下:
我相信,实践是学习的必经途径,希望与志同道合的朋友,一起进步。
项目github地址:
发布于 6天前,
阅读(1478) | 评论(3) |
投票(1) | 收藏(46)
iOS中UIPickerView使用总结UIPickerView是iOS中的原生选择器控件,使用方便,用法简单,效果漂亮。@property(nonatomic,assign) id&UIPickerViewDataSource& dataS& & & & & & & &&@property(nonatomic,assign) id&UIPickerViewDelegate& &&设置数据源和代理@property(nonatomic)&BOOL&showsSelectionI是否显示选择框,在iOS7之后这个属性没有任何效果@property(nonatomic,readonly) NSInteger numberOfC获取分区数- (NSInteger)numberOfRowsInComponent:(NSInteger)获取某一分区的行数- (CGSize)rowSizeForComponent:(NSInteger)获取某一分区行的尺寸- (UIView *)viewForRow:(NSInteger)row forComponent:(NSInteger)获取某一分区某一行的视图- (void)reloadAllC重载所有分区- (void)reloadComponent:(NSInteger)重载某一分区- (void)selectRow:(NSInteger)row inComponent:(NSInteger)component animated:(BOOL)&设置选中某一分区某一行- (NSInteger)selectedRowInComponent:(NSInteger) &返回某一分区选中的行数据源代理中的方法:- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerV设置分区数- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)根据分区设置行数代理中的方法:- (CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent:(NSInteger)设置分区宽度- (CGFloat)pickerView:(UIPickerView *)pickerView rowHeightForComponent:(NSInteger)设置分区行高- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)设置某一行显示的标题- (NSAttributedString *)pickerView:(UIPickerView *)pickerView attributedTitleForRow:(NSInteger)row forComponent:(NSInteger)通过属性字符串设置某一行显示的标题- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)设置某一行显示的view视图- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)选中某一行时执行的回调
发布于 7天前,
阅读(20) | 评论(0) |
投票(0) | 收藏(0)
iOS日期控件UIDatePicker用法总结
@property (nonatomic) UIDatePickerMode datePickerM&
设置控件模式,枚举如下:
typedef&NS_ENUM(NSInteger,&UIDatePickerMode)&{
&&&&UIDatePickerModeTime,&&&&&&&&&&&//时间模式,显示时分和上下午
&&&&UIDatePickerModeDate,&&&&&&&&&&&//日期模式显示年月日
&&&&UIDatePickerModeDateAndTime,&&&&//时间和日期模式,显示月日星期,时分上下午
&&&&UIDatePickerModeCountDownTimer,&//计时模式,显示时和分
@property (nonatomic, retain) NSLocale&& *
设置本地化环境
@property (nonatomic, copy)&& NSCalendar *
@property (nonatomic, retain) NSTimeZone *timeZ
@property (nonatomic, retain) NSDate *&
设置当前时间
@property (nonatomic, retain) NSDate *minimumD
设置最小时间点
@property (nonatomic, retain) NSDate *maximumD
设置最大时间点
@property (nonatomic) NSTimeInterval countDownD
只适用于计时模式,设置时间
@property (nonatomic) NSInteger&&&&& minuteI 设置每一格的时间差
- (void)setDate:(NSDate *)date animated:(BOOL)
设置到一个时间,有动画效果
发布于 1周前,
阅读(4) | 评论(0) |
投票(0) | 收藏(0)
iOS开发UIScrollView使用详解一、ScrollView常用方法和属性@property(nonatomic)CGPoint&contentO设置滚动的偏移量@property(nonatomic)CGSize&contentS设置滑动区域@property(nonatomic,assign) id&UIScrollViewDelegate&& & &设置UIScrollView的代理@property(nonatomic,getter=isDirectionalLockEnabled) BOOL directionalLockE设置是否锁定,这个属性很有意思,默认为NO,当设置为YES时,你的滚动视图只能同一时间在一个方向上滚动,但是当你从对角线拖动时,是时刻在水平和竖直方向同时滚动的。@property(nonatomic)&BOOL&&设置是否开启回弹效果@property(nonatomic)&BOOL&alwaysBounceV是否开启垂直方向的回弹效果@property(nonatomic) BOOL&alwaysBounceH是否开启水平方向的回弹效果@property(nonatomic,getter=isPagingEnabled) BOOL&pagingE是否开启翻页效果@property(nonatomic,getter=isScrollEnabled) BOOL&scrollE &设置是否可以滑动@property(nonatomic)&BOOL&showsHorizontalScrollI设置是否显示水平滑动条@property(nonatomic) BOOL&showsVerticalScrollI设置是否显示竖直滑动条@property(nonatomic) UIEdgeInsets&scrollIndicatorI设置滑动条的位置@property(nonatomic) UIScrollViewIndicatorStyle&indicatorS设置滑动条风格,枚举如下:typedef&NS_ENUM(NSInteger,&UIScrollViewIndicatorStyle)&{
&&&&UIScrollViewIndicatorStyleDefault,&&&&&//默认
&&&&UIScrollViewIndicatorStyleBlack,&&&&&&&//黑色风格
&&&&UIScrollViewIndicatorStyleWhite&&&&&&&&//白色风格
};@property(nonatomic)&CGFloat&decelerationR设置滑动速度- (void)setContentOffset:(CGPoint)contentOffset animated:(BOOL)设置滚动视图内容的偏移量,可以带动画效果- (void)scrollRectToVisible:(CGRect)rect animated:(BOOL)设置滚动视图滚动到某个可见区域,可以带动画效果- (void)flashScrollI显示一个短暂的滚动指示器@property(nonatomic,readonly,getter=isTracking) & & BOOL获取用户是否触及视图内容@property(nonatomic,readonly,getter=isDragging) & & BOOL获取用户是否开始拖动视图@property(nonatomic,readonly,getter=isDecelerating) BOOL获取视图是否开始减速(用户停止拖动但视图仍在滚动)@property(nonatomic) BOOL delaysContentT设置视图是否延迟处理触摸事件(会将消息传递给子视图)@property(nonatomic) BOOL canCancelContentT设置是否给子视图传递取消动作的消息(默认设置为YES,当scrollView触发事件的时候,其子视图不能触发,如果设置为NO,则子视图会继续触发事件)- (BOOL)touchesShouldBegin:(NSSet *)touches withEvent:(UIEvent *)event inContentView:(UIView *)- (BOOL)touchesShouldCancelInContentView:(UIView *)重写这两个方法可以控制起子视图的事件响应@property(nonatomic) CGFloat minimumZoomS设置内容最小缩放比例@property(nonatomic) CGFloat maximumZoomS&设置内容最大缩放比例@property(nonatomic) CGFloat zoomS设置缩放比例- (void)setZoomScale:(CGFloat)scale animated:(BOOL)设置缩放比例,可以带动画效果- (void)zoomToRect:(CGRect)rect animated:(BOOL)设置缩放显示到某个区域,可以带动画效果@property(nonatomic) BOOL& bouncesZ设置是否可以缩放回弹@property(nonatomic,readonly,getter=isZooming) & & & BOOL&获取是否正在缩放模式@property(nonatomic,readonly,getter=isZoomBouncing)& BOOL zoomB获取是否当前的缩放比例超出设置的峰值@property(nonatomic) BOOL& scrollsToT设置是否点击状态栏滚动到scrollView的最上端@property(nonatomic) UIScrollViewKeyboardDismissMode keyboardDismissM设置键盘消失的模式,枚举如下:typedef&NS_ENUM(NSInteger,&UIScrollViewKeyboardDismissMode)&{
&&&&UIScrollViewKeyboardDismissModeNone,
&&&&UIScrollViewKeyboardDismissModeOnDrag,&&&&&&//手指滑动视图键盘就会消失
&&&&UIScrollViewKeyboardDismissModeInteractive,&//手指滑动视图后可以与键盘交互,上下滑动键盘会跟随手指上下移动
};二、ScrollViewDelegata中常用方法- (void)scrollViewDidScroll:(UIScrollView *)scrollV&视图已经开始滑动时触发的方法- (void)scrollViewDidZoom:(UIScrollView *)scrollV视图已经开始缩放时触发的方法- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollV视图开始拖动时触发的方法- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentO- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)视图拖动结束时触发的方法- (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollV&视图开始减速时触发的方法- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollV&视图减速结束时触发的方法- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollV视图动画结束时触发的方法,使用set方法设置偏移量后回触发- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollV返回进行缩放的视图- (void)scrollViewWillBeginZooming:(UIScrollView *)scrollView withView:(UIView *)视图内容将要开始缩放时触发的方法- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(CGFloat)视图内容结束缩放时触发的方法- (BOOL)scrollViewShouldScrollToTop:(UIScrollView *)scrollV&返回yes,开启快捷滚动回顶端,将要滚动时调用- (void)scrollViewDidScrollToTop:(UIScrollView *)scrollV视图快捷滚动回顶端开始动作时调用疏漏之处 欢迎指正
发布于 2周前,
阅读(568) | 评论(1) |
投票(1) | 收藏(23)
iOS中UITextView方法解读
常用属性解读:
@property(nonatomic,assign) id&UITextViewDelegate&
设置代理属性
@property(nonatomic,copy) NSString *
textView上的文本
@property(nonatomic,retain) UIFont *
设置文本字体
@property(nonatomic,retain) UIColor *textC
设置文本颜色
@property(nonatomic) NSTextAlignment textA&
设置文本对齐模式
@property(nonatomic) NSRange selectedR
设置选中的文本范围(只有当textView是第一响应时才有效)
@property(nonatomic,getter=isEditable) BOOL
设置是否可以编辑
@property(nonatomic,getter=isSelectable) BOOL
设置是否可以选中
@property(nonatomic) UIDataDetectorTypes dataDetectorT
这个属性可以将本文中的电话,邮件等变为链接,长按会调用响应响应的程序(textView必须为不可编辑状态),属性的枚举如下:
typedef&NS_OPTIONS(NSUInteger,&UIDataDetectorTypes)&{
&&&&UIDataDetectorTypePhoneNumber&&&=&1&&&&0,&&&&&&&&&&//&电话变为链接
&&&&UIDataDetectorTypeLink&&&&&&&&&&=&1&&&&1,&&&&&&&&&&//&网址变为链接&&&
&&&&UIDataDetectorTypeAddress&&&&&&&=&1&&&&2,&&&&&&&&&&//&地址变为链接
&&&&UIDataDetectorTypeCalendarEvent&=&1&&&&3,&&&&&&&&&&//&日历变为链接
&&&&UIDataDetectorTypeNone&&&&&&&&&&=&0,&&&&&&&&&&&&&&&//&无连接
&&&&UIDataDetectorTypeAll&&&&&&&&&&&=&NSUIntegerMax&&&&//&所有类型链接
@property(nonatomic) BOOL allowsEditingTextA
设置是否允许编辑属性字符串文本
@property(nonatomic,copy) NSAttributedString *attributedT
设置属性字符串文本
@property(nonatomic,copy) NSDictionary *typingA
设置属性字符串文本属性字典
- (void)scrollRangeToVisible:(NSRange)
滚动textView使其显示在本一段文本
@property (readwrite, retain) UIView *inputV &
设置成为第一响应时弹出的视图,键盘视图
@property (readwrite, retain) UIView *inputAccessoryV
设置成为第一响应时弹出的副视图,副键盘视图
@property(nonatomic) BOOL clearsOnI
设置是否显示删除按钮
UITextViewDelegate中的方法
- (BOOL)textViewShouldBeginEditing:(UITextView *)textV
是否开始编辑
- (BOOL)textViewShouldEndEditing:(UITextView *)textV
是否结束编辑
- (void)textViewDidBeginEditing:(UITextView *)textV
开始编辑时触发的方法
- (void)textViewDidEndEditing:(UITextView *)textV
结束编辑时触发的方法
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)
是否允许字符改变
- (void)textViewDidChange:(UITextView *)textV
字符内容改变触发的方法
- (void)textViewDidChangeSelection:(UITextView *)textV
选中内容改变触发的方法
- (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterR
当文本中的URL进行链接时触发的方法
发布于 2周前,
阅读(312) | 评论(0) |
投票(0) | 收藏(17)
iOS中UIImageView用法总结- (instancetype)initWithImage:(UIImage *)通过一个图片UIImage对象进行初始化- (instancetype)initWithImage:(UIImage *)image highlightedImage:(UIImage *)highlightedI通过一个正常状态下的图片和高亮状态下的图片初始化对象@property(nonatomic,retain) UIImage *&设置正常状态下的图片@property(nonatomic,retain) UIImage *highlightedI设置高亮状态下的图片@property(nonatomic,getter=isUserInteractionEnabled) BOOL userInteractionE&设置是否开启用户交互@property(nonatomic,getter=isHighlighted) BOOL设置是否为高亮状态@property(nonatomic,copy) NSArray *animationI设置正常状态下的动画图片数组@property(nonatomic,copy) NSArray *highlightedAnimationI设置高亮状态下的动画图片数组@property(nonatomic) NSTimeInterval animationD设置动画播放时长 默认频率为30帧每秒@property(nonatomic) NSInteger& & & animationRepeatC&设置动画循环播放次数 默认为无限循环- (void)startA开始播放帧动画- (void)stopA停止播放帧动画- (BOOL)isA是否正在播放动画&
发布于 2周前,
阅读(9) | 评论(0) |
投票(0) | 收藏(1)
获取任意App的系统配置文件这是一个小技巧,无需设备越狱,可以获取到任意App系统配置文件。1、在mac上的AppStore商店搜索相应App。2、下载获取此App。3、打开iTunes,查看应用程序,选中相应的应用程序点击右键,选择在Finder中显示,然后解压ipa文件,得到一个文件夹。4、进入文件夹,找到扩展名为app的文件,右键选择显示包内容。info.plist文件就在里面。
发布于 2周前,
阅读(6) | 评论(0) |
投票(0) | 收藏(0)
iOS系统关于URL Schemes的漏洞探究一、何为URL Schemes&&& 我想这个东西的设计的目的是为了方便App之间的相互调用与通讯,你可以在自己的App中使用OpenURL方法来唤起其他的App。比如微信的URL Schemes是wiexin,我们新建一个工程,实现如下代码后运行程序:[[UIApplication&sharedApplication]openURL:[NSURL&URLWithString:@"weixin://]];这时你会发现,你的应用启动后很快就调起了微信的客户端。二、由URL Schemes引发的漏洞的根源1、一个小问题引起的漏洞根源&&& 如上所说,通过URL Schemes可以在应用间相互唤起,而产生漏洞的根源在于这个URL并非是应用唯一的。apple并没有任何限制或者审核这个URL的任何措施,也就是说,如果两个App有着相同的URL Schemes,那么系统唤起的App可能并不是你想唤起的。2、URL Schemes的优先级如何确定&&& 由于相同的URL Scheme可能同时被多个App使用,再如果这些App都安装在了同一个设备上,那么系统究竟会唤起哪一个呢?这个我也不能十分的确定,只有一点可以肯定:如果有和系统应用的URL Scheme相同,那么系统一定会唤起系统自己的应用,在这里系统的应用有着最高的优先级(苹果这里做的好像很不厚道,将自己的应用保护了起来,而把广大其他开发者的应用放在漏洞前置之不理)。如果没有和系统耦合的,那么系统会唤起哪一个App就看运气了。不过,这也不是无章可循,经过测试,优先级和App的Bundle identifier有关,更准确说和Bundle identifier的字母排序有关,如果精心设计这个id,我们就可以做到截获其他应用的URL。3、这个漏洞会引发什么问题么?&&& 仅仅通过上面的叙述,你可能还看不出这个漏洞会引发什么样的后果。可是如果你仔细观察,你会发现,各种iPhone上的第三方调用,例如QQ音乐快捷登录,腾讯的各种游戏,甚至包括调用支付宝钱包的支付功能,都是通过这样的原理实现的。如果这些回调的数据被截获,那么就等于说登录信息,用户信息甚至支付订单信息都会暴漏在他人眼下,对于截获者来说,他可以用你的信息进行登录,可以替你完成支付,也可以盗取你登陆后的用户信息。三、利用URL Scheme漏洞进行远程登录&&& 下面,就用一个实例来演示一下我如何通过一个伪装App登录天天炫斗账号。&&&&天天炫斗是腾讯的一款十分火爆的格斗游戏,像其他腾讯游戏一样,支持QQ和微信登录,这里我拿微信登录为例。&&&&首先,我们需要做一个伪装的App来截取用户的登录信息,新建一个项目,在plist文件中添加一个和天天炫斗微信登录相同的URL Scheme:这里的wxe266就是微信登录天天炫斗的URL Scheme,这里将Bundle id设置为A,使它有比天天炫斗更高的优先级。在AppDelegate中添加如下代码:-(BOOL)application:(UIApplication&*)application&openURL:(NSURL&*)url&sourceApplication:(NSString&*)sourceApplication&annotation:(id)annotation{
&&&&NSLog(@"%@",url);
&&&&return&YES;
}这个函数是在App被通过URL唤起时首先调用的函数,这里传入的URL就是用户的登录验证信息,我们可以在这里将这个信息发送回来。将伪装好的程序跑一遍后,运行天天炫斗,然后使用微信登录,会发现在微信验证成功后跳转后并没有跳转回天天炫斗应用,而是跳转到了我们伪装的这个Demo。这时xcode调试区会打印出如下的信息:之后,来开始做我们的侵入程序,这个其实更加简单,新建一个工程,只需要添加一行代码:[[UIApplication&sharedApplication]openURL:[NSURL&URLWithString:@"wxe266://oauth?code=b99d8a9e0e76aE&state=weixin"]];这里的URL就是我们截获的带参的URL,在另一个装有天天炫斗的手机上跑这个程序(在同一个手机上测试的话要将刚才的伪装App删去,不然它也会将我们的侵入程序一起骗了)。会发现登录天天炫斗成功,角色信息完全一致。&&& 同样的做法,还可以远程登录QQ音乐,天天飞车等等各种通过微信,QQ,微博快捷登录的应用。四、要战胜你的敌人,必须要了解你的敌人&&& 不了解apple为什么一直不对URL Scheme做限制,或许需要或许不需要。但是这一点建议总是好的:在你的App使用快捷登录的时候,最好同时将设备号或者某个本地保存的标志绑定,防止恶意的第三方借此获取用户的信息。
发布于 2周前,
阅读(17) | 评论(0) |
投票(0) | 收藏(1)
iOS界面布局之二——初识autolayout布局模型一、引言&&&& 在上一篇博客中介绍了传统的布局方式:autoresizing。随着iphone型号的越来越多,屏幕的标准也更加多样化,通过autoresizing已经不能满足开发的需求,而进行两套布局或者动态代码控制又大大增加了开发者的工作量,autolayout的出现拯救个这一切,它让动态布局变的十分简单便捷。&&& autoresizing介绍:。二、autolayout的设计思想&&& 正如storyboard的设计目的是为了让开发者将更多的精力投入到逻辑实现而不是界面布局一样。autolayout的设计思想是让开发者将布局上更多的精力放在控件关系上而不是坐标。我们只需要关心控件之间的摆放关系,而并不需要关心这是如何实现的。因此你使用autolayout进行布局时,就是在添加一个一个的约束。控件与控件之间的约束,控件与父视图之间的约束。1、了解几种约束&&& 点击xcode的storyboard文件,在xcode的导航栏上点击Edito,然后选择Pin,可以看到如图,其中是可以添加的约束类型。Width:对视图宽度的约束Height:对视图高度的约束Horizontal Spacing:对视图间水平距离的约束Vertical Spacing:对视图间垂直距离的约束Leading Space to Superview:与父视图左边界的约束Trailing Space to Superview:与父视图右边界的约束Top Space to Superview:与父视图上边界的约束Bottom Space to Superview:与父视图下边界的约束Widehs Equally:视图等宽约束Heights Equally:视图等高约束2、网上的一个很简单的约束例子&&& 了解了上面的几种约束,现在我们来实现一个效果,借用网上关于autolayout自动布局的一个小例子。我们在storyboard中拖入三个label,使它们如下效果:然后我们将屏幕横过来,会发现这时的效果并不是我们想得到的结果:在进行添加约束之前,我们先来理清这三个视图之间的关系,将上面两个视图编号为1.2,下面那个视图编号为3.(1)1和2的宽和高相等(2)1距离父视图左边20px(3)2距离父视图右边20px(4)3距离父视图左边20px,右边20px(5)1和2水平间距20px(6)1与3垂直间距20px(7)1和2距离父视图上边距50px(8)3距离父视图下边距20px(9)3与1和2的高度一样通过上面的约束,所有视图的位置都将被相对的固定,下面我们只需要按照顺序一一添加即可。(1)选中1和2视图(按住cmd键可以多选),然后点击Editor-&Pin之后选择Widehs Equally,重复上面的过程,选择Heights Equally。我们会看到如下的效果:几点注意:*线是橙色代表警告,我们没有添加足够的约束来确定位置或者约束有矛盾。*如果线的中间显示的不是等号,而是数字,则是因为视图1和2的尺寸设置的不等,约束有矛盾。(2)选中1.重复上面步骤,选择Leading Space to Superview。这时1的左边又会增加一条线:点击这条线,在右边的设置去将约束值设置为20:(3)重复上面步骤,选中视图2,添加Trailing Space to Superview约束。(4)选中视图3,重复上面步骤。(5)选中1和2,添加Horizontal Spacing,设置为20.(6)选中1和3,添加Vertical Spacing,设置为20.(7)为1和2分别添加Top Space to Superview约束。(8)为3添加Bottom Space to Superview约束。(9)选中1和3,添加Heights Equally约束。上面的过程虽然繁琐,但是逻辑性十分清晰,这时你会发现所有的线都变成了蓝色,约束已经添加完整,我们再次运行后横屏,效果如下:这就是我们想要的结果了。3、自动布局的几种对其方式&&& 在xcode导航的Editor菜单中,还有一个子菜单,Align,这里面的选项可以为控件添加对其约束:Left Edges:控件左对齐Right Edges:控件右对齐Top Edges:控件上对齐Bottom Edges:控件下对齐Horizontal Centers:控件水平中心对齐Vertical Centers:控件垂直水平对齐Horizontal Center in Container:控件与其父视图水平中心对齐Vertical Center in Container:控件与其父视图垂直中心对齐三、几点小感悟&&&& 到此为止,基本上已经可以使用autolayout自动布局解决复杂的布局需求了,但是切记,正式因为aotulayout的强大使它会隐藏更多的坑,下面是我的几点感悟,再次分享:1、autolayout的精髓在于足够多的约束,autolayout之所以比autoresizing强大,就在于其布局的精确性,而精确性正是由约束来提供的。2、切莫画蛇添足,矛盾的约束会使xcode晕掉,所以在添加约束前,我建议将试图间的布局关系先整理出来。3、应该转变你的思路,如果你已经习惯了使用CGRect、Point等传统的坐标布局模式,那么你应该稍微转变一下,autolayout倡导的是一个相对的概念,你需要将更多的关注放在视图间的关系,比如A和B距离10,A和C右对齐等。具体的坐标会有autolayout帮你算。
发布于 2周前,
阅读(30) | 评论(0) |
投票(0) | 收藏(0)
iOS界面布局之一——使用autoresizing进行动态布局
autoresizing是iOS中传统的界面自动布局方式,通过它,当父视图frame变换时,子视图会自动的做出相应的调整。
一、通过代码进行布局
任何一个view都有autoresizingMask这个属性,通过这个属性可以设置当前view与其父视图的相对关系。我们先来看UIViewAutoresizing这个枚举:
typedef&NS_OPTIONS(NSUInteger,&UIViewAutoresizing)&{
&&&&UIViewAutoresizingNone&&&&&&&&&&&&&&&&&=&0,//默认
&&&&UIViewAutoresizingFlexibleLeftMargin&&&=&1&&&&0,//与父视图右边间距固定,左边可变
&&&&UIViewAutoresizingFlexibleWidth&&&&&&&&=&1&&&&1,//视图宽度可变
&&&&UIViewAutoresizingFlexibleRightMargin&&=&1&&&&2,//与父视图左边间距固定,右边可变
&&&&UIViewAutoresizingFlexibleTopMargin&&&&=&1&&&&3,//与父视图下边间距固定,上边可变
&&&&UIViewAutoresizingFlexibleHeight&&&&&&&=&1&&&&4,//视图高度可变
&&&&UIViewAutoresizingFlexibleBottomMargin&=&1&&&&5//与父视图上边间距固定,下边可变
下面我们通过效果来看这些属性的作用:
先创建两个view,为了区分,设置不同的背景色:
-&(void)viewDidLoad&{
&&&&[super&viewDidLoad];
&&&&//&Do&any&additional&setup&after&loading&the&view,&typically&from&a&nib.
&&&&UIView&*&view1&=&[[UIView&alloc]initWithFrame:CGRectMake(20,&40,&200,&200)];
&&&&view1.backgroundColor=[UIColor&redColor];
&&&&UIView&*&view2&=&[[UIView&alloc]initWithFrame:CGRectMake(10,&10,&100,&100)];
&&&&view2.backgroundColor=[UIColor&greenColor];
&&&&[view1&addSubview:view2];
&&&&[self.view&addSubview:view1];
设置view2的自动布局属性如下:
&view2.autoresizingMask=UIViewAutoresizingFlexibleBottomM
这时的效果如下:
改变view1的frame如下:
UIView&*&view1&=&[[UIView&alloc]initWithFrame:CGRectMake(20,&40,&300,&300)];
效果如下:
这时view2的下边距离相对父视图是可变的。
设置如下:
&&&view2.autoresizingMask=UIViewAutoresizingFlexibleH
效果如下:
可以看出,这时子视图的高度是随父视图变化而自动改变的。
如下设置:
view2.autoresizingMask=UIViewAutoresizingFlexibleLeftM
效果如下:
这时子视图的左边是随父视图变化而可变的。
同理,UIViewAutoresizingFlexibleRightMargin将使子视图右边与父视图的距离可变。
UIViewAutoresizingFlexibleTopMargin将使子视图上边与父视图距离可变。UIViewAutoresizingFlexibleWidth将使子视图的宽度可变。
注意:这些自动布局的属性是可以叠加的,比如保持视图与父视图边距不变,如下设置:
view2.autoresizingMask=UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleH
效果如下:
二、nib文件中可视化设置自动布局
在storyboard中我们可以更加轻松的进行autoresizing自动布局。在view设置栏中有autoresizing这个设置,点中相应的箭头,就是刚才我们探讨的设置选项。并且我们把鼠标放在这个上面的时候,右侧会自动为我们预览效果。
如果你觉得autoresizing很强大,那么你就太容易满足了,autoresizing可以满足大部分简单的自动布局需求,可是它有一个致命的缺陷,它只能设置子视图相对于父视图的变化,却不能精确这个变化的度是多少,因此对于复杂的精准的布局需求,它就力不从心了。但是有一个好消息告诉你,iOS6之后的autolayout自动布局方案,正是解决复杂布局的好帮手,我们在下一遍博客中再进行详细讨论。
发布于 2周前,
阅读(23) | 评论(0) |
投票(0) | 收藏(0)

我要回帖

更多关于 和 哪个优先级高 的文章

 

随机推荐