iOS入门-基础控件总结(一)

新建singleViewApplication以后,系统自动创建一个UIViewController,用于控制当前界面。

UIViewController包括以下几个成员变量:

@interface UIViewController : UIResponder  {
    @package
    UIView           *_view;
    UITabBarItem     *_tabBarItem;
    UINavigationItem *_navigationItem;
    NSArray          *_toolbarItems;
    NSString         *_title;

暂时用到的只有_view属性,它表示一个满屏的空白视图。我们可以在图层上添加各种各样的控件,这些控件大都(还是全部?)继承自UIView。

——————————————————————————————————————————————————————————————————

UIVIew

UIView在图形方面有以下几个重要属性:

1.frame        设置视图的左上角坐标、长度、宽度。

2.bounds     设置视图的宽高。

3.center       设置视图的中点坐标。

4.transform  形变属性(不太熟),记录UIView的形变,如伸缩转角等。

@interface UIView(UIViewGeometry)

// animatable. do not use frame if view is transformed since it will not correctly reflect 
// the actual location of the view. use bounds + center instead.
@property(nonatomic) CGRect            frame;

// use bounds/center and not frame if non-identity transform. if bounds dimension is odd, center may be have fractional part
@property(nonatomic) CGRect            bounds;      // default bounds is zero origin, frame size. animatable
@property(nonatomic) CGPoint           center;      // center is center of frame. animatable
@property(nonatomic) CGAffineTransform transform;   // default is CGAffineTransformIdentity. animatable
@property(nonatomic) CGFloat           contentScaleFactor NS_AVAILABLE_IOS(4_0);

@property(nonatomic,getter=isMultipleTouchEnabled) BOOL multipleTouchEnabled;   // default is NO
@property(nonatomic,getter=isExclusiveTouch) BOOL       exclusiveTouch;         // default is NO


UIView在层次方面有以下几个重要属性:

@interface UIView(UIViewHierarchy)

@property(nonatomic,readonly) UIView       *superview;
@property(nonatomic,readonly,copy) NSArray *subviews;
@property(nonatomic,readonly) UIWindow     *window;

1.superview    父视图

2.subviews     子视图

3.window        窗口(归属于哪个窗口,我猜)

window类下有UIViewController属性,估计是项目生成时首先创建Window,再指定根页面的UIViewController,UIViewController下有UIView。

UIView的window属性估计就是指从属于哪个窗口。

——————————————————————————————————————————————————————————————————

子控件的创建流程(button为例)

    // 为按钮分配内存空间
    UIButton *btn = [[UIButton alloc]init];
    // 设置坐标位置
    btn.frame = CGRectMake(0, 0, 100, 100);
    // 设置其他属性(以背景颜色为例)
    btn.backgroundColor = [UIColor blueColor];
    // 添加目标
    [btn addTarget:self action:@selector(btnClick) forControlEvents:UIControlEventTouchUpInside];
    // 加入View(以根视图的UIView为例)
    [self.view addSubview:btn];

添加目标的意思是将控件关联的某一个控制器。

如上例,将Target设置为self,表示添加到当前的UIViewController,当按钮发生TouchUpInside事件,系统会调用UIViewController的btnClick方法来处理。

当需要返回该按钮的一些信息时,如按键的位置,如Tag,一般会给方法添加一个参数,如

-(void)btnClick:(UIButton*)sender;

这样当按键按下时,会调用btnClick:方法,并且把按键本身作为一个参数传进来。(至于为什么传的就是那个被按的按键,我不懂,再添加多几个参数行不行?)

消息机制实质:button大喊:发生大事啦(事件TouchUpInside),那个谁(指定控制器self),帮忙干点活(调用方法btnClick)

——————————————————————————————————————————————————————————————————

动画

添加动画,将需要缓慢变化的操作放在以下两句之间即可。

[UIView beginAnimations:nil context:nil];

// 说好的动画呢?

[UIView commitAnimations];    

其实下面这个方法比较实用:

[UIView animateWithDuration:<#(NSTimeInterval)#> animations:<#^(void)animations#>];

传入时间和需要变成动画的代码块,就可以美美的享受动画,一般人我不会告诉他。

这里有个小陷阱

[UIView animateWithDuration:<#(NSTimeInterval)#> animations:<#^(void)animations#>];
i++;
在动画完成之前,i++已经被执行,至于这个方法的实现机制是怎样的,还弄不清楚。

确实要在动画完成后再干点什么的,可以用以下方法:

[UIView animateWithDuration:<#(NSTimeInterval)#> animations:<#^(void)animations#> completion:<#^(BOOL finished)completion#>];
在completion:传入动画完成后需要执行的代码块,乔布斯保证绝对是动画结束后才执行。

以下是一些UIView的基本动画:

    // 通过矩阵来形变
    btn.transform = CGAffineTransformMake(<#CGFloat a#>, <#CGFloat b#>, <#CGFloat c#>, <#CGFloat d#>, <#CGFloat tx#>, <#CGFloat ty#>);
    // 旋转角度
    btn.transform = CGAffineTransformMakeRotation(<#CGFloat angle#>);
    // 缩放
    btn.transform = CGAffineTransformMakeScale(<#CGFloat sx#>, <#CGFloat sy#>);
    // 不知道作用,呆会试试,先写完播客哈
    btn.transform = CGAffineTransformMakeTranslation(<#CGFloat tx#>, <#CGFloat ty#>);
    
    // 传入形变属性t,在t的基础上再旋转一个角度
    btn.transform = CGAffineTransformRotate(<#CGAffineTransform t#>, <#CGFloat angle#>);
    // 传入形变属性t,在t的基础上再缩放
    btn.transform = CGAffineTransformScale(<#CGAffineTransform t#>, <#CGFloat sx#>, <#CGFloat sy#>);
    //
    btn.transform = CGAffineTransformTranslate(<#CGAffineTransform t#>, <#CGFloat tx#>, <#CGFloat ty#>);


时间有点晚,明天再继续总结吧。

在培训班这几天,确实有点感慨。

身边太多零基础的同学,他们可能是因为广告而被吸引到这里,简单的认为混四个月培训班出去就能有万元高薪。

其中有一些未出校门的学生,也有不少在社会上闯荡一段时间深感前途渺茫的朋友。(我算其中之一,工作一年转行)

到底培训结束后,大家拿到怎样一张成绩单,现在还很难说。


有时候会有一种恐惧,简单的几个月,就能从零基础变成软件工程师,那科班出生的大学生,优势在哪里?

但仔细想想,又觉得不失公平。

四个月的拼搏,有时候真能顶替四年的混沌。

但四个月的混沌,终究比不过四年的混沌。

世界变化太快,快到我只能不断的选择,选最有前景的行业,最有价值的技术,但只是一直在选择。

静不下来,终究成不了事。

cocos跨平台了,HTML5据说也能结束浏览器之争了。

HTML5+CCS3+微信,基本可以取代相当一部分APP了吧?

那我这个时候才学iOS开发,又不能跨平台,有啥用呢?

一个朋友也质疑过,这么转行从零开始做iOS开发,是否有点不妥?

可能吧,但坚持下来,看看成效吧,再不济,起码学会了坚持。


今天第一次写技术博客,也第一次上传自己录制的视频(只有6分多钟,视频笔记),有点小兴奋。

就先到这吧,凌晨1:42。







你可能感兴趣的:(ios,ios开发)