• Uiview要求三个窗口UIWindow来体现页面,而UIWindow类似于一个Uiview.

    • 1.调用[parentView
      addSubview:childview]来增多基于该视图可能该窗口的子视图,新创设的视图顺序彰显在最前边.
    • 2.调用[parentView
      subviews]来查询基于该视图大概该窗口下的持有的子视图.顺序为从后到前,
      即增多顺序.
    • 3.调用[view removeFromSuperview]能够从该主视图中删除.
    • 4.调用[parentView exchangeSubviewAtIndex:I
      withSubviewAtIndex:j]来重新派讯,修改j索引下的子视图为i索引.也足以利用bringSubviewToFront:也许sendSubviewToBack:将视图前移也许后移.
    • 5.用到setTag:给子视图增加标识.做这些符号能够在父视图中调用[parentView
      viewWithTag:]能够搜索到该标志的子视图.也得以作为几个组其他意思(当前太多视图也许控件时候).
  • UIWindow的作用:

    • 和Mac OS
      X的应用程序有所区别,HTC应用程序日常唯有多少个窗口,表示为一个UIWindow类的实例。您的应用程序在运营时创立那一个窗口(也许从nib文件实行装载),并往窗口中投入一或多少个视图,然后将它展现出来。窗口展现出来之后,您比比较少供给重新援用它。
    • 在iOS中,窗口对象并从未像关闭框或标题栏那样的视觉装饰,顾客不能够直接对其开展倒闭或其余操作。全数对窗口的操作都亟待通过其编制程序接口来促成。应用程序能够重视窗口对象来举行事件传递。窗口对象会持续追踪当前的率先响应者对象,并在UIApplication对象提出呼吁时将事件传递它。
    • UIWindow类的继续关系。在Mac OS
      X中,NSWindow的父类是NSResponder;而在iOS中,UIWindow的父类是UIView。由此,窗口在iOS中也是四个视图对象。不管其来源如何,您平常能够将iOS上的窗口和Mac
      OS
      X的窗口同样对待。也便是说,您平时不必直接操作UIWindow对象中与视图有关的品质变量。
    • 在开创应用程序窗口时,您应该总是将其初阶的边框尺寸设置为全体荧屏的分寸。假设您的窗口是从nib文件装载获得,Interface
      Builder并不容许创立比显示屏尺寸小的窗口;但是,假若您的窗口是由此编制程序格局成立的,则必需在创造时传出期望的边框矩形。除了显示器矩形之外,未有理由传入别的边框矩形。显示器矩形能够透过UIScreen对象来获取,具体代码如下所示:

7、不应用IB是,上边那样做有怎么着难点?

1、在Mac OS中NSWindow的父类是NSResponder,而在i OS 中UIWindow 的父类是UIVIew。程序一般唯有三个窗口不过会又相当多视图。

- (void)viewDidLoad {

    [super viewDidLoad];

    CGRect frame = CGRectMake(0, 0, self.view.bounds.size.width * 0.5, self.view.bounds.size.height * 0.5);

    UIView *view = [[UIView alloc] initWithFrame:frame];

    view.backgroundColor = [UIColor redColor];

    [self.view addSubview:view];

}

解释:不使用IB手动创建ViewController时,在viewDidLoad中并未进行位置的初始化,原来遇到过不少次这个小坑,当外部创建这个vc时:
TestViewController *vc = [[TestViewController alloc] init];
vc.view.frame = CGRectMake(0,0,100,100);
//...
我们知道,ViewController的view初始化大概流程是:
- (UIView *)view {
    if (!_view) {

        [self loadView];

        [self viewDidLoad];

    }

}
所以在外部执行到vc.view.frame = CGRectMake(0, 0, 100, 100);这句话时,在赋值操作执行前,viewDidLoad就已经被调用,因而在viewDidLoad中对view frame的取值都是默认值(window的大小),而非设定值。
注: 使用IB加载时如上情况也会发生,只是一般在IB就已经有一个预设值了。

2、UIView的法力:描画和动画,视图负担对其所属的矩形区域描画、布局和子视图管理、事件管理、能够选择触摸事件、事件音讯的载体、等等。

UIWindow* aWindow = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];

6、请说说Layer和View的涉及,以及你是哪些运用它们的。

3、UIViewController 负担创立其管理的视图及在低内部存款和储蓄器的时候将她们从内部存储器中移除。还为典型的系统作为举办响应。

  • 就算iOS补助将二个窗口叠放在其余窗口的最上部,不过你的应用程序长久不应成立四个窗口。系统自个儿行使额外的窗口来展现系统状态条、重要的警告、以及位于应用程序窗口上方的其他新闻。假若您愿目的在于友好的开始和结果上方展现警告,能够动用UIKit提供的告诫视图,而不应制造额外的窗口。

  • UIView是作用

  • 视图是UIView类的实例,负担在荧屏上定义三个矩形区域。在小米的应用程序中,视图在展现客户界面及响应顾客分界面交互方面发挥关键作用。每一种视图对象都要担任渲染视图矩形区域中的内容,并响应该区域中发出的触碰事件。这一双重表现象征视图是应用程序与顾客交互的严重性体制。在贰个根据模型-视图-调控器的应用程序中,视图对象鲜明属于视图部分。

  • 而外出示内容和处管事人件之外,视图还是能用于管理一或多个子视图。子视图是指嵌入到另一视图指标边框内部的视图对象,而被放置的视图则被誉为父视图或超视图。视图的这种布局格局被喻为视图档次,一个视图能够包罗自由数量的子视图,通过为子视图增加子视图的章程,视图能够完毕自由深度的嵌套。视图在视图档案的次序中的组织方式调整了在荧屏上出示的内容,原因是子视图总是被展现在其父视图的最上端;这一个公司章程还调控了视图怎么样响应事件和变化。每种父视图都担负管理其间接的子视图,即基于需求调度它们的职位和尺寸,以及响应它们并未有管理的事件。

  • 是因为视图对象是应用程序和客商交互的关键路径,所以需求在多数上边发挥作用,上边是中间的一小部分:

    • 描绘和卡通片
      • 视图担负对其所属的矩形区域张开雕塑。
      • 少数视图属性别变化量能够以卡通的款型过渡到新的值。
    • 布局和子视图管理
      • 视图管理着三个子视图列表。
      • 视图定义了自个儿相对于其父视图的尺码调解行为。
      • 必备时,视图能够由此代码调治其子视图的尺码和职位。
      • 视图能够将其坐标连串下的点调换为任何视图或窗口坐标种类下的点。
    • 事件管理
      • 视图能够接到触摸事件。
      • 视图是响应者链的参加者。
  • 在金立应用程序中,视图和视图调整器紧凑同盟,管理若干地点的视图行为。视图调控器的功力是管理视图的装载与卸载、管理由于设备旋转导致的分界面旋转,以及和用来营造复杂顾客分界面包车型客车高等导航对象举行相互。

1.首先UIView可以响应事件,Layer不能够.
UI基特命全权大使用UIResponder作为响应对象,来响应系统传递过来的平地风波并展开始拍录卖。UIApplication、UIViewController、UIView、和具有从UIView派生出来的UIKit类(包蕴UIWindow)都直接或间接地承继自UIResponder类。
在 UIResponder中定义了拍卖各样风云和事件传递的接口, 而 CALayer直接接轨
NSObject,并不曾对应的处管事人件的接口。

2.View和CALayer的Frame映射及View怎么样成立CALayer.
三个 Layer 的 frame 是由它的 anchorPoint,position,bounds,和 transform
共同决定的,而一个 View 的 frame 只是简短的回来 Layer的 frame,同样View 的 center和 bounds 也是重回 Layer 的片段性质。

3.UIView生死攸关是对展现内容的管住,而 CALayer 重要重视突显内容的绘图。

4.在做 iOS 动画的时候,修改非
RootLayer的属性(举例地方、背景观等)会暗中认可发生隐式动画,而修改UIView则不会。

总括来讲正是之类几点:

  1. 每种 UIView 内部都有三个 CALayer 在暗自提供内容的绘图和出示,而且UIView 的尺码样式都由中间的 Layer
    所提供。两个都有树状层级结构,layer 内部有 SubLayers,View 内部有
    SubViews.然而 Layer 比 View 多了个AnchorPoint
  2. 在 View显示的时候,UIView 做为 Layer 的 CALayerDelegate,View
    的显得内容由中间的 CALayer 的 display
  3. CALayer 是暗中同意修改属性援助隐式动画的,在给 UIView 的 Layer
    做动画的时候,View 作为 Layer 的代理,Layer 通过
    actionForLayer:forKey:向 View央浼相应的 action(动画行为)
  4. layer 内部维护着陆分 layer tree,分别是 presentLayer
    Tree(动画树),modeLayer Tree(模型树), Render Tree (渲染树),在做
    iOS动画的时候,我们修退换画的属性,在动画的其实是 Layer 的
    presentLayer的属性值,而结尾呈今后分界面上的实在是提供
    View的modelLayer
  5. 两方最引人瞩目标分歧是 View能够承受并处监护人件,而 Layer 无法

