zoukankan      html  css  js  c++  java
  • (一)UI设计的一些常识

    一、概述
    新版本的Xcode似乎框架不明示。

    UIView:屏幕上看得见摸得着的东西。视图、控件、组件。
    UIView是一个容器,能容纳其他UIView。

    UIViewController用来控制UIView。

    按钮事件的绑定:
    手写代码的方法:
    1.右键单击按钮,选择touch up Inside。
    2.要绑定的方法返回值设置为IBAction。
    3.二者进行连线。

    注意:UI控件用nonatomic、weak。

    控件要加上IBOutlet(property后)才能连线。

    总结:
    @IBAction:保证控件能连线,实际等于void。
    @IBOutlet:保证属性可以连线。

    连线方法:默认就是Touch up inside方式,因此可以直接右键拖。
    按住CTRL或者按住右键拖动过去也可以。

    直接从storyboard连线:
    右键点击相应的View,然后直接连线到弹出框。


    更改storyboard的方法:修改General中的Main Interface


    解决模拟器键盘不弹出的问题:


    Command+Shift+H是模拟器的Home键

    二.一些常识

    Bundle Identifier:app的唯一标识。相同覆盖。

    规定Bundle Identifier与公司有关,将公司域名反写,再加上app名称。

    注意:中文名称会变为中划线(-)。

    响应者:
    第一响应者:叫出键盘的控件。
    resign表示辞职
    resignFirstResponder 不再作为第一响应者,则键盘退出。

    多个控件分别调用这个方法比较麻烦。

    更简单的方式:前提是键盘是view内的控件调出的(view内存在第一响应者)。
    [self.view endEditing:YES];

    常见错误:
    [setValue:forUnderfinedKey] ...是连线错误(可能有绑定的@property被注释了,也可能有已经连线的控件,但是生成的代码被删除了)。

    Xcode建议把属性都放到.m文件中。可以注意到一个细节,在.m的@implementation上面有一个@interface(类扩展,私有扩展)。

    @interface ViewController ()


    @end


    注意小括号内不能放任何内容,在其内部写声明,可以封装起来内容不要给外界使用。

    可以保证封装性。

    @interface ViewController ()


    - (IBAction)compute;


    @property (nonatomic,weakIBOutlet UITextField *num1;

    @property (nonatomic,weakIBOutlet UITextField *num2;


    @property (nonatomic,weakIBOutlet UILabel *result;


    @end


    三.常见的控件属性

    IOS坐标系,左上角是坐标原点,横x竖y。

    CGRect frame 控件的矩形框在父控件中的位置和尺寸。

    CGRect有origin和size两个属性。

    左侧的列表可以反映加入顺序,后面的可以覆盖前面的。

    CGRect bounds以自己左上角为原点,一般尺寸和frame相同,x、y一般为0。

    CGPoint center以父控件左上角为坐标原点,控件中点的位置。

    四.按钮的使用

    按钮支持背景图片与内容图片。

    1.按钮的状态:
    normal        默认状态
    highlighted 按下去并且手指还未松开
    disabled     不可用状态

    按钮的状态对应的文字与内容

    首先设置Type为Custom,然后分别对不同的State Config来设定下面的内容。

    2.设定frame
    !OC不允许直接修改对象结构体属性的成员(例如frame.origin.y不能直接修改)。
    但是允许直接修改对象的结构体属性。
    一般的做法是先把结构体保存成temp,修改后再赋回去。
    三部曲:取出、修改,送回。

    CGRect tempFrame = self.head.frame;

    tempFrame.origin.y -= 10;

    self.head.frame = tempFrame;


    通过frame既可以改位置,又可以改大小。


    3.查错:

    先在相应的方法里加断点,看有没有进入。

    其次可以用NSLog。


    打印结构体:NSStringFromCGRect();


    发现不能改变图片大小:AutoLayout影响的。



    代码的优化:例如上下左右四个按钮用一个方法实现。

    多个按钮可以拖到同一个IBAction上面。

    !当按钮对应的方法有参数时,会把被点击的按钮当做参数传入,例如是按钮,要传入UIButton *

    注意修改IBAction后要重新连线。


    标识不同的sender,绑定不同的tag。


    输入一个数值Tag。


    修改控件位置:修改frame与center。


    3.设定center

    center是CGPoint,可以修改位置。


    4.设定bounds

    bounds以自己的左上角为坐标原点,但是可以改尺寸。

    bounds修改尺寸中心不动,但是frame改尺寸左上角不动。


    总结:

    frame:修改位置和尺寸(左上角不动)

    center:修改位置

    bounds:修改尺寸(中心不动)


    5.通过代码创建按钮

    viewDidLoad方法,在控制器和View被创建完毕后会调用。


    创建->加入->改参数

    UIButton *btn = [[UIButton allocinit];

    [self.view addSubview:btn];

    btn.frame = CGRectMake(100100100100);

    UIImage *imgNormal = [UIImage imageNamed:@"btn_01"];

    UIImage *imgHighlighted = [UIImage imageNamed:@"btn_02"];

    [btn setBackgroundImage:imgNormal forState:UIControlStateNormal];

    [btn setBackgroundImage:imgHighlighted forState:UIControlStateHighlighted];

    [btn setTitle:@"点我啊" forState:UIControlStateNormal];

    [btn setTitle:@"点我干啥" forState:UIControlStateHighlighted];

    [btn setTitleColor:[UIColor redColorforState:UIControlStateNormal];

    [btn setTitleColor:[UIColor blueColorforState:UIControlStateHighlighted];


    创建自定义代码的另一种方法:在storyboard中设置后会转为相应的代码。

    使用的是buttonWithType类方法创建。


    storyboard能办到的东西,代码都能办到。


    修改系统默认的按钮类型:



    使用代码设置按钮类型:

    UIButton *btnInfo = [UIButton buttonWithType:UIButtonTypeRoundedRect];


    系统自带的不必设置尺寸。用center来改位置。


    通过代码来监听按钮事件:

    Target代表的是当前View,这里的self就是当前View。

    注意action要包装在@section内。

    [btn addTarget:self action:@selector(btnClick:) forControlEvents:UIControlEventTouchUpInside];

    - (void)btnClick:(UIButton *)button{

        NSLog(@"clich the button %@",button);

    }




    五.头尾动画

    需求:控件移动时加上缓慢的动画效果。

    只需要告诉系统哪个参数需要慢慢的变。
    头尾法(标识出动画应用的范围):

    [UIView beginAnimations:nil context:nil];

    [UIView setAnimationDuration:0.5]; //默认是0.25秒一帧。

    [UIView commitAnimations];



    bounds为了保证center不变,有一个挪动。


    IOS常见的属性改变(如背景变色)都可以使用系统的动画,复杂动画需要自己实现。


    补充一些控件和属性


    文本框的placeholder(占位文字)类似Android的hint(提示),可以在无输入时进行提示。

    密码框:勾选Secure Text Entry 

    文本框右侧的清空按钮:属性面板更改Clear Button的选项为Appears while ......
    右键拖入也可以连线。并且与手写是一样的效果,注意左边的圈可以观察是否连线正常。

    Action可以有sender和event两个参数,event参数包含了点击时刻和位置等信息。

    Transform的使用:动画常用
    能改位置、尺寸、旋转角度

    使用Transform实现平移:

    self.head.transform = CGAffineTransformMakeTranslation(deltaX, deltaY);

    注意的是形变属性只允许有一种状态。这是在原来的基础上的改变,多次实施依然deltaX=-100。

    解决方法是将deltaX叠加。


    最有解决方案:在一个transform基础上生成新的。

    self.head.transform = CGAffineTransformTranslate(self.head.transform0, -50);

    旋转:注意是弧度制的旋转。

    self.head.transform = CGAffineTransformRotate(self.head.transformM_PI_4);

    缩放:填写的是x方向与y方向的缩放比例。

    self.head.transform = CGAffineTransformScale(self.head.transform1.21.2);


    特殊场合用transform,平时可用center、frame、bounds。


    UIImage的使用

    self.xxximgView.image = [UIImage imageNamed:@“…”];


    禁用控件:

    btn.enabled = NO;

    Disable默认是变灰,也可以修改图片。


    试着去精简自己的代码。


    除去对象以外的内容用strong。


    数据的处理方式:

    先把一个数据组写成字典(NSMutabeDictionary可以用[ ]索引来创建键值对)。

    然后把字典放入数组。

    使用的时候先取出字典,然后使用。


    对于key,为了防止前后不一致,可以用#define写宏

    有的公司以k开头有的公司以公司前缀开头。


    get方法里面千万不要用self,会产生死循环。


    延迟加载(懒加载):保证性能,将属性放到get方法中初始化。

    用到的功能在使用时加载,例如有些数据只有查看时才将相应的数据初始化。

    可以通过重写相应的get方法,注意在get方法用 _xxx == nil来判断是否加载过,千万不要用self,会死循环。







  • 相关阅读:
    Fiddler 只看指定URL请求
    WTM框之—调整默认的删除方法
    WTM框之—调整grid的每页显示行数
    WTM框之—数据列表上添加按钮的学习记录
    Armbian欢迎信息系统状态脚本
    Shell中的${xxx%% *}字符串分割方法
    强制SSH使用密钥认证禁止密码登录
    Linux开机自动挂载外接存储
    mysql实现name姓名多个相同的数据只取一条
    git 常用命令备忘录
  • 原文地址:https://www.cnblogs.com/aiwz/p/6154252.html
Copyright © 2011-2022 走看看