xcode ui自动化测试7.3 怎么创建ui

【Xcode 7.3】UIWindow.h - UIKit - 简书
【Xcode 7.3】UIWindow.h - UIKit
本文并非最终版本,如果想要关注更新或更正的内容请关注文集,联系方式详见文末,如有疏忽和遗漏,欢迎指正。
本文相关目录:
声明:本文在官方原版头文件的基础上加上了中文注释,个别地方还没有标注
Copyright (c)
Apple Inc. All rights reserved.
#import &Foundation/Foundation.h&
#import &CoreGraphics/CoreGraphics.h&
#import &UIKit/UIView.h&
#import &UIKit/UIApplication.h&
#import &UIKit/UIKitDefines.h&
NS_ASSUME_NONNULL_BEGINtypedef CGFloat UIWindowL
@class UIEvent, UIScreen, NSUndoManager, UIViewC
NS_CLASS_AVAILABLE_IOS(2_0)
@interface UIWindow : UIView
// 默认是[UIScreen mainScreen]。修改屏幕的操作代价非常大
// default is [UIScreen mainScreen]. changing the screen may be an expensive operation and should not be done in performance-sensitive code
@property(nonatomic,strong) UIScreen *screen
NS_AVAILABLE_IOS(3_2);
// default = 0.0,窗口级别越高,显示越靠前
@property(nonatomic) UIWindowLevel windowL
// 是否是主窗口
@property(nonatomic,readonly,getter=isKeyWindow) BOOL keyW
- (void)becomeKeyW
//为子类提供。不要直接调用 override point for subclass. Do not call directly
- (void)resignKeyW
// 为子类提供。不要直接调用 override point for subclass. Do not call directly
- (void)makeKeyW
// 成为主窗口
- (void)makeKeyAndV// 简化方法,让窗口成为主窗口并且可见,如果要不可见,可以使用view的hidden属性 convenience. most apps call this to show the main window and also make it key. otherwise use view hidden property
// 根视图控制器,默认为nil
@property(nullable, nonatomic,strong) UIViewController *rootViewController
NS_AVAILABLE_IOS(4_0);
// 由UIApplication调用向窗口中的子视图派发事件 called by UIApplication to dispatch events to views inside the window
- (void)sendEvent:(UIEvent *)
// 转换坐标系 can be used to convert to another window
- (CGPoint)convertPoint:(CGPoint)point toWindow:(nullable UIWindow *)
// 传入nil,表示主屏幕 pass in nil to mean screen
- (CGPoint)convertPoint:(CGPoint)point fromWindow:(nullable UIWindow *)
- (CGRect)convertRect:(CGRect)rect toWindow:(nullable UIWindow *)
- (CGRect)convertRect:(CGRect)rect fromWindow:(nullable UIWindow *)
UIKIT_EXTERN const UIWindowLevel UIWindowLevelN
UIKIT_EXTERN const UIWindowLevel UIWindowLevelA
UIKIT_EXTERN const UIWindowLevel UIWindowLevelStatusBar __TVOS_PROHIBITED;
UIKIT_EXTERN NSString *const UIWindowDidBecomeVisibleN // nilUIKIT_EXTERN NSString *const UIWindowDidBecomeHiddenN
// nilUIKIT_EXTERN NSString *const UIWindowDidBecomeKeyN
UIKIT_EXTERN NSString *const UIWindowDidResignKeyN
// Each notification includes a nil object and a userInfo dictionary containing the
// begining and ending keyboard frame in screen coordinates. Use the various UIView and
// UIWindow convertRect facilities to get the frame in the desired coordinate system.
// Animation key/value pairs are only available for the "will" family of notification.
UIKIT_EXTERN NSString *const UIKeyboardWillShowN
UIKIT_EXTERN NSString *const UIKeyboardDidShowN
UIKIT_EXTERN NSString *const UIKeyboardWillHideN
UIKIT_EXTERN NSString *const UIKeyboardDidHideN
UIKIT_EXTERN NSString *const UIKeyboardFrameBeginUserInfoKey
NS_AVAILABLE_IOS(3_2); // NSValue of CGRect
UIKIT_EXTERN NSString *const UIKeyboardFrameEndUserInfoKey
NS_AVAILABLE_IOS(3_2);// NSValue of CGRect
UIKIT_EXTERN NSString *const UIKeyboardAnimationDurationUserInfoKey
NS_AVAILABLE_IOS(3_0); // NSNumber of double
UIKIT_EXTERN NSString *const UIKeyboardAnimationCurveUserInfoKey
NS_AVAILABLE_IOS(3_0);// NSNumber of NSUInteger (UIViewAnimationCurve)
UIKIT_EXTERN NSString *const UIKeyboardIsLocalUserInfoKey
NS_AVAILABLE_IOS(9_0); // NSNumber of BOOL
// Like the standard keyboard notifications above, these additional notifications include
// a nil object and begin/end frames of the keyboard in screen coordinates in the userInfo dictionary.
UIKIT_EXTERN NSString *const UIKeyboardWillChangeFrameNotification
NS_AVAILABLE_IOS(5_0);
UIKIT_EXTERN NSString *const UIKeyboardDidChangeFrameNotification
NS_AVAILABLE_IOS(5_0);
// These keys are superseded by UIKeyboardFrameBeginUserInfoKey and UIKeyboardFrameEndUserInfoKey.
UIKIT_EXTERN NSString *const UIKeyboardCenterBeginUserInfoKey
NS_DEPRECATED_IOS(2_0, 3_2) __TVOS_PROHIBITED;
UIKIT_EXTERN NSString *const UIKeyboardCenterEndUserInfoKey
NS_DEPRECATED_IOS(2_0, 3_2) __TVOS_PROHIBITED;
UIKIT_EXTERN NSString *const UIKeyboardBoundsUserInfoKey
NS_DEPRECATED_IOS(2_0, 3_2) __TVOS_PROHIBITED;
NS_ASSUME_NONNULL_END
作者:蓝田(Loto)
如果你觉得本篇文章对你有所帮助,请点击文章末尾下方“喜欢”
如有疑问,请通过以下方式交流:
① 评论区回复
② 微信(加好友请注明“简书+称呼”) ③发送邮件至
本文版权归作者和本网站共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。
知识涵盖:C、OC、Swift、iOS、Java、Linux、Python
用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金Cover 有什么料? 从这篇文章中你能获得这些料: 知道setContentView()之后发生了什么? ... Android 获取 View 宽高的常用正确方式,避免为零 - 掘金相信有很多朋友...
用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金 Cover 有什么料? 从这篇文章中你能获得这些料: 知道setContentView()之后发生了什么? ... Android 获取 View 宽高的常用正确方式,避免为零 - 掘金 相信有很多...
本文并非最终版本,如果想要关注更新或更正的内容请关注文集,联系方式详见文末,如有疏忽和遗漏,欢迎指正。 本文相关目录:【Xcode 7.3】UIWindow.h - UIKit1.0 UIWindow -&1.0 NSWindow - 窗口1.0 UIWindow -&2....
本文并非最终版本,如果想要关注更新或更正的内容请关注文集,联系方式详见文末,如有疏忽和遗漏,欢迎指正。 本文相关目录:【Xcode 7.3】UIWindow.h - UIKit1.0 UIWindow -&1.0 NSWindow - 窗口1.0 UIWindow -&2....
本文并非最终版本,如果想要关注更新或更正的内容请关注文集,联系方式详见文末,如有疏忽和遗漏,欢迎指正。 本文相关目录:==================== 所属文集:4.0 多线程 ====================4.1 多线程基础-&1.0 进程 & 线程 ·...
我和黎渊已经两年没见了,坐在我对面的他还是和我刚认识他的时候一样。 那已经是六年前了。 初中那时候特别流行认哥哥,我在初一的暑假认识了黎渊,聊了一天以后俩人相见恨晚。他那时候个子不高,还是个小圆脸,看着特萌特无辜,我就让他叫姐姐,他不肯,非得让我喊哥哥,我就想行吧,哥哥就哥...
此刻李洛生已经将护卫们都打昏过去了,东都天策府第一猛将,名不虚传啊。 “瑶妹儿,别和他废话了,杀了他,为师父报仇!”艾雅扯开上衣,半裸的上身发出莹莹的绿光。 “千劫万毒手!你们,你们怎么会有秘术的蛊虫!不可能!”乌摩椤开始慌乱了,小看了这两个丫头,带着五毒教的至宝而来,自己...
早晨看到这句诗“寻梦?撑一支竹篙,向青草更青处漫溯!”忽然觉得那么有意境,好美!于是,不自觉地轻吟出声。儿子听了,接着诵完了徐志摩的《再别康桥》:
听儿子吟诵,我瞬间有一种我们还有共同语言的感觉,这不是亲子之间的一种沟通方式吗?往往我们觉得孩子长大了,慢慢和...
这两天写按照剧本写文案,刚开始以为剧本大纲是最难的,剧情直接套上去就好了,等到真正下笔才发现,剧情的处理才是最难的。 对角色职业不了解,所以去查、了解这个职位,每写一个剧情,脑海里出现一个场景走一遍又一遍,想象着这个场景里的主角他是怎样的情绪,会有怎样行为,要如何表达才能达...
亲爱的老公,谢谢你为这个家如此辛苦!每晚1点多睡下,早上依然很主动要送大宝上学!你是一个井井有条的好男人!每天在你安排之下,我也享受你的安排!看到天父为我配的,你的优点补足我生命里的特质!今天晚上当两个宝贝睡下了,我下楼想再去多干点活,你就说:我整理这几双鞋,你就回去睡觉吧...使用xib开发界面
招聘信息:
纯代码写界面有时候会降低开发效率,对于一些通用简单的界面,例如程序设置界面,可以使用xib进行开发。一、关于xib1. xib和nibxib文件可以被Xcode编译成nib文件,xib文件本质上是一个xml文件,而nib文件就是编译后的二进制文件,该文件将视图等控件对象封装了起来,而在程序运行起来后,这些对象会被激活。xib文件本质上是一个xml文件,可以用vim或cat命令查看,例如:$&cat&~/Desktop/JLN-1_xib/JLN-1_xib/GrayViewController.xib
&&&&&&&&&&&&
&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&
&&&&&&&&&&&&
&&&&&&&&&&&&
&&&&&&&&&&&&
&&&&&&&&&&&&
&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&
&&&&&&&&&&&&
&&&&&&&&&&&&
&&&&&&&&&&&&
&&&&&&&&&&&&
&&&&&&&&&&&&
&&&&&&&&&&&&
&&&&&&&&&&&&
nib文件可以在程序的Build目录下找到。2. xib文件的若干属性xib文件有以下几个重要的属性:xib文件名File’s Ownerxib文件中的视图的Classxib文件中的视图的Outlet指向从哪里加载xib,加载xib中的什么视图,都可以根据这几个属性得出。二、Demo实践1. 加载xib中File’s Owner为nil的视图BlueView.xibMainViewController.m...
@property&(strong,&nonatomic)&UIView&*blueV
-&(void)loadBlueViewFromXIB&{
&&&&//&BlueView.xib的File's&Owner为nil
&&&&NSArray&*views&=&[[NSBundle&mainBundle]&loadNibNamed:@"BlueView"&owner:nil&options:nil];
&&&&self.blueView&=&views[0];
&&&&//&从xib加载进来的View大小是确定的,但是该视图在父视图中的位置是不确定的
&&&&//&此外,视图中的子视图也是原封不动地Load进来的
&&&&CGRect&rect&=&_blueView.
&&&&rect.origin.x&+=&37.5f;
&&&&rect.origin.y&+=&80.0f;
&&&&_blueView.frame&=&
&&&&[self.view&addSubview:_blueView];
}运行结果:结论:File’s Owner为nil的xib文件中的视图属于通用视图,在工程中可以复用从xib加载进来的View大小是确定的,但是该视图在父视图中的位置是不确定的,因此需要开发者自行指定视图中的所有子视图会被原封不动地Load进来2. 加载xib中File’s Owner为self的视图MainViewController.m...
@property&(weak,&nonatomic)&IBOutlet&UIView&*greenV
-&(void)loadGreenViewFromXIB&{
&&&&//&GreenView.xib的File's&Owner设为self,并建立了一个从该xib的View到self的IBOutlet&greenView
&&&&[[NSBundle&mainBundle]&loadNibNamed:@"GreenView"&owner:self&options:nil];
&&&&//&只要self主动调用Load&XIB的方法,self持有的IBOutlet指向的视图就会被初始化
&&&&//&这里不需要通过views[0]的方式存取视图
&&&&CGRect&rect&=&_greenView.
&&&&rect.origin.x&=&_blueView.frame.origin.x;
&&&&rect.origin.y&=&_blueView.frame.origin.y&+&80.0f;
&&&&_greenView.frame&=&
&&&&[self.view&addSubview:_greenView];
}运行结果:结论:File’s Owner不为nil的xib文件中的视图属于专用视图,在工程中不应该被复用只要self主动调用loadNibNamed:owner:options:方法,self持有的IBOutlet指向的视图就会被初始化存取xib中的视图不用views[0]的方式,而是通过IBOutlet类型的property进行存取3. 加载xib中File’s Owner为特定类的视图RedView.xibRedViewOwner.h@interface&RedViewOwner&:&NSObject
@property&(strong,&nonatomic)&IBOutlet&UIView&*redV
MainViewController.m
@property&(strong,&nonatomic)&RedViewOwner&*redViewO
-&(void)loadRedViewFromXIB&{
&&&&//&RedView.xib的File's&Owner是RedViewOwner类的实例,并建立了一个从该xib的View到RedViewOwner实例的IBOutlet
&&&&//&只要通过_redViewOwner主动调用Load&XIB的方法,该IBOutlet指向的视图就会被初始化
&&&&self.redViewOwner&=&[RedViewOwner&new];
&&&&[[NSBundle&mainBundle]&loadNibNamed:@"RedView"&owner:_redViewOwner&options:nil];
&&&&UIView&*redView&=&_redViewOwner.redV
&&&&CGRect&rect&=&redView.
&&&&rect.origin.x&=&_greenView.frame.origin.x;
&&&&rect.origin.y&=&_greenView.frame.origin.y&+&80.0f;
&&&&redView.frame&=&
&&&&[self.view&addSubview:redView];
}运行结果:结论:File’s Owner类可以封装视图中的各种逻辑,而不仅仅是提供视图内容只要通过File’s Owner类主动调用loadNibNamed:owner:options:方法,该IBOutlet指向的视图就会被初始化4. 加载xib中文件名和视图类名一致的视图(File’s Owner为nil)YellowView.xibYellowView.h/m@interface&YellowView&:&UIView
+&(instancetype)viewFromNIB;
@property&(weak,&nonatomic)&IBOutlet&UILabel&*titleL
@implementation&YellowView
//&Convenience&Method
+&(instancetype)viewFromNIB&{
&&&&//&加载xib中的视图,其中xib文件名和本类类名必须一致
&&&&//&这个xib文件的File's&Owner必须为空
&&&&//&这个xib文件必须只拥有一个视图,并且该视图的class为本类
&&&&NSArray&*views&=&[[NSBundle&mainBundle]&loadNibNamed:NSStringFromClass([self&class])&owner:nil&options:nil];
&&&&return&views[0];
-&(void)awakeFromNib&{
&&&&//&视图内容布局
&&&&self.backgroundColor&=&[UIColor&yellowColor];
&&&&self.titleLabel.textColor&=&[UIColor&whiteColor];
MainViewController.m
@property&(strong,&nonatomic)&YellowView&*yellowV
-&(void)loadYellowViewFromXIB&{
&&&&//&说明见YellowView.m的viewFromNIB方法
&&&&self.yellowView&=&[YellowView&viewFromNIB];
&&&&CGRect&rect&=&_yellowView.
&&&&UIView&*redView&=&_redViewOwner.redV
&&&&rect.origin.x&=&redView.frame.origin.x;
&&&&rect.origin.y&=&redView.frame.origin.y&+&80.0f;
&&&&_yellowView.frame&=&
&&&&[self.view&addSubview:_yellowView];
}运行结果:结论:这里的viewFromNib方法只是对loadNibNamed:owner:options:方法的一个简单封装,要求的条件包括: - xib文件名和本类类名必须一致 - 这个xib文件的File’s Owner必须为空 - 这个xib文件必须只拥有一个视图,并且该视图的class为本类5. 通过UIViewController的initWithNibName:bundle:方法加载xib文件中的视图BlackView.xib如果BlackViewController类希望self.view就是xib文件中的View,可以在Connections页中建立view -> File’s Owner的Outlet,如下:BlackViewController.h/m@interface&BlackViewController&:&UIViewController
@property&(weak,&nonatomic)&IBOutlet&UILabel&*titleL
//&Convenience&Method
+&(instancetype)viewControllerFromNIB;
@implementation&BlackViewController
-&(void)viewDidLoad&{
&&&&[super&viewDidLoad];
&&&&self.view.backgroundColor&=&[UIColor&blackColor];
&&&&self.titleLabel.textColor&=&[UIColor&whiteColor];
+&(instancetype)viewControllerFromNIB&{
&&&&return&[[BlackViewController&alloc]&initWithNibName:NSStringFromClass([self&class])&bundle:[NSBundle&mainBundle]];
-&(void)didReceiveMemoryWarning&{
&&&&[super&didReceiveMemoryWarning];
&&&&//&Dispose&of&any&resources&that&can&be&recreated.
@endMainViewController.m...
@property&(strong,&nonatomic)&BlackViewController&*blackViewC
-&(void)loadBlackViewFromXIB&{
&&&&self.blackViewController&=&[[BlackViewController&alloc]&initWithNibName:@"BlackViewController"&bundle:[NSBundle&mainBundle]];
&&&&//&或使用Conveniece&Method,但要求xib文件名和View&Controller类名一致
&&&&//&self.blackViewController&=&[BlackViewController&viewControllerFromNIB];
&&&&UIView&*blackView&=&_blackViewController.
&&&&CGRect&rect&=&blackView.
&&&&rect.origin.x&=&_yellowView.frame.origin.x;
&&&&rect.origin.y&=&_yellowView.frame.origin.y&+&80.0f;
&&&&blackView.frame&=&
&&&&[self.view&addSubview:blackView];
}运行结果:结论:将xib的File’s Owner设成一个UIViewController子类,可以将这个xib文件的视图展示和外部响应事件(例如点击一个按钮触发的点击事件,该视图的手势事件等)全部封装在一个View Controller中,如果把按钮的点击事件封装在一个UIView类中,貌似破坏了MVC模式,因此最好将xib的File’s Owner设成一个UIViewController子类,该类可以通过addChildViewController方法将其添加到现有的View Controller上。如果只是希望加载视图,可以通过viewcontroller.view存取。如果希望ViewControllerA加载并响应aXIBView中的按钮点击事件,这时必须建立一个aXIBView到ViewControllerA的IBAction,如果ViewControllerA需要拥有多个这样的XIB,那么ViewControllerA会变得非常的庞大,此时可以通过为每一个XIB设置一个ViewController,再让ViewControllerA加载这些Child View Controllers,这样可以将这些事件的响应职责和视图的描绘工作分派给专门的Child View Controller,在减小ViewControllerA体积的同时,也可以提高各个xib的可复用性。这里的viewControllerFromNIB方法其实就是initWithNibName:bundle:方法的一个简单封装,要求:xib的File’s Owner设为本类。6. 通过UIViewController+NIB加载xib文件中的View Controller类和其视图GrayView.xibUIViewController+NIB.h/m@interface&UIViewController&(NIB)
//&要求xib文件名和View&Controller类名一致
+&(instancetype)loadFromN
@implementation&UIViewController&(NIB)
+&(instancetype)loadFromNib&{
&&&&//&[self&class]会由调用的类决定
&&&&Class&controllerClass&=&[self&class];
&&&&NSLog(@"class&=&%@",&controllerClass);
&&&&return&[[controllerClass&alloc]&initWithNibName:NSStringFromClass(controllerClass)&bundle:[NSBundle&mainBundle]];
@endGrayViewController.h/m@interface&GrayViewController&:&UIViewController
@property&(weak,&nonatomic)&IBOutlet&UILabel&*titleL
@property&(weak,&nonatomic)&IBOutlet&UIButton&*actionB
@implementation&GrayViewController
-&(void)viewDidLoad&{
&&&&[super&viewDidLoad];
&&&&self.view.backgroundColor&=&[UIColor&grayColor];
&&&&self.titleLabel.text&=&@"Gray&View";
&&&&self.titleLabel.textColor&=&[UIColor&whiteColor];
&&&&self.titleLabel.textAlignment&=&NSTextAlignmentC
&&&&self.titleLabel.font&=&[UIFont&systemFontOfSize:8.5f];
&&&&[self.actionButton&setTitle:@"action"&forState:UIControlStateNormal];
&&&&[self.actionButton&setTitleColor:[UIColor&whiteColor]&forState:UIControlStateNormal];
-&(void)didReceiveMemoryWarning&{
&&&&[super&didReceiveMemoryWarning];
&&&&//&Dispose&of&any&resources&that&can&be&recreated.
//&推荐从XIB文件中加载View&Controller的方法,这种方法可以将XIB文件中的视图和其按钮响应事件全部封装在GrayViewController
//&如果GrayViewController的按钮响应事件由MainViewController作出响应,那么二者的耦合度就过高
//&单纯的通用View展示,使用从xib文件加载视图的方法,File's&Owner设为nil
//&特定拥有者的View展示,从xib文件加载视图时,File's&Owner设为拥有者
//&如果视图中有按钮响应事件,或其它可以和用户交互的事件,建议采用从XIB文件中加载View&Controller的方法,这样可以封装UI展示和交互事件
-&(IBAction)action:(id)sender&{
&&&&NSLog(@"action");
@endMainViewController.m...
@property&(strong,&nonatomic)&GrayViewController&*grayViewC
-&(void)loadGrayViewFromXIB&{
&&&&self.grayViewController&=&[GrayViewController&loadFromNib];
&&&&UIView&*grayView&=&_grayViewController.
&&&&UIView&*blackView&=&_blackViewController.
&&&&CGRect&rect&=&grayView.
&&&&rect.origin.x&=&blackView.frame.origin.x;
&&&&rect.origin.y&=&blackView.frame.origin.y&+&80.0f;
&&&&grayView.frame&=&
&&&&[self.view&addSubview:grayView];
}运行结果:结论:这里我专门写了一个UIViewController+NIB的category,只需要调用loadFromNib类方法就可以加载xib中的视图。要求: - xib文件的File’s Owner必须设置为对应的View Controller类。三、总结在写界面时同时混用xib和代码可以提高效率,而对xib的使用主要体现在其专用性和通用性上。对于一些专门的界面,例如App中的设置界面,纯代码写难免会浪费时间,此时可以通过xib文件的拖控件方法来定制。这个xib是专用于某一个界面的,目的是提高效率。对于一些通用的控件甚至界面,例如一个很漂亮但实现起来非常复杂的按钮,此时可以通过load xib文件中的视图来快速添加。这个xib对于所有视图是共用的,目的是提高可复用性。对于通用的xib:如果xib只是单纯的界面展示,那么File’s Owner可以随意。如果xib中包含了按钮、手势等用户输入事件,那么File’s Owner最好设置为UIViewController类的子类。四、自问自答以前使用xib时一直都有点疑问,xib中可以有多个视图控件,但是从xib中load出来的是一个数组,那么怎么确定哪个对象对应的是哪个控件呢?可以实践一下:PurpleView.xib随便在xib文件中加了几个视图。接下来将其load出来看看:MainViewController.m-&(void)logViewsFromXIB&{
&&&&NSLog(@"%s&begin",&__func__);
&&&&NSArray&*views&=&[[NSBundle&mainBundle]&loadNibNamed:@"PurpleView"&owner:nil&options:nil];
&&&&for&(int&i&=&0;&i&<&views.&i++)&{
&&&&&&&&id&obj&=&views[i];
&&&&&&&&NSLog(@"%d&:&%@",&i,&[obj&class]);
&&&&NSLog(@"%s&end",&__func__);
}控制台输出如下:&15:03:06.629&JLN-1_xib[]&-[MainViewController&logViewsFromXIB]&begin
&15:03:06.635&JLN-1_xib[]&0&:&UIView
&15:03:06.635&JLN-1_xib[]&1&:&UIButton
&15:03:06.636&JLN-1_xib[]&2&:&UITableView
&15:03:06.636&JLN-1_xib[]&3&:&UILabel
&15:03:06.636&JLN-1_xib[]&-[MainViewController&logViewsFromXIB]&end结论:从xib中load出来的views数组中视图对象的排列顺序和xib scene中的对象排列顺序一致(其实就是xml文件中元素的排序而已)。如下:可以将其打乱并重新运行程序查看结果。参考资料:
微信扫一扫
订阅每日移动开发及APP推广热点资讯公众号:CocoaChina
您还没有登录!请或
点击量6497点击量6193点击量4969点击量4059点击量3487点击量3417点击量3411点击量3194点击量3179
&2016 Chukong Technologies,Inc.
京公网安备89UIStack View如何让你的开发更简单(iOS 9和Xcode 7)
招聘信息:
本文由CocoaChina译者翻译自appcoda.原文:之前我们阐述了。本篇文章的开始我们将涵盖一些iOS9的很酷的新特性。iOS即将到来的新版本会带来很多新的特性。对于开发者来说堆栈视图(UIStackView)的引入值得一提。我知道对于一些开发者来说使用autolayout设计一些复杂的交互界面是比较困难的。UIStackView正好能帮助到并让我们的开发者的工作变得更容易些。UIStackView提供了一个高效的接口用于平铺一行或一列的视图组合。对于嵌入到StackView的视图,你不用再添加自动布局的约束了。Stack View管理这些子视图的布局,并帮你自动布局约束。也就是说,这些子视图能够适应不同的屏幕尺寸。此外,你可以嵌入一个stack View到另一个stack view中来创建更为复杂的用户界面。不要误解我的意思,这并不意味着你就不需要处理自动布局了。你仍旧要定义一些布局约束来约束stack view。它只是帮你节约了为每个UI元素创建约束的时间,同时它更容易的从布局中添加/删除一个视图。Xcode7提供两种方式使用UIStackView。你可以从对象库中拖一个Stack View(水平的/竖直的)放到storyboard的正确位置上。然后你可以拖一些label,button,imageView等视图放到stack view中。另外,你可以在自动布局栏中使用Stack选项。对于这个方式,你可以简单的选择两个或更多的视图,之后点击Stack选项,IB将会把这些视图嵌入到一个stackview中,并自动的调整。如果你仍旧对如何使用stack view没有太多头绪,没关系,接下来我们将在这篇文章中介绍这两种方式。继续往下阅读,你就会很快明白我的意思的。我假设你对auto layout了解。如果不是,请先阅读这片关于autolayout的[]Demo App先瞧一眼我们将要构建的demo app。在这篇文章中我将会给你展示如何使用stackview布局一个类似的用户界面:你可以不使用stack view创建一样的UI,但是,但正如你所看到的,stack view完全改变了布局用户界面的方式。本文并没用coding,我们只是集中在使用IB来布局这个用户界面。开始前,请下载这个[](备用[])。你需要使用Xcode7 beta4(或以上版本)来build这个工程。如果你没有安装,你要下载个。该项目模板非常简单,它仅仅预置了导航控制器和一些示例图片。&&感谢:实例的照片是由[]提供。从对象库中添加Stack Views&现在升级Xcode7并打开Main.storyboard。从对象库中拖出垂直的stack view放到storyboard上的view controller中。Stack View可以在纵向和横向布局安排其子视图(称为安排视图)。因为我们要布局垂直的图像视图,所以我们选择垂直的Stack View。接下来,从对象库中拖出一个图像视图,当你把图像视图放到stack view中,图像视图会自动调整。重复同样的操作,添加更多的image view。这就是它神奇的地方:当您添加另一个图像视图时,stack view会自动布局图像视图,为您设置必要的约束。酷,对吗?为Stack View定义布局约束Stack View节省了开发者为每个UI元素定义约束的时间,所说的,您需要提供Stack View的布局约束。对于我们刚刚添加的,我们需要定义以下布局约束:设置Stack View的距上,距左和居右的间距,使得Stack View在屏幕的顶部。为Stack View设置一个高度约束,使得Stack View视图的高度占父视图高度的70%。现在选择stack view,点击布局栏按钮中的Pin按钮,设置距上,距左,居右值分别为10,0,0。然后点击“Add 3 Constraints”按钮添加这些约束。Stack view的当前位置不符合约束,你可以在Document Outline点击警告指示(即黄色的箭头)纠正位置。要设置高度约束,就要在IB的Document Outline中从堆栈视图到视图中的控件拖动视图,释放按钮后,选择“Equal Heights”。这是设置stack view的高度和这个view的高度相等的。然而,stack view仅仅需要高度的75%。所以,选择“Stack View.height”的约束,选择Attributes inspector,把Multiplier这项的值从1.0改为0.7.设置Stack View的属性这个stack view 看起来并不是我们期望的。一旦你添加了stack view,你可以改变一些stack view的属性来改变它的外观。axis选项决定是否应布置的视图垂直或水平布置。 alignment选项控制这些视图的对齐方式。比如你如果设置成Leading,stack view管理的视图排列按Leading对齐。distribution属性决定了其管理的视图的大小和位置。默认设置为Fill。这是stack view尽量让它的所有子视图在一个合理的距离。现在把它改为Fill Equally。stack view会调整它所有的子视图一样的尺寸。spacing属性让你设置视图之间的间距。把它值改为10来增加图像视图之间的间距。设置图像接下来,我们设置image view的相应的图像。选择第一个image view,选择Attributes inspector,把image设置为“nature-1″,把model设置为“Aspect Fill”,同时勾选上“Clip Subviews”。重复同样的步骤设置余下的image view,但是要把image 设置为“nature-2″ 和 “nature-3″。这样你的布局看起来像这样:现在你可以运行项目,预览下。可以在模拟器上测试app的UI是否正确的适配所有的设备。stack view已经自动的为你添加好了约束。事实上你可以启动view debugging选项(要在运行app的时候)来显示图像视图的布局约束。使用嵌套Stack View布局标签和按钮我们还没有完成。有几个标签和按钮添加到用户界面。现在将标签从对象库中拖到视图,命名“Nature”,并将其定位在stack view下面。把它的字体大小改为30点,使其更大一些。下一步,将另一个标签视图和名称标签”A collection of nature photos from magdeleine.co“。放置在Nature标签之下。再次,您不需要设置这些标签的布局约束。让stack view为你做这个魔术。在本教程的最开始,我提到了使用stack view的方法。之前,是从对象库中添加了堆栈视图。现在我会告诉你另一个办法。按住命令键来选择标签,然后单击布局栏中的Stack按钮。IB自动把这些标签嵌入到垂直堆叠视图中。下一步,向视图添加2个按钮。命名一个按钮,“Like”,另一个是“Share”。再次,我们不想处理自动布局。所以,在布局栏中选择按钮,然后单击Stack按钮,将两个按钮嵌入到一个水平堆栈视图中。设置堆栈视图的spacing值为5。如果你看了最后的布局,这两个按钮应该放在Nature标签旁边。你怎么能做到这一步呢?关于stack view的最重要的是,您可以使用嵌套的多个stack view来构建你想要的精确布局。现在将stack view拖到Nature标签的按钮上。一旦你释放了按钮,stack view将被嵌入到另一个stack view中。布局Nature标签和按钮,选择两种视图,然后将它们添加到另一个stack view中,使用stack选项。默认情况下,新堆栈视图的轴设置为垂直方向。在属性检查中,把它改为水平,这样就可以把Like和Shared按钮放置在Nature标签旁边了。按钮也需要与Nature标签的基线对齐。选择stack视图,并将alignment从Fill改为First Baseline。同时,spacing选项设置为20,这样来添加Naturel标签和按钮之间的间距。正如你所看到的,我们只需要使用嵌套的stack view构建你需要的精确布局。最后,我们为包含图像的stack view和包含按钮&标签的stack view之间的设置布局约束。选择包含按钮和标签的堆栈视图,然后单击布局栏按钮中的Pin按钮。设置居上、距左和居右的值分别为0、8和0。确保描述标签是自动调整大小,Lines设置为0和Line Breaks设置为Word Wrap。太好了你已经完成了界面设计。现在运行该项目来看看结果。如果您的一切配置正确,您的UI应该看起来像这样:如果你把iPhone横过来,UI应该是这样:它看起来不错,但如果这些图像想这样横向排列的话,是不是更给力?使用Size Classes 调整Stack Views为了达到iPhone在不同的方向上布局不一样,我们必须使stack view自适应。在iOS 8中,介绍了Size Classes的概念。下表显示了iOS设备及其相应的Size Classes:你可以使用size classes提供的重写原来的基本布局。在这种情况下,我们在这两种size classes情况下要设置stack view的axis(持有图像视图的)从垂直到水平:Compact width-Compact heightRegular width-Compact height现在选择stack view,在选择Attributes inspector。在Axis选项下点击+按钮。选择Any Width > Compact height,之后设置这个size classes下的Axis值为Horizontal。这里,any width包括compact和regular两种宽度。做完这些,stack view将会在iPhone横屏的时候设置为水平。在不同的iOS设备上运行项目,查看结果。总结在本教程中,我给你介绍了stack view并演示如何使用这个新组件布局你的UI。stack view让你使用很少的约束高效的完成UI的布局。你可能有一个问题是,何时使用stack view?苹果公司的工程师建议开发者先采用stack view,然后才是需要实际使用的繁琐的约束。因此,开始设计你的用户界面使用stack view!我相信你会喜欢它。供参考,你可以在这里下载[]。
微信扫一扫
订阅每日移动开发及APP推广热点资讯公众号:CocoaChina
点击量9831点击量7140点击量6799点击量6566点击量6527点击量6006点击量5449点击量4972点击量4052
&2015 Chukong Technologies,Inc.
京公网安备89}

我要回帖

更多关于 swift xcode ui教学 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信