==================================================================================
CALayer属于Core
Animation部分的内容,相比关键而不太好明白。以下是田园中看看的一篇小说的剪辑:

  1. UIView是iOS系统中分界面成分的底子,全数的分界面成分都以承接自它。
    它自个儿完全部是由CoreAnimation来促成的。它确实的绘图部分,是由三个CALayer类来管理。UIView本人更疑似三个CALayer的管理器,访谈它的跟绘图和跟坐标有关的性格,举例frame,bounds等,实际上里面都以在拜望它所含有的CALayer的连锁属性。

  2. UIView有个第一性质layer,能够回来它的主CALayer实例。
    // 要访问层,读取UIView实例的layer属性
    CALayer *layer = myView.layer
    装有从UIView承袭来的对象都再三再四了那特特性。那表示你能够转移、缩放、旋转,乃至能够在Navigation
    bars,Tables,Text
    boxes等其他的View类上扩张动画。种种UIView都有一个层,调控着各自的开始和结果最后被出示在显示屏上的法子。
    UIView的layerClass方法,能够回去主layer所使用的类,UIView的子类能够由此重载那几个点子,来让UIView使用分化的CALayer来呈现。代码示例:
    -(class)layerClass {
    return ([CAEAGLLayer class]);
    }
    上述代码使得有个别UIView的子类使用GL来进展绘图。

  3. UIView的CALayer类似UIView的子View树形结构,也足以向它的layer上增添子layer,来产生有个别特殊的表示。即CALayer层是足以嵌套的。
    示范代码:
    grayCover = [[CALayer alloc] init];
    grayCover.backgroundColor = [[UIColor blackColor]
    colorWithAlphaComponent:0.2] CGColor];
    [self.layer addSubLayer:grayCover];
    上述代码会在对象View上敷上一层浅米灰透明薄膜的效应。

  4. UIView的layer树形在系统内部,被爱惜着三份copy。
    分别是:
    逻辑树,这里是代码能够决定的;
    动画树,是壹在那之中间层,系统就在这一层上退换属性,进行种种渲染操作;
    来得树,其内容正是近来正被出示在荧屏上得内容。

  5. 动画的运营:对UIView的subLayer(非主Layer)属性举办改动,系统将自动进行动画生成,动画持续时间的缺省值就像是0.5秒。

  6. 坐标体系:CALayer的坐标体系比UIView多了叁个anchorPoint属性,使用CGPoint结构意味着,值域是0~1,是个比例值。
    那么些点是各样图片转换的坐标原点,同时会改换layer的position的岗位,它的缺省值是{0.5,0.5},即在layer的中心。
    某layer.anchorPoint = CGPointMake(0.f,0.f);
    即便如此设置,只会将layer的左上角被挪到原本的中游地点,必需抬高这一句:
    某layer.position = CGPointMake(0.f,0.f);
    最后:layer能够设置圆角展现(cornerRadius),也得以安装阴影
    (shadowColor)。不过假使layer树中有个别layer设置了圆角,树种全数layer的黑影效果都将不显示了。因而假设要有圆角又要阴影,变通方法只好做七个重叠的UIView,八个的layer显示圆角,二个layer突显阴影……

7.渲染:当更新层,退换不可能立时展现在显示器上。当全数的层都筹算好时,能够调用setNeedsDisplay方法来重绘彰显。
[gameLayer setNeedsDisplay];
若要重绘部分显示屏区域,请使用setNeedsDisplayInRect:方法,通过在CGRect结构的区域创新:
[gameLayer
setNeedsDisplayInRect:CGRectMake(150.0,100.0,50.0,75.0)];
设假如用的Core Graphics框架来实践渲染的话,能够间接渲染Core
Graphics的内容。用renderInContext:来做那些事。
[gameLayer renderInContext:UIGraphicsGetCurrentContext()];

8.转变:要在叁个层中增多两个3D或仿射调换,能够独家设置层的transform或affineTransform属性。
characterView.layer.transform =
CATransform3DMakeScale(-1.0,-1.0,1.0);
CGAffineTransform transform = CGAffineTransformMakeRotation(45.0);
backgroundView.layer.affineTransform = transform;

9.变形:Quartz
Core的渲染才能,使二维图像能够被跋扈支配,就象是是三个维度的。图像能够在三个三个维度坐标系中以自由角度被旋转,缩放和倾斜。CATransform3D的一套方法提供了一部分魔术般的转换效果。

4、layOutSubViews 能够在温馨定制的视图中重载那么些措施,用来调解子视图的尺寸和地方。

13、你是怎么落到实处导航栏透明效果的,会挑起别的主题素材吧?
首先种方法:

5、 UIView的setNeedsDisplay和setNeedsLayout方法。首先几个艺术都以异步实行的。而setNeedsDisplay会调 用电动调用drawRect方法,那样能够得到UIGraphicsGetCurrentContext,就足以描绘了。而setNeedsLayout 会默许调用layoutSubViews,即可拍卖子视图中的一些多少。

宗上所诉,setNeedsDisplay方便绘图,而layoutSubViews方便出来数据

  • UIKit的视图类
  • UIView类定义了视图的主干行为,但并不定义其视觉表示。相反,UI基特通过其子类来为像文本框、开关、及工具条那样的标准分界面成分定义具体的外观和作为。
  • 而外UIView和UIControl类是区别,那个框图中的大好多视图都规划为可径直行使,可能和信托对象结合使用。
- (void)viewWillAppear:(BOOL)animated{

    [super viewWillAppear:animated];

    for (UIView *aView in self.navigationController.navigationBar.subviews) {

        if ([aView isKindOfClass:NSClassFromString(@"_UINavigationBarBackground")]) {

            aView.hidden = YES;

        }

    }

}

- (void)viewWillDisappear:(BOOL)animated

{

    [super viewWillDisappear:animated];

    for (UIView *aView in self.navigationController.navigationBar.subviews) {

        if ([aView isKindOfClass:NSClassFromString(@"_UINavigationBarBackground")]) {

            aView.hidden = NO;
        }    
    }
}

第二种方法:

[self.navigationController.navigationBar setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault];

//去除 navigationBar 底部的细线

self.navigationController.navigationBar.shadowImage = [UIImage new];

第三种方法

self.navigationController.navigationBar.shadowImage = [[UIImage alloc] init];

UIImage *image = [self createAImageWithColor:[UIColor clearColor] alpha:0.0];

[self.navigationController.navigationBar setBackgroundImage:image forBarMetrics:UIBarMetricsDefault];

- (UIImage *)createAImageWithColor:(UIColor *)color alpha:(CGFloat)alpha{

    CGRect rect = CGRectMake(0.0f, 0.0f, 1.0f, 1.0f);

    UIGraphicsBeginImageContext(rect.size);

    CGContextRef context = UIGraphicsGetCurrentContext();

    CGContextSetFillColorWithColor(context, [color CGColor]);

    CGContextSetAlpha(context, alpha);

    CGContextFillRect(context, rect);

    UIImage *theImage = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

    return theImage;

}

注意点:

设置导航栏透明的时候,如果在Push到其他的控制器,其他的控制器导航栏也是会变得透明,所以为了防止这类情况的发生,最好在

- (void)viewWillDisappear:(BOOL)animated

方法中,把导航栏的颜色还原过来。

UIView的setNeedsDisplay和setNeedsLayout方法

第一四个章程都以异步施行的。而setNeedsDisplay会调用自动调用drawRect方法,那样能够得到UIGraphicsGetCurrentContext,就能够描绘了。而setNeedsLayout会默许调用layoutSubViews,
就能够 管理子视图中的一些数码。
综上所诉,setNeedsDisplay方便绘图,而layoutSubViews方便出来数据。

CALayer

2、简述UI伊夫nt和UITouch对象,并表达两者之间的涉嫌

layoutSubviews在偏下情形下会被调用:

1、init开头化不会触发layoutSubviews。
2、addSubview会触发layoutSubviews。
3、设置view的Frame会触发layoutSubviews,当然前提是frame的值设置内外爆发了扭转。
4、滚动四个UIScrollView会触发layoutSubviews。
5、旋转Screen会触发父UIView上的layoutSubviews事件。
6、改换三个UIView大小的时候也会触发父UIView上的layoutSubviews事件。
7、直接调用setLayoutSubviews。

  • CALayer直接接轨于NSObject,因为缺乏UIResponder的支撑,所以CALayer无法响应任何客商事件
  • 各类UIView都有CALayer,即UIView.layer,其有着视觉效果都以在那个layer上海展览中心开的。能够认为UIView注重于管理客商事件,而CALayer则强调于显示效果。CALayer是绘制内容的,不处总管件响应,与UIView是相互依赖的,重视于UIView来展现绘制内容,UIView注重于CALayer来提供内容

UITouch
当客户用一根手指触摸显示器时,会创制三个与手指相关联的UITouch对象,一根手指对应二个UITouch对象
UITouch的效果:保存着跟手指相关的音信,譬如触摸的岗位、时间、阶段
当手指运动时,系统会更新同二个UITouch对象,使之力所能致直接保存该手指在的入手地方,当手指离开显示器时,系统会销毁相应的UITouch对象
唤醒:红米开采中,要幸免使用双击事件!

UITouch的属性
触摸发生时所处的窗口
@property(nonatomic,readonly,retain)UIWindow *window;
触摸发生时所处的视图
@property(nonatomic,readonly,retain)UIView *view;
长时间内点按荧屏的次数,能够依附tapCount判定单击、双击或越来越多的点击
@property(nonatomic,readonly)NSUInteger tapCount;
记录了触摸事件发生或转移时的时刻,单位是秒
@property(nonatomic,readonly)NSTimeInterval timestamp;
当下触摸事件所处的景况
@property(nonatomic,readonly)UITouchPhasep hase;

UItouch方法
-(CGPoint)locationInView:(UIView)view;
重回值表示触摸在view上的职务这里重临的职分是对准view的坐标系的(以view的左上角为原点(0,0))调用时传出的view参数为nil的话,重临的是触摸点在UIWindow的岗位
-(CGPoint)previousLocationInView:(UIView
)view;
该方法记录了前八个触摸点的地方

UIevent
每发生一个平地风波,就能产生二个UIEvent对象
UIevent:称为事件目的,记录事件产生的时刻和项目

常见属性
1.风云类型
@property(nonatomic,readonly)UIEventTypetype;
@property(nonatomic,readonly)UIEventSubtypesubtype;
2.事件时有产生的时日
@property(nonatomic,readonly)NSTimeIntervaltimestamp;
UI伊夫nt还提供了对应的秘诀能够赢得在有些view上面的触动对象(UITouch)

touch和event
二遍完整的触动进程,会经历3个状态:
入手先导:- (void)touchesBegan:(NSSet)touches
withEvent:(UIEvent
)event
触摸移动:- (void)touchesMoved:(NSSet)touches
withEvent:(UIEvent
)event
触摸甘休:- (void)touchesEnded:(NSSet)touches
withEvent:(UIEvent
)event
入手裁撤(也许会经历):- (void)touchesCancelled:(NSSet)touches
withEvent:(UIEvent
)event

4个触摸事件处理措施中,都有NSSettouches和UIEventevent多少个参数,二次完整的触摸进度中,只会发出八个事变指标,4个触摸方法都以同一个event参数。
如若两根手指同一时间触摸几个view,那么view只会调用一次touchesBegan:with伊芙nt:方法,touches参数中装着2个UITouch对象。
借使这两根手指一前一后分开触摸同二个view,那么view会分别调用2次touchesBegan:with伊芙nt:方法,並且每一次调用时的touches参数中只包蕴二个UITouch对象。
基于touches中UITouch的个数能够判别出是单点触摸依然多点触摸。

UIView不接收触摸事件的两种状态
1.不接收客商交互 userInteractionEnabled = NO
2.隐藏 hidden = YES
3.透明 alpha = 0.0 ~ 0.01

升迁:UIImageView的userInteractionEnabled默许正是NO,由此UIImageView以及它的子控件暗许是不可能收到触摸事件的。

drawRect在以下情况下会被调用:

1、即使在UIView起始化时不曾安装rect大小,将一向导致drawRect不被电动调用。drawRect调用是在Controller->loadView,
Controller->viewDidLoad
两艺术之后掉用的.所以不用顾忌在调整器中,这几个View的drawRect就开首画了.那样能够在调节器中装置有些值给View(假若这一个View
draw的时候要求接纳有些变量值).
2、该格局在调用sizeToFit后被调用,所以能够先调用sizeToFit总结出size。然后系统活动调用drawRect:方法。
3、通过安装contentMode属性值为UIViewContentModeRedraw。那么将要历次设置或改换frame的时候自动调用drawRect:。
4、直接调用setNeedsDisplay,恐怕setNeedsDisplayInRect:触发drawRect:,可是有个前提条件是rect不能够为0。
以上1,2推荐;而3,4不提倡

UIWindow

3、简述iOS荧屏触摸事件的传递触发链。

drawRect方法运用注意点:

1、若选取UIView绘图,只可以在drawRect:方法中获得相应的contextRef并绘制。即便在其它办法中赢得将收获到一个invalidate的ref並且不能够用于画图。drawRect:方法无法手动突显调用,必需经过调用setNeedsDisplay
或然 setNeedsDisplayInRect,让系统自动调该方法。
2、若接纳calayer绘图,只能在drawInContext:
中(类似于drawRect)绘制,也许在delegate中的相应措施绘制。相同也是调用setNeedDisplay等直接调用以上办法
3、若要实时画图,不能选取gestureRecognizer,只可以利用touchbegan等办法来掉用setNeedsDisplay实时刷新荧屏

  • UIwindow继于UIView。UIWindow对象是全部UIView的根,管理和和谐应用程序的展现。

  • UIWindow类是UIView的子类,能够看做是特殊的UIView。一般应用程序唯有贰个UIWindow对象,但可以手动创立三个增添到程序中,固然有七个UIWindow对象,也独有一个UIWindow还不错到顾客的触屏事件。

  • UIWindow首要起七个效果与利益:

    • 一是用作容器提供三个区域来呈现UIView,包罗程序有所要呈现的视图

    • 二是将事件的散发给UIView(传递触摸音讯到任何的UIView或其余对象)

    • 三是与UIViewController协同职业,完结设备方向旋转的支撑

  • 创设贰个UIWindow:

iOS中的事件
客商与app交互的时候会时有发生有滋有味的的平地风波,iOS中事件分为三大类型

图片 1

//触摸事件
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;
-(void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent
*)event;
//加快计事件
-(void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent
*)event;
-(void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent
*)event;
-(void)motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent
*)event;
//远程序调整制事件
-(void)remoteControlReceivedWithEvent:(UIEvent *)event;

事件的产生和传递
1.视图爆发触摸事件后,系统会将该事件参与到四个由UIApplication管理的事件队列中
2.UIApplication会从事件队列中抽出最前边的事件,并将事件分发下去以便管理,常常,首发送事件给应用程序的主窗口(keyWindow)
3.主窗口会在视图等级次序结构中找到叁个最合适的视图来管理触摸事件,那也是全数事件管理进程的率先步
4.找到确切的视图控件后,就能调用视图控件的touches方法来作具体的事件管理
touchesBegan…
touchesMoved…
touchedEnded…

怎么着找到最合适的控件来处总管件?
五个首要的法则:
1.融洽是否能接受触摸事件?
2.触摸点是不是在团结身上?
相互都知足的景况下,去遍历自身的子控件是或不是满足上述五个标准,如若符合五个条件则持续遍历子控件,若无符合条件的子控件,那么就协和最符合管理。
值得注意的是:假使父控件不能够接收触摸事件,那么子控件就不或然收取到触摸事件

UIView不接收触摸事件的3种情景
1.互为关闭不收取触摸事件
userInteractionEnabled = NO
2.隐形不接受触摸事件
hidden = YES
3.晶莹剔透不接收触摸事件
alpha = 0.0 ~ 0.01

留心:UIImageView的userInteractionEnabled默许便是NO,由此UIImageView以及它的子控件暗许是无法接收触摸事件的,即便是imageView里面加多了UIButton,也心余力绌捕捉按键的点击

研讨:当叁个控件不能够被点击的时候,那么就应当怀恋到是或不是触发了地方两种境况依旧父控件触发了上边二种状态

响应者链条

在iOS中,由响应者链来对事件张开响应,全体事件响应的类都以UIResponder的子类,响应者链是二个由不一样指标组成的档案的次序结构,个中的各个对象将相继获得响应事件音信的火候。当发闯祸变时,事件首先被发送给第一响应者,第一响应者往往是事件时有发生的视图,也正是顾客触摸显示屏的地点。事件将沿着响应者链一向向下传递,直到被接受并做出管理。一般的话,第一响应者是个视图对象可能其子类对象,当其被触动后事件被交由它管理,若是它不管理,事件就能够被传送给它的视图调整器对象viewcontroller(借使存在),然后是它的父视图(superview)对象(要是存在),就那样推算,直到顶层视图。接下来会沿着顶层视图(top
view)到窗口(UIWindow对象)再到程序(UIApplication对象)。假诺整个经过都未有响应那么些事件,该事件就被放弃。一般景观下,在响应者链中只要由对象处管事人件,事件就告一段落传递。

不是别的对象都能处监护人件,独有承袭了UIResponder的目的本事接收并处总管件。也正是有响应和处监护人件手艺的靶子,大家称为“响应者对象”,响应者链正是由一雨后冬笋的响应者对象构成的三个档期的顺序结构。

UIApplication、UIViewController、UIView都三番五次自UIResponder,由此它们都以响应者对象,都能够吸收并处管事人件

响应者链条暗意图

图片 2

1.要是view的调整器存在,就传递给调控器;假如调节器空头支票,则将其传递给它的父视图
2.在视图档案的次序结构的最一流视图,即使也不可能管理收到的风云或音信,则其将事件或音信传递给window对象开展管理
3.举例window对象也不管理,则其将事件或新闻传递给UIApplication对象
4.只要UIApplication也不可能管理该事件或音讯,则将其放任

响应者链条特点
1、响应者链平日是由视图(UIView)构成的;
2、二个视图的下三个响应者是它视图调控器(UIViewController)(要是某个话),然后再转给它的父视图(Super
View);
3、视图调控器(假设有个别话)的下贰个响应者为其处理的视图的父视图;
4、单例的窗口(UIWindow)的内容视图将针对窗口本人作为它的下叁个响应者要求建议的是,Cocoa
Touch应用不像Cocoa应用,它唯有三个UIWindow对象,整个响应者链会轻巧一些;
5、单例的应用(UIApplication)是一个响应者链的顶峰,它的下多个响应者指向nil,以结束全体循环。

事件分发
1、第一响应者(First
responder)指的是现阶段领受触摸的响应者对象(常常是二个UIView对象),即表示如今该对象正在与客户交互,它是响应者链的初步。整个响应者链和事件分发的重任都以搜索第一响应者。
2、UIWindow对象以音信的款型将事件发送给第一响应者,使其有机会首先处总管件。就算第一响应者未有张开管理,系统就将事件(通过音信)传递给响应者链中的下二个响应者,看看它是还是不是足以开展管理。
3、iOS系统一检查测到手指触摸(Touch)操作时会将其打包成二个UIEvent对象,并归入当前活动Application的事件队列,单例的UIApplication会从事件队列中抽取触摸事件并传递给单例的UIWindow来管理,UIWindow对象首先会动用hitTest:with伊芙nt:方法找出本次Touch操作开始点所在的视图(View),即供给将触摸事件传递给其管理的视图,那个进程称之为hit-test
view。
4、UIWindow实例对象会首先在它的内容视图上调用hitTest:with伊芙nt:,此方法会在其视图层级结构中的各种视图上调用pointInside:withEvent:(该方法用来判断点击事件发生的地点是或不是处在当前视图范围内,以分明客商是否点击了现阶段视图),借使pointInside:withEvent:重临YES,则继续逐级调用,直到找到touch操作爆发的地方,那几个视图也正是要找的hit-test
view。

hitTest:withEvent:的拍卖流程
1.率先调用当前视图的pointInside:withEvent:方法判定触摸点是或不是在当前视图内;
2.若返回NO,则hitTest:withEvent:返回nil;
3.若再次回到YES,则向当前视图的具备子视图(subviews)发送hitTest:with伊芙nt:音讯,全数子视图的遍历顺序是从最顶层视图向来到到最底部视图,即从subviews数组的结尾向前遍历,直到有子视图再次来到非空对象可能全部子视图遍历完成;
4.若先是次有子视图再次回到非空对象,则hitTest:withEvent:方法再次来到此目的,管理实现;
5.如全部子视图都回来非,则hitTest:with伊芙nt:方法重回本身(self)。

图片 3

事件响应链

12、ViewController的loadView,viewDidLoad,viewDidUnload分别是在怎么时候调用的?在自定义ViewController的时候,那多少个函数里面该做什么样专门的职业?

1.创建一个全频的windowself.window = [[UIWindow alloc] initWithFram:[UIScreen mainScreen].bounds];2.在window中放入根控制器self.window.rootViewControl = rootViewControl;3.将window设置为keyWindow并显示window[self.window makeKeyAndVisible];

loadView

1.什么样时候被调用?
历次访谈UIViewController的view(比如controller.view、self.view)并且view为nil,loadView方法就能够被调用。

2.有啥样遵守?
loadView方法是用来承担成立UIViewController的view

3.默许完毕是何等的?
暗许达成即[super loadView]在那之中做了什么样业务。
1>
它会先去寻找与UIViewController相关联的xib文件,通过加载xib文件来成立UIViewController的view

  • 万一在开首化UIViewController钦点了xib文件名,就能够依照传入的xib文件名加载对应的xib文件
    [[MJViewController alloc] initWithNibName:@”MJViewController”
    bundle:nil];
  • 只要没有明显地传xib文件名,就能够加载跟UIViewController同名的xib文件
    [[MJViewController alloc] init]; // 加载MJViewController.xib

2>
若无找到相关联的xib文件,就能够成立五个空荡荡的UIView,然后赋值给UIViewController的view属性,大概如下
self.view = [[[UIView alloc] initWithFrame:[UIScreen
mainScreen].applicationFrame] autorelease];
// applicationFrame的值是:{{x = 0, y = 20}, {width = 320, height =
460}}
[super loadView]内部就差不离变成1>和2>中描述的从头到尾的经过

4.怎样科学利用这些主意?

世家都驾驭UIViewController的view能够通过xib文件来创设,不过在一些意况下,xib不是那么地灵活,所以有的时候我们想经过代码来创制UIView,比方:
self.view = [[[UIWebView alloc] initWithFrame:[UIScreen
mainScreen].applicationFrame] autorelease];
倘若想透过代码来创建UIViewController的view,就要重写loadView方法,并且没有供给调用[super
loadView],因为在第3点里面已经提到:
若没有xib文件,[super loadView]暗中认可会创造二个空荡荡的UIView。
大家既然要通过代码来自定义UIView,那么就没必要事先成立四个空白的UIView,以节省不需求的付出。

没错的做法应该是这么:
-(void)loadView {
self.view = [[[UIWebView alloc] initWithFrame:[UIScreen
mainScreen].applicationFrame] autorelease];
}
无需调用[super
loadView],你调用了也不会出错,只是引致了有个别不要求的花费。
小结一句话,苹果设计那么些艺术正是给我们自定义UIViewController的view用的。

viewDidLoad

1.如曾几何时候被调用?
无论是你是通过xib文件也许重写loadView创立UIViewController的view,在view创设达成后,最后都会调用viewDidLoad方法。

2.有如何功用?
相似大家会在此处做分界面上的起初化操作,譬喻往view中增添一些子视图、从数据库恐怕互连网加载模型数据装配到子视图中。举例:

  • 获得当前的keyWindow
-(void)viewDidLoad
    [super viewDidLoad];
    // 添加一个按钮
    UIButton *button = [UIButton buttonWithType:UIButtonTypeContactAdd];
    [button addTarget:self action:@selector(click) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:button];
}

viewDidUnload

1.怎么着时候被调用?
iOS设备的内部存款和储蓄器是有一无二有限的,借使应用程序占用的内部存款和储蓄器过多以来,系统就可以对应用程序发出内部存款和储蓄器警告。UIViewController就基本上能用didReceiveMemoryWarning音讯。didReceiveMemoryWarning方法的暗中认可实现是:要是当前UIViewController的view不在应用程序的视图等级次序结构(View
Hierarchy)中,即view的superview为nil的时候,就能够将view释放,而且调用viewDidUnload方法

2.有何样功能?
上边提起,发出内部存款和储蓄器警告且view被放飞的时候就能够调用viewDidUnload方法,所以一般在释放财富,主倘诺释放分界面成分相关的财富,将有关的实例都赋值为nil

UIWindow *keyWindow = [UIApplication sharedApplication].keyWindow;
- (void)viewDidUnload {

    [super viewDidUnload];

    self.name = nil;

    self.pwd = nil;

}
  • UIScreen能够看变成是手提式有线电话机显示屏,它提供了二个画布,可以在上面画各个视图控件,能够经过[[UIScreen
    mainScreen] bounds]来获得显示器尺寸.

3.dealloc也是用来刑满释放解除劳教能源的,那跟viewDidUnload有啥关联?
当发出内存警告调用viewDidUnload方法时,只是释放了view,并从未释放UIViewController,所以并不会调用dealloc方法。即viewDidUnload和dealloc方法并未任何关联,dealloc方法只会在UIViewController被假释的时候调用

四个法子的关联
1.先是次访谈UIViewController的view时,view为nil,然后就能调用loadView方法创立view。
2.view创制实现后会调用viewDidLoad方法开展分界面成分的发轫化。
3.当内部存款和储蓄器警告时,系统大概会释放UIViewController的view,将view赋值为nil,况兼调用viewDidUnload方法
4.当重新拜会UIViewController的view时,view已经在3中被赋值为nil,所以又会调用loadView方法重新成立view。
5.view被再一次创制达成后,依旧会调用viewDidLoad方法实行分界面成分的伊始化。

================================================================

iphone屏幕分辨率:iphone4前的设备:320*480iphone4和4s:640*960iphone5和5s:640*1136iphone6:750*1334iphone6p:1242*2208ipad ipad2:1024*768ipad3和4 ipad4:2048*1536ipad mini:1024*768

init方法
在init方法中实例化需求的目的(遵守LazyLoad观念)。
init方法中初步化ViewController本身。

loadView方法
当view必要被出示而它却是nil时,viewController会调用该措施。不要直接调用该措施。
假设手工维护views,必需重载重写该措施。
假若运用IB维护views,必需不能够重载重写该办法。

loadView和IB营造view,你在调整器中完结了loadView方法,那么你可能会在使用运转的某部时候被内部存款和储蓄器管控调用。
假设设备内存不足的时候, view
调控器会收到didReceiveMemoryWarning的音讯。
暗中认可的落到实处是反省当前调控器的view是还是不是在运用。
假使它的view不在当前正在利用的view
hierarchy里面,且你的调控器完结了loadView方法,那么那些view将被release,loadView方法将被重新调用来创建三个新的view。

viewDidLoad方法
viewDidLoad 此方法唯有当view从nib文件伊始化的时候才被调用。
重载重写该措施以进一步定制view
在金立 OS
3.0及其后的本子中,还相应重载重写viewDidUnload来释放对view的另外索引
viewDidLoad后调用数据Model

viewDidUnload方法
当系统内部存款和储蓄器吃紧的时候会调用该方法(注:viewController没有被dealloc)
内部存款和储蓄器吃紧时,在魅族 OS
3.0以前didReceiveMemoryWarning是假释无用内部存款和储蓄器的独占鳌头方式,不过OS
3.0及事后viewDidUnload方法是更加好的议程。
1、在该措施少将全数IBOutlet(无论是property依然实例变量)置为nil(系统release
view时已经将其release掉了)。
2、在该办法中放出别的与view有关的对象、其余在运维时创建(但非系统必需)的指标、在viewDidLoad中被创建的指标、缓存数据等
release对象后,将对象置为nil(IBOutlet只必要将其置为nil,系统release
view时已经将其release掉了)

貌似以为viewDidUnload是viewDidLoad的镜像,因为当view被再度要求时,viewDidLoad还有大概会重新被实施

viewDidUnload中被release的目的必得是很轻便被再次创制的靶子(举例在viewDidLoad或任何措施中成立的对象),不要release客户数据或别的很难被另行创立的指标。

dealloc方法

viewDidUnload和dealloc方法未有涉嫌,dealloc依旧一而再做它该做的业务

viewDidLoad在view 从nib文件起始化时调用,
loadView在controller的view为nil时调用。此方法在编程完成view时调用,view
调整器暗中认可会注册memory warning notification。
当view controller的别的view
没有用的时候,viewDidUnload会被调用,在这里完成将retain 的view
release,倘使是retain的IBOutlet view
属性则毫不在那边release,IBOutlet会负责release 。

UIView

6、简要说说UITableView和UICollectionView的根本差异。

  • UIView对象定义了贰个显示器上的二个矩形区域,同一时候管理该区域的绘图和触屏事件。
  • 能够在那一个区域内绘制图形和文字,仍是能够接到客户的操作。八个UIView的实例能够包蕴和管理若干个子UIView。

二者在行使上海大学致同样,在起初化之后,都会安装相应的数据源和代理,通过重写相应的数据源和代理方法来开展具体操作,今后任重先生而道远说一下它们的有些小差别:
1.初始化
UITableViewController在初阶化后,只要完成它的数据源和代办方法,就足以一向表现出来。而UICollectionViewController推荐使用的是initWithCollectionViewLayout:方法,该中会传入贰个layout,独有有了那一个layout才具显得出来。大概重写init方法,在init方法中安装它的布局情势,也便是layout。那一个layout能够使用持续自UICollectionViewLayout的多个子类
:UICollectionViewFlowLayout 和UICollectionViewTransitionLayout。

这里贴一下常用的流水布局的代码:
[objc] view plain copy
//1.创建layout
// 1.1创建流水布局
UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];
// 1.2设置每个格子的尺寸
layout.itemSize = CGSizeMake(thumbnailWidth, thumbnailWidth);
// 1.3设置整个collectionView的内边距
CGFloat paddingY = 20;
layout.minimumInteritemSpacing = minimumItemspace;
layout.sectionInset = UIEdgeInsetsMake(0, minimumLinespace, paddingY, minimumLinespace);
// 1.4设置每一行之间的间距
layout.minimumLineSpacing = minimumLinespace;
- viewDidAppear:animated{ [super viewDidAppear:animated]; UIView *myView = [[UIView alloc] initWithFrame:CGRectMake(10, 10, 100, 100)]; myView.backgroundColor=[UIColor redColor]; [self.view addSubview:myView];}

2.重用
五个里面包车型大巴cell都得以开展录取,可是UICollectionViewCell在开首化时不会传出identifier
,那会变成cell未有identifier可以用来在缓存池中检索,所以大家须要在ViewDidload方法中登记二个cell,那时它会流传三个identifier,当缓存池中找不到cell时,系统会用注册的cell自动创造一个供役使。若是要注册本身写得类,而该类的视图是从xib文件中变化的,必需注册nib文件。

在UITableViewController中,index抽出相应组合组中央银行的七个属性是section和row,而在UICollectionViewController中,index对应的是section和item.

  • UIView中常用的结构体:
  1. UIView假使须要再度绘制整个分界面,须要调用什么艺术?

UIView setNeedsDisplay和setNeedsLayout方法。
第一几个办法都以异步施行的。而setNeedsDisplay会调用自动调用drawRect方法,那样能够获得UIGraphicsGetCurrentContext,就能够描绘了。而setNeedsLayout会暗中同意调用layoutSubViews,就足以管理子视图中的一些数据。

归咎:setNeedsDisplay方便绘图,而layoutSubViews方便出来数据。

setNeedDisplay告知视图它爆发了改换,供给再次绘制本人,就一定于刷新分界面。

CGPoint point = CGPointMake;//左上角坐标的位置CGSize size = CGSizeMake(width,height);//大小CGRect rect = CGRectMake(x,y,width,height);//位置和大小 ```- UIView的常用属性:```objcframe: 相对父视图的位置和大小bounds:相对自身的位置和大小,所以bounds的x和y永远为0center:子视图的中点坐标相对父视图的位置transform:可以通过这个属性控制视图的放大缩小和旋转superview:获取父视图subviews:获取所有子视图alpha:视图的透明度tag:视图的标志,设置了tag后,可以通过viewWithTag方法拿到这个视图userInteractionEnabled:是否响应用户事件

95.在未曾navigationController的情景下,要从一个ViewController切换来另四个ViewController应该(C)

  • 通过transform属性来对视图举办缩放,旋转
A.{self.navigationController pushViewController:nextViewController animated:YES};

B.{self .view addSubview:nextViewController}

C. {self presentModalViewController:nextViewController animated:YES};

D. {self pushViewController:nextViewController animated:YES};

分析:A、C都需要有navigationController,B一个控制器的view是无法加载另一个控制器的view的,所以选C!

104.简述通过Storyboard完成四个tableView(自定义cell的关键步骤).

CGAffineTransform transform = rootView.transform;rootVIew.transform = CGAffineTransformMakeScale;//缩放rootView.transform = CGAffineTransformScale(transform,0.5,0.5)//在原来的基础上再缩放rootView.transform = CGAffineTransformMakeRotation;//旋转传入的角度是弧度制的rootView.transform = CGAffineTransformRotate(transform,M_PI_4);rootView.transform = CGAffineTransformMakeTranslation;//平移rootView.transform = CGAffineTransformTranslate(transform, 100, 100);

答:首先,创造自个儿的自定义cell的类,大家誉为CustomCell,要承继于UITableViewCell。在这一个类中定义自个儿所急需的控件。

接下来,展开storyboard,选用自个儿要加多自定义cell的UIViewController,大家叫它为ViewController。在UITableView里面增多二个cell(大概涂改原有的cell)。将cell的style改为custom,将cell的类改为CustomCell,将identifier改为CustomCellIdentifier。然后,能够在cell中加多控件,将控件和刚刚在CustomCell中定义的控件连起来。

最终,在ViewController的UITableView的tableView:cellForRowAtIndexPath:代理方法中加多以下代码:
[plain]
CustomCell *cell =
[tableViewdequeueReusableCellWithIdentifier:@”CustomCellIdentifier”];

这么,就创设了五个cell,能够在那句代码之后对团结充分的控件举行设置。

  • UIView的常用方法:
  1. UINavigationController如何要利用push/pop功用的话,需求怎么落到实处?

- removeFromSuperview;将视图从父视图中移除- insertSubview:view atIndex:(NSInteger)index;插入一个视图到指定位置,视图越在下面,index越小- exchangeSubviewAtIndex:(NSInteger)index1 withSubviewAtIndex:(NSInteger)index2;将index1和index2位置的两个视图互换位置- addSubview:view;添加视图到父视图- insertSubview:view belowSubview:siblingSubview;插入视图到指定视图的下面- insertSubview:view aboveSubview:siblingSubview;插入视图到指定视图上面- bringSubviewToFront:view;把视图移到最顶层- sendSubviewToBack:view;把视图移到最底层- viewWithTag:(NSInteger)tag; 根据视图的tag属性找到搜索视图
1.用UINavigationController的时候用pushViewController:animated

//返回之前的视图
[selfnavigationController popViewControllerAnimated:YES];

//ps:push以后会在navigation的left bar自动添加back按钮,它的响应方法就是返回。所以一般不需要写返回方法,点back按钮即可。

2.其他时候用presentModalViewController:animated
    [self presentModalViewController:controller animated:YES];//YES有动画效果
    //返回之前的视图
    [selfdismissModalViewControllerAnimated:YES];

3.切换视图一般用不到addSubview
    UINavigationController是导航控制器,如果pushViewController的话,会跳转到下一个ViewController,点返回会回到现在这个ViewController;

    如果是addSubview的话,其实还是对当前的ViewController操作,只是在当前视图上面又“盖”住了一层视图,其实原来的画面在下面呢,看不到而已。
  • 由此UIView的质量产生一些骨干动画

68.简单说一下应用软件的运行进度,从main文件开首谈到。

跻身main函数,在main.m的main函数中实施了UIApplicationMain那么些办法,那是ios程序的入口点!

int UIApplicationMain(int argc, char argv[], NSString
principalClassName, NSString *delegateClassName)

argc、argv:ISO
C规范main函数的参数,直接传送给UIApplicationMain进行连黑里头理就能够。

principalClassName:钦赐应用程序类,该类必需是UIApplication(或子类)。假如为nil,则用UIApplication类作为暗中同意值

delegateClassName:钦赐应用程序类的代理类,该类必需遵循UIApplicationDelegate协议

此函数会凭借principalClassName成立UIApplication对象,依据delegateClassName成立三个delegate对象,并将该delegate对象赋值给UIApplication对象中的delegate属性

lUIApplication对象会相继给delegate对象发送不一致的新闻,接着会成立应用程序的main
runloop(事件循环),进行事件的拍卖(首先会调用delegate对象的application:didFinishLaunchingWithOptions:)

程序平常退出时这么些函数才回到。假若经过要被系统强制杀死,一般那几个函数还没赶趟再次回到经过就止住了。

UIVIew中支持动画的属性有以下几个:frame:可以通过frame来改变视图的尺寸和位置bounds:可以通过bounds来改变视图的尺寸center:可以通过center来改变视图的位置transform:可以通过transform来使视图翻转和缩放,平移alpha:可以通过alpha修改视图的透明度backgroundColor:改变视图的背景颜色contentStetch:改变视图内容如何拉伸1. [UIView beginAnimations:nil context:nil];//开始动画 [UIView setAnimationDuration:2];//持续时间 //动画 CGAffineTransform transform = sender.transform; sender.transform = CGAffineTransformMakeTranslation; sender.transform = CGAffineTransformTranslate(transform, 100, 100); [UIView commitAnimations];//提交动画 2.使用block [UIView animateWithDuration:2 animations:^{ CGAffineTransform transform = sender.transform; sender.transform = CGAffineTransformMakeTranslation; sender.transform = CGAffineTransformTranslate(transform, 100, 100); }]; 3.使用block [UIView animateWithDuration:2 animations:^{ CGAffineTransform transform = sender.transform; sender.transform = CGAffineTransformMakeTranslation; sender.transform = CGAffineTransformTranslate(transform, 100, 100); } completion:^(BOOL finished) { //动画完成后调用的代码段 }];动画常用设置[UIView setAnimationDuration:2];动画持续时间[UIView setAnimationRepeatCount:1];动画重复次数

91.UITableView亟待达成怎么着代理?列出UITableView代理中必得贯彻的与别的部分常用的函数.

  • UIViewController担当创制其处理的视图及在低内部存款和储蓄器的时候将他们从内部存款和储蓄器中移除。还为标准的连串作为展开响应。

  • UIViewController肩负管理全部UIView的档案的次序结构,并响应设备的大势转换。

  • UIView的setNeedsDisplay和setNeedsLayout方法

    • 1、在Mac OS中NSWindow的父类是NSResponder,而在iOS 中UIWindow
      的父类是UIVIew。程序一般唯有一个窗口但是会又非常多视图。
    • 2、UIView的服从:描画和卡通,视图担负对其所属的矩形区域描画、布局和子视图管理、事件管理、能够收到触摸事件、事件新闻的载体、等等。
    • 3、UIViewController
      担任创造其管理的视图及在低内部存款和储蓄器的时候将她们从内部存款和储蓄器中移除。还为规范的系统作为进行响应。
    • 4、layOutSubViews
      能够在融洽定制的视图中重载那个措施,用来调度子视图的尺寸和岗位。
    • 5、UIView的setNeedsDisplay和setNeedsLayout方法
      • 率先七个办法都以异步实行的。而setNeedsDisplay会调用自动调用drawRect方法,那样能够得到UIGraphicsGetCurrentContext,就足以描绘了。
      • 而setNeedsLayout会暗中认可调用layoutSubViews,就足以管理子视图中的一些数量。

    • 综述:setNeedsDisplay方便绘图,而layoutSubViews方便出来数据
    • setNeedDisplay告知视图它发生了改换,需求重新绘制本人,就一定于刷新分界面.
      • layoutSubviews在以下景况下会被调用:
        • 1、init起初化不会触发layoutSubviews。
        • 2、addSubview会触发layoutSubviews。
        • 3、设置view的Frame会触发layoutSubviews,当然前提是frame的值设置内外爆发了转移。
        • 4、滚动八个UIScrollView会触发layoutSubviews。
        • 5、旋转Screen会触发父UIView上的layoutSubviews事件。
        • 6、改造一个UIView大小的时候也会触发父UIView上的layoutSubviews事件。
        • 7、直接调用setLayoutSubviews。
      • drawRect在偏下情形下会被调用:
        • 1、即便在UIView开端化时从没设置rect大小,将一贯导致drawRect不被自动调用。drawRect调用是在Controller->loadView,
          Controller->viewDidLoad
          两办法之后掉用的.所以不用忧郁在调节器中,那么些View的drawRect就伊始画了.那样可以在调整器中安装某些值给View(倘若那么些View
          draw的时候须求选择某个变量值).
        • 2、该办法在调用sizeToFit后被调用,所以能够先调用sizeToFit总括出size。然后系统活动调用drawRect:方法。
        • 3、通过安装contentMode属性值为UIViewContentModeRedraw。那么将要历次设置或转移frame的时候自动调用drawRect:。
        • 4、间接调用setNeedsDisplay,也许setNeedsDisplayInRect:触发drawRect:,可是有个前提条件是rect不可能为0。以上1,2推荐;而3,4不提倡
      • drawRect方法应用注意点
        • 1、若采纳UIView绘图,只好在drawRect:方法中收获相应的contextRef并绘制。借使在其余方法中获得将获得到贰个invalidate的ref何况不能够用来画图。drawRect:方法不能够手动显示调用,必得通过调用setNeedsDisplay
          或许 setNeedsDisplayInRect,让系统活动调该措施。
        • 2、若使用calayer绘图,只可以在drawInContext:
          中(类似于drawRect)绘制,可能在delegate中的相应措施绘制。相同也是调用setNeedDisplay等直接调用以上措施
        • 3、若要实时画图,不可能使用gestureRecognizer,只能使用touchbegan等方法来掉用setNeedsDisplay实时刷新显示屏
  • initWithFram:frame方法用来最早化贰个UIView,传入CGRect当参数

答:
//一组有多少行
-( NSInteger )tableView:( UITableView *)tableViewnumberOfRowsInSection:( NSInteger)section;

-( UITableViewCell *)tableView:( UITableView *)tableViewcellForRowAtIndexPath:(NSIndexPath *)indexPath;
//每行中的cell的实现以上两个方法为必须要实现的

//常用的有
- ( void )tableView:( UITableView *)tableViewdidSelectRowAtIndexPath:( NSIndexPath*)indexPath

//选中以后事件设置

-( CGFloat )tableView:( UITableView *)tableViewheightForRowAtIndexPath:( NSIndexPath*)indexPath

//设置cell的高度

//等等。。。。。

UIRespnder

  1. iOS里面包车型地铁手势是哪些贯彻的?
  • UIResponder 是 UIView 的父类。responder
    可以处理触摸、手势、远程调整等事件。
  • 于是它是二个独门的类而并未统一到 UIView 中,是因为 UIResponder
    有越多的子类,最刚强的便是 UIApplication 和 UIViewController。
  • 经过重写 UIResponder的办法,能够决定一个类是还是不是能够成为第一响应者
    (first responder),举例当前输入核心成分。
  • 当 touches 或 motion (指一雨后鞭笋活动传感器)
    等相互行为发生时,它们被发送给第一响应者 。
  • 借使第一响应者没有处理,则该行为沿着响应链达到视图调控器,若是行为如故未有被处理,则连续传递给采取。
  • 一经想监测晃入手势,能够依附供给在那3层中的肆意地方管理。
  • UIResponder 还同意自定义输入方法,从 inputAccessoryView
    向键盘加多扶助视图到应用 inputView 提供贰个通通自定义的键盘。

#import "ViewController.h"

@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIImageView *iconView;
@property (nonatomic,assign) NSInteger index;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    //0.开启用户交互
    [self.iconView setUserInteractionEnabled:YES];

    //创建手势

    /*********** *********** 1.创建轻敲手势--单击 *********** ***********/
    //1.1创建手势对象
    UITapGestureRecognizer *tap=[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tap)];
    //1.2添加手势到指定的控件
    [self.iconView addGestureRecognizer:tap]; //多态
    //1.3设置手势的常用属性
    //tap.numberOfTapsRequired=2; //轻敲的次数,说明轻敲2次才会触发
    //tap.numberOfTouchesRequired=2; //轻敲时的手指数量


    /*********** *********** 2.创建捏合手势 *********** ***********/
    //(pinch:)会将当前手势对象做为参数传递(捕获缩放比例)
    //2.1创建手势对象
    UIPinchGestureRecognizer *pinch=[[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinch:)];
    //2.2添加手势到指定的控件
    [self.iconView addGestureRecognizer:pinch];


    /*********** *********** 3.创建旋转手势 *********** ***********/
    //3.1创建手势对象
    UIRotationGestureRecognizer *rotate=[[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(rotation:)];
    //3.2添加手势到指定的控件
    [self.iconView addGestureRecognizer:rotate];

    /*********** *********** 4.创建轻扫 滑动手势 *********** ***********/
    //4.1创建手势对象
    UISwipeGestureRecognizer *swipeRight=[[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipe:)];
    //4.2添加手势到指定的控件
    [self.iconView addGestureRecognizer:swipeRight];
    //如果需要不同的方向轻扫,那么就需要创建不同的手势对象:意味着,一个轻扫手势对象只能设置一个方向
    UISwipeGestureRecognizer *swipeLeft=[[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipe:)];
    //设置轻扫方向
    swipeLeft.direction=UISwipeGestureRecognizerDirectionLeft;
    //4.2添加手势到指定的控件
    [self.iconView addGestureRecognizer:swipeLeft];


    /*********** *********** 5.创建拖拽手势 *********** ***********/
    //5.1创建手势对象
    UIPanGestureRecognizer *pan=[[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(pan:)];
    //5.2添加手势到指定的控件
    [self.iconView addGestureRecognizer:pan];

    //设置手势的优先级别:我们需要系统先识别轻扫,如果轻扫手势不能识别,再来识别拖拽
    [pan requireGestureRecognizerToFail:swipeLeft]; //这句代码说明如果swipeLeft识别失败才会识别pan
    [pan requireGestureRecognizerToFail:swipeRight];//这句代码说明如果swipeRight识别失败才会识别pan


    /*********** *********** 6.设置长按手势 *********** ***********/
    //6.1创建手势对象
    UILongPressGestureRecognizer *longPress=[[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPress:)];
    //设置长按时间
    longPress.minimumPressDuration=0.5;
    //6.2添加手势到指定的控件
    [self.view addGestureRecognizer:longPress];
}

//6.3长按手势处理方法
- (void) longPress:(UILongPressGestureRecognizer *)gesture
{
    //默认会打印两个状态下的数据
    if (gesture.state==UIGestureRecognizerStateBegan) {
        //弹出消息框
        UIAlertView *alert=[[UIAlertView alloc] initWithTitle:@"操作" message:@"请选择" delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"确定", nil];
        [alert show];
    }
}

//5.3拖拽手势处理方法
- (void)pan:(UIPanGestureRecognizer *)gesture
{
    //NSLog(@"UIPanGestureRecognizer");
    //获取当前的偏移值
    CGPoint offset=[gesture translationInView:self.iconView];
    //设置transform
    self.iconView.transform=CGAffineTransformMakeTranslation(offset.x, offset.y);
    //当手势响应结束的时候,让图片回到原始位置
    if (gesture.state==UIGestureRecognizerStateEnded) {
        [UIView animateWithDuration:0.5 animations:^{
            //CGAffineTransformIdentity就是控件的原始的transform值
            self.iconView.transform=CGAffineTransformIdentity;

        }];
    }
}

//4.3轻扫手势处理方法
//默认方向是向右扫
- (void)swipe:(UISwipeGestureRecognizer *)gesture
{
//    //转场动画
//    CATransition *tran=[CATransition animation];
//    // type:设置转动方向
//    tran.type=@"fade";
//    tran.type=@"cube";
//    //设置动画时间
//    tran.duration=2;


    if (gesture.direction==UISwipeGestureRecognizerDirectionLeft) {
        self.index++;
        //转场动画向左
//        tran.subtype=kCATransitionFromRight;
    }
    else if(gesture.direction==UISwipeGestureRecognizerDirectionRight){
        self.index--;
        //转场动画向右
//        tran.subtype=kCATransitionFromLeft;
    }
    self.index= ABS(self.index+9)%9;
    NSString *fileName=[NSString stringWithFormat:@"%ld",self.index];
    //重新设置图片
    self.iconView.image=[UIImage imageNamed:fileName];
    //添加转场动画,要在设置完属性后才能添加
//    [self.iconView.layer addAnimation:tran forKey:nil];
}

//3.3旋转手势处理方法
-(void)rotation:(UIRotationGestureRecognizer *)guesture
{
    //获取当前手势所产生的角度值---弧度值
    CGFloat angle=guesture.rotation;
    self.iconView.transform=CGAffineTransformMakeRotation(angle);
}

//2.3捏合手势处理方法
- (void) pinch:(UIPinchGestureRecognizer *)gesture
{
    //缩放比例
    CGFloat scale=gesture.scale;
    NSLog(@"%f",scale);
    //每次都是从原来尺寸捏合,一般情况下用这种方法
    self.iconView.transform=CGAffineTransformMakeScale(scale, scale);
    //参照上一次捏合的结果来捏合,同时scale也会变化
    //self.iconView.transform=CGAffineTransformScale(self.iconView.transform, scale, scale);
}

//1.3轻敲手势处理方法
- (void) tap
{
    [self.navigationController setNavigationBarHidden:!self.navigationController.navigationBarHidden animated:YES];
}
@end

手势的种类
所有手势的父类:UIGestureRecognizer
6种手势:UI XXX GestureRecognizer
UITapGestureRecognizer  点击一下屏幕
UISwipeGestureRecognizer  轻扫屏幕,如解锁
UILongPressGestureRecognizer 长按手势
UIPinchGestureRecognizer  捏合手势
UIPanGestureRecognizer 移动手势
UIRotationGestureRecognizer 旋转手势

如何使用手势
step1:创建手势对象
step2:设置与该手势相关的属性
step3:将手势对象与需要检测的视图关联在一起

1.具体的手势的使用

1.1 UITapGestureRecognizer  (一次性手势)


1.2 UISwipeGestureRecognizer (一次性手势)

- (void)viewDidLoad
{
    [superviewDidLoad];
    UISwipeGestureRecognizer *swipeGR = [[UISwipeGestureRecognizeralloc]initWithTarget:selfaction:@selector(swipe:)];
    swipeGR.numberOfTouchesRequired =1;
    //设置轻扫动作的方向
    swipeGR.direction =UISwipeGestureRecognizerDirectionRight|UISwipeGestureRecognizerDirectionLeft;
    [self.viewaddGestureRecognizer:swipeGR];
}

-(void)swipe:(UISwipeGestureRecognizer *)gr{
    NSLog(@"...");
}

注意:direction属性为枚举,并且是可以进行组合的枚举值,多个枚举值之间可以使用“|”按位“或”进行运算,每一个二进制位代表一个状态,组合后,系统通过读取哪一个位置为1,就代表支持这个状态

1.3 UILongPressGestureRecognizer(连续性手势)
【Demo3_LongPressGestureRecognizer】
@interfaceViewController ()

@end

@implementation ViewController

- (void)viewDidLoad
{
    [superviewDidLoad];
    UILongPressGestureRecognizer *longGR = [[UILongPressGestureRecognizeralloc]initWithTarget:selfaction:@selector(longPress:)];
    longGR.minimumPressDuration =2;
    [self.viewaddGestureRecognizer:longGR];
}

-(void)longPress:(UILongPressGestureRecognizer *)gr{
    NSLog(@".....");
}


1.4 UIPinchGestureRecognizer(连续性手势,捏合)
【Demo4_PinchGestureRecognizer】

-(void)pinch:(UIPinchGestureRecognizer *)gr{
    //比例 大小的比率
    CGFloat scale = gr.scale;
    //速率
    CGFloat velocity = gr.velocity;
    //NSLog(@"scale=%.2f,velocity=%.2f",scale,velocity);
    if (velocity >6) {
        self.textView.hidden =NO;
    }elseif (velocity < -6){
        self.textView.hidden =YES;
    }else{
        self.textView.font = [UIFont systemFontOfSize:17*scale];
    }

}

练习:界面上有一个UITextView,增加手势识别,如果快速扩,文本出现,快速捏,文本隐藏,慢速扩,字体放大,慢速捏,字体缩小
self.textView.editable = NO;
self.textView.hidden
self.textView.font

1.5 UIPanGestureRecognizer(连续性手势,移动)
【Demo5_PanGestureRecognizer】
-(void)pan:(UIPanGestureRecognizer *)gr{
    //触点移动的绝对距离
    //CGPoint location = [gr locationInView:self.view];
    //移动两点之间的相对距离
    CGPoint translation = [gr translationInView:self.view];
    CGPoint center = self.imageView.center;
    center.x+=translation.x;
    center.y+=translation.y;
    self.imageView.center= center;
    //每次移动后,将本次移动的距离置零
    //下一次再移动时,记录的距离就是最后两点间的距离
    //而不是距离第一个点的距离
    [gr setTranslation:CGPointZero inView:self.view];
}

练习:图片随手势的移动而移动

1.6 UIRotationGestureRecognizer(连续性手势,旋转)
【Demo6_RotationGestureRecognizer】
- (void)viewDidLoad
{
    [superviewDidLoad];
    UIRotationGestureRecognizer *rotationGR = [[UIRotationGestureRecognizeralloc]initWithTarget:selfaction:@selector(rotation:)];
    [self.viewaddGestureRecognizer:rotationGR];
}

-(void)rotation:(UIRotationGestureRecognizer *)gr{
    //获取当前位置相对于手势开始时经过的弧度
    CGFloat rotation = gr.rotation;
    NSLog(@"%.2f",rotation);
}


2.变形(Transform)
2.1什么是变形?
视图发生了位移、缩放、旋转这样的变化叫做变形

2.2 如何实现变形?
通过修改视图对象的 .transform 属性 就可以完成变化的效果
位移:translation
缩放:scale
旋转:rotation
2.3 transform属性
类型:CGAffineTransform (仿射变换)类型的结构体
结构体中包含了3X3矩阵的9个值,其中有3个值不变,所以只要修改剩余的6个值,就可以实现视图的变换
这6个数值很难计算,借助于一些系统的API可以方便的实现数值的改变

2.4 修改transform属性的API
位移变换:
CGAffineTransformMakeTransition()
CGAffineTransformTranslate()

缩放变换:
CGAffineTransformMakeScale()
CGAffineTransformScale()

旋转变换:
CGAffineTransformMakeRotation()
CGAffineTransformRotate()

重点注意:变形与自动布局是冲突的,所以在使用变形时,一定要关闭Auto Layout,不关闭的话,产生的效果无法预料
【Demo7_Transform】

@interfaceViewController ()
@property (weak,nonatomic) IBOutletUIImageView *imageView;

@end

@implementation ViewController

- (void)viewDidLoad
{
    [superviewDidLoad];
}

//位移
- (IBAction)translation:(id)sender {

    CGPoint center =self.imageView.center;
    center.x+=30;
    center.y+=30;
    self.imageView.center =center;

}
//缩放
- (IBAction)scale:(id)sender {
    //self.imageView.transform = CGAffineTransformMakeScale(1.5, 1.5);
    self.imageView.transform =CGAffineTransformScale(self.imageView.transform,1.5, 1.5);
}
//旋转
- (IBAction)rotation:(id)sender {
    //self.imageView.transform = CGAffineTransformMakeRotation(M_PI_2);
    self.imageView.transform =CGAffineTransformRotate(self.imageView.transform,M_PI_2);

}

- (IBAction)identity:(id)sender {
    self.imageView.transform =CGAffineTransformIdentity;
}

界面创建后,没有做任何变形之前,系统会将这个状态记录到一个常量中 CGAffineTransformIdentity,当使用Makexxxx()函数进行计算新的矩阵时,都是基于这个常量进行变形计算的,当使用没有make的那组方法事,每次计算新的矩阵都会依据传入的transform做为变换的基础


3. 手势+变形
【Demo8_GestureRecognizer_Transform】
@property (weak,nonatomic) IBOutletUIImageView *imageView;

@end

@implementation ViewController

- (void)viewDidLoad
{
    [superviewDidLoad];
    UIPanGestureRecognizer *panGR = [[UIPanGestureRecognizeralloc]initWithTarget:selfaction:@selector(pan:)];
    UIPinchGestureRecognizer *pinchGR =[[UIPinchGestureRecognizeralloc]initWithTarget:selfaction:@selector(pinch:)];
    UIRotationGestureRecognizer *rotationGR = [[UIRotationGestureRecognizeralloc]initWithTarget:selfaction:@selector(rotation:)];

    pinchGR.delegate =self;
    rotationGR.delegate =self;


    [self.viewaddGestureRecognizer:panGR];
    [self.viewaddGestureRecognizer:pinchGR];
    [self.viewaddGestureRecognizer:rotationGR];
}
//移动
-(void)pan:(UIPanGestureRecognizer *)gr{
    CGPoint translation = [grtranslationInView:self.view];
    CGPoint center =self.imageView.center;
    center.x+=translation.x;
    center.y+=translation.y;
    self.imageView.center = center;
    //self.imageView.transform = CGAffineTransformTranslate(self.imageView.transform, translation.x, translation.y);
    [gr setTranslation:CGPointZeroinView:self.view];
}
// 缩放
-(void)pinch:(UIPinchGestureRecognizer *)gr{
    self.imageView.transform =CGAffineTransformScale(self.imageView.transform, gr.scale, gr.scale);
    //将本次变化的比率归1  下一次的新比率就是相对本次的增长,而不是相对于最初的比率
    gr.scale =1;
}

//旋转
-(void)rotation:(UIRotationGestureRecognizer *)gr{
    self.imageView.transform =CGAffineTransformRotate(self.imageView.transform, gr.rotation);
    gr.rotation =0;

}

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{
    returnYES;
}


//注意:第一件事  先关 auto layout

3.1 使用pan手势实现图片位移

3.2 使用pinch手势实现图片的缩放

3.3 使用rotation手势实现图片的旋转

3.4 多手势并存实现旋转缩放
step1:分别设置两个手势的代理为当前控制器
step2:控制器这个代理对象需要遵守协议
step3:控制器实现一个方法

4.在storyboard中实现手势
step1:从右侧资源库中选择合适的手势图标,拖拽到场景中
step2:在拖拽到场景的过程中,要有意识的选择将这个手势与哪个视图绑定,拖拽到视图上方,视图变蓝即可松手
step3:在场景的条目上,会发现拖拽的那个手势,选中按住control,连线到代码区,编写针对这个手势的响应方法

36.简述CALayer和UIView的关系

答:UIView和CALayer是互相注重的关系。UIView正视与calayer提供的剧情,CALayer重视uivew提供的容器来彰显绘制的从头到尾的经过。归根结底CALayer是那全体的根底,若无CALayer,UIView自己也不会设有,UIView是三个别具一格的CALayer完结,加多了响应事件的技能。
结论:
UIView来自CALayer,高于CALayer,是CALayer高层达成与包装。UIView的持有性格来源于CALayer补助。

20、简述你对UIView、UIWindow和CALayer的知晓

UIView:
属于UIkit.framework框架,担任渲染矩形区域的从头到尾的经过,为矩形区域丰盛动画,响应区域的触摸事件,布局和保管三个或多少个子视图

UIWindow:属于UIKit.framework框架,是一种非常的UIView,日常在贰个顺序中只会有八个UIWindow,但能够手动创制三个UIWindow,同时加到程序里面。UIWindow在前后相继中任重先生而道远起到三个作用:
用作容器,包括app所要呈现的享有视图;
传递触摸音讯到程序中view和别的对象;
与UIViewController协同专门的工作,方便产生设备方向旋转的辅助。

CAlayer:属于QuartzCore.framework,是用来绘制内容的,对剧情张开动画管理依赖与UIView来进行体现,不能够管理客商事件。

UIView和CALayer是相互依赖的,UIView注重CALayer提供内容,CALayer正视UIView的容器突显绘制内容。

(补充)UIViewController:各样视图调节器都有叁个自带的视图,而且担任那几个视图相关的成套事情。方便管理视图中的子视图,担当model与view的通讯;检查评定设施旋转以及内部存款和储蓄器警告;是独具视图调整类的储存,定义了调整器的基本功效。

16、二个tableView是不是能够提到三个不相同的数据源?

参谋答案:
理之当然是足以提到七个不等的数据源,但是不可同期利用七个数据源而已。比如,二个列表有多少个筛选功效,一个是筛选城市,一个是筛选时间,那么那七个正是五个数据源了。当筛选城市时,就能选拔城市数据源;当筛选时间时,就能使用时间数据源。

216.ViewController的didReceiveMemoryWarning怎么被调用:

1、当程序收到内部存款和储蓄器警告时候ViewController会调用didReceiveMemoryWarning那一个方法。
2、调用了那些点子之后,对view举办自由而且调用viewDidUnload方法
3、从iOS3.0上马,无需重载这些函数,把自由内部存款和储蓄器的代码放到viewDidUnload中去。

  1. Write something about what you achievedby and what you learned from
    the UITableView class

首先,Controller须求贯彻五个delegate,分别是UITableViewDelegate和UITableViewDataSource,然后UITableView对象的delegate要安装为self,注册cell,之后给定分区数和行数,注意cell的重用机制,能够设置系统cell或许自定义cell。

9、完成贰个最简易的点击拖拽成效。上边十一分拖拽之外,假如在手松手时,要求依靠速度往前滑行呢?

给要拖拽的视图增加上UIPanGestureRecognizer手势,设置视图的center
悬停今后的放缓利用velocityInView来获得截止时候的进程。

代码:
CGPoint velocity = [panGestureRecognizer velocityInView:self.view];

CGFloat vMax = 3000;
CGFloat distanceMax = 60;

CGFloat finalDisX = (velocity.x * distanceMax)/vMax;
CGFloat finalDisY = (velocity.y * distanceMax)/vMax;

CGFloat finalDisXY = sqrtf((finalDisX * finalDisX) + (finalDisY* finalDisY));

CGPoint finalPoint = CGPointMake(panGestureRecognizer.view.center.x + finalDisX, panGestureRecognizer.view.center.y + finalDisY);

finalPoint.x = MIN(MAX(finalPoint.x, 0), self.view.bounds.size.width);

finalPoint.y = MIN(MAX(finalPoint.y, 0), self.view.bounds.size.height);

[UIView animateWithDuration:finalDisXY/distanceMax delay:0 options:UIViewAnimationOptionCurveEaseOut | UIViewAnimationOptionAllowUserInteraction animations:^{

    panGestureRecognizer.view.center = finalPoint;

} completion:nil];

10、系统怎样寻觅到须求响应顾客操作的可怜Responder?

一呼百应对象(Responder):是享有响应和处监护人件技术的指标,UIResponder是富有响应对象的基类。
顾客点击显示器 ->
检验到动手的事件将其打包成UIEvent对象,并放入当前运动的UIApplication事件队列中
->
收取该事件交给UIWindow来管理 ->
window首先使用hitTest:with伊芙nt搜索本次touch操作的初始点所在的视图view
->
次方法会调用pointInside:with伊夫nt决断点击点是还是不是在视图内以确定是或不是点击了当下视图
->
假定点击的是最近的视图依此类推遍历那几个视图的子视图 ->
直至找到那些touch操作所在的职位

11、多荧屏尺寸的适配

机动布局,使用Masonry

12、UIButton的父类是何许?UILabel呢?

UIButton:父类
UIControl,UIControl的父类是UIView,多了一层,在UIControl中多了有的相互事件的管理。

UILabel:父类 UIView

19.UIButton从子类到父类一次一连自:( D )

A. UIView-> UIViewController->UIController
B. UIResponder-> UIControl-> UIView
C. UIControl-> UIResponder->UIViewController
D. UIControl-> UIView-> UIResponder

13、push view controller 和 present view controller的区别?

行使Push,必需需要当前的调整器在UINavigationController里面,present只需求当前是三个UIViewControler就行。
push是凭借当前逻辑操作上叠合四个新的调整器
present一般是一时半刻的弹出八个界面

14、描述下tableview cell的重用机制

选定通过各个cell内定二个起用标记reuseIdentity,即内定单元格的门类,当cell滚出显示屏的时候,会将滚出显示屏的单元格放入重用的queue中,当有些未在显示器上出示的单元格要来得的时候,就能从这么些queue中抽取实行再度,通过录取cell能够直达节外省部存款和储蓄器给的目标。

15.在UIKit中,frame与bounds的关联是( C )

A. frame是bounds的别名
B. frame是bounds的承接类
C. frame的规格是父规图坐标, bounds的口径是自身的坐标
D.frame的标准是自身坐标,bounds的基准是父规图的坐标

15、UIView的frame和bounds的区分是什么

frame是参照父视图的坐标种类
bounds是自个儿的坐标系列。原点是(0,0)

140.Storyboard or Xib, whichdoyouprefer?And why
Storyboard和Xib你欣赏哪个为啥?

答:
(附网址:http://blog.mobilejazz.com/storyboards-xibs-best-practices/)

喜欢哪个大家能够挑选:以下是Storyboard和Xib的优劣点能够参照以下

以下解释是土耳其共和国(Türkiye Cumhuriyeti)语翻译过来的(提出咱们能够看网站原来的文章章)

xibs是XML文件定义和配备的一组对象,并特别垄断主要观点(UIView子类)。Xcode具备温馨的编辑器,能够来得这一个见解,它是三个运作的应用程序,使得它的布局和希图布局特别轻易(节省不胜枚举行代码)。

就算大许多开荒商涉嫌一个xib文件“荧屏”或“视图调节器”,是通用的器皿xibs对象和能够一同使用,与其他连串的对象作为nsobjects
UIViews,可能只是壹个人。

Storyboard

那是贰个XML文件表示联合一套xibs为了定义导航之间的一组视图调整器。有二个轶事二个开垦者能够定义八个“显示屏”(或和导航之间的UIViewController类)他们。

作为一个差的XIB,故事是由定义的视图和导航管理他们中间。

xibs VS代码的平价
视图的可视化配置。
机关布局的视觉形象。
大小班的视觉形象。
节省时间和代码,而“成立实例”。
节省时间和代码,而“配置对象”。
快速UITableViewCell原型。
神速布置调节动作(ibactions)。
Storyboard与xibs效益
能够平素在本子本人原型的行。
能够定义静态表格部分和行。
能够利用电动布局约束增添到toplayoutguide和bottomlayoutguide。
可以钦命导航和联网(那是叁个关键的目标!)。
能够定义多少个“显示屏”(处理的)在二个地点(没有需要多xibs)。
对xibs VS代码不便
轻松干裂合併时(GIT)。
不复杂的自动布局定义。
不可能援引(或包罗)其余xibs。
Storyboard与代码xibs不便
有趣的事剧情是:大文件的加载速度慢,有时。
急需三个大显示器展现全部(或局地)的剧情。
轻易干裂合併时(GIT)。
高可能率打破它时,合併(GIT)作为故事包罗众多消息。
成都百货上千警示当援救iOS 7和iOS 8(收益,大小班)。
不可能援引(或包涵)别的xibs。

157.Storyboard or Xib, which do you prefer ? And why ?
你喜欢使用Storyboard还是Xib?为啥?

详细解释:“http://stackoverflow.com/questions/13834999/storyboards-vs-the-old-xib-way”

答案: The reasons for liking Storyboard:There are things you can do with

a storyboard that you can't do with a nib. A storyboard lets you create segues

between view controllers, and it lets you design table view cells in-place. One

big advantage of Storyboard is the ability to view your entire application's

GUI(图形用户界面)flow. Zoom out and you can see how everything interconnects andflows.

The reasons for liking Xib : There are

things you can do with a nib that you can't do with a storyboard. In a nib, you

can create references to the File's Owner placeholder(占位符). You

can create multiple top-level views, edit them, and create connections between

them. See this answer for an example of why you'd want to do that. You can add

external(外部的)object placeholders (a rarely-used feature很少使用的功能).

1.Apartfrom the historical value in the xib approach, xib's also provide modularity.Perhaps you have a library of code or wish to share a useful widget you made.Taking the xib approach would facilitate that sharing and reuse.

2.Thexib approach also allows you some greater flexibility in terms of your owncode.

3.Withxibs, while the modularity is nice, it's tougher to envision how everythingconnects and flows together. This can be a useful feature for yourself, or ifyou have a larger team to share with, to allow others to see how the app flows.

8.遇见过 Unable to simultaneously satisfy constraints 错误呢?描述一下。

自律难题,约束争持了

66.调节器View的生命周期及有关函数是什么?你在支付中是怎么着用的?

1.在视图展现在此以前调用viewWillAppear;该函数能够调用数拾一回;
2.视图展现完结,调用viewDidAppear;
3.在视图消失在此以前调用viewWillDisAppear;该函数能够调用数十次(如要求);
4.在布局变化前后,调用viewWill/DidLayoutSubviews管理相关新闻;

Author

发表评论

电子邮件地址不会被公开。 必填项已用*标注