开发者社区> 问答> 正文

怎样使用代码创建UI界面

怎样使用代码创建UI界面

展开
收起
杨冬芳 2016-06-30 11:22:04 2446 0
1 条回答
写回答
取消 提交回答
  • IT从业

    更实际的情况是,在程序运行开始时,程序已经具有一个初始的程序界面(初始界面可能只包含一个UIView),在程序运行过程中,程序需要根据用户交互来动态添加、删除UI控件。

    在这种需求下,我们可以通过Interface Builder来设计程序的初始界面;接下来在程序运行过程中,可以通过代码创建UI控件,再将UI控件添加到相应的父控件中即可。

    实例:动态添加、删除标签

    首先创建一个iOS的Single View Application应用,创建完成后,该应用将自带一个Main.storyboard界面设计文件,但我们并不打算修改该界面设计文件,而是直接在程序代码中创建整个UI界面,程序只使用该界面文件中的UIView作为容器即可。

    接下来修改控制器类,在控制器类的实现部分创建整个程序界面,绑定事件处理方法。下面是控制类的实现部分代码。

    程序清单:codes/09/9.5/DynaLabel/DynaLabel/FKViewController.m

    
    #import "FKViewController.h"
    // 定义FKViewController的扩展
    @interface FKViewController ()
    // 定义一个属性来记录所有动态添加的UILabel控件
    @property (nonatomic, strong) NSMutableArray* labels;
    @end
     
    @implementation FKViewController
    // 定义一个变量来记录下一个将要添加的UILabel的位置
    int nextY = 80;
    - (void)viewDidLoad
    {
        [super viewDidLoad];
        // 设置该view的背景色
        self.view.backgroundColor = [UIColor grayColor];
        // 初始化labels数组
        self.labels = [NSMutableArray array];
        // 创建UIButtonTypeRoundedRect类型的UIButton对象
        UIButton* addBn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
        // 设置addBn的大小和位置
        addBn.frame = CGRectMake(30, 30, 60, 40);
        // 为UIButton设置按钮文本
        [addBn setTitle:@"添加"
            forState:UIControlStateNormal];
        // 为addBn的Touch Up Inside事件绑定事件处理方法
        [addBn addTarget:self action:@selector(add:)
            forControlEvents:UIControlEventTouchUpInside];
        // 创建UIButtonTypeRoundedRect类型的UIButton对象
        UIButton* removeBn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
        // 设置removeBn的大小和位置 
        removeBn.frame = CGRectMake(230, 30, 60, 40);
        // 为UIButton设置按钮文本  
        [removeBn setTitle:@"删除"
            forState:UIControlStateNormal];
        // 为removeBn的Touch Up Inside事件绑定事件处理方法  
        [removeBn addTarget:self action:@selector(remove:) 
            forControlEvents:UIControlEventTouchUpInside];
        [self.view addSubview:addBn];
        [self.view addSubview:removeBn];
    }
    - (void)add:(id)sender {
        // 创建一个UILabel控件
        UILabel* label = [[UILabel alloc] initWithFrame:
            CGRectMake(80, nextY, 160, 30)];
        label.text = @"疯狂iOS讲义";  // 设置该UILabel显示的文本
        [self.labels addObject: label];  // 将该UILabel添加到labels数组中
        [self.view addSubview:label];  // 将UILabel控件添加到view父控件内
        nextY += 50;  // 控制nextY的值加50
    }
    - (void)remove:(id)sender {
        // 如果labels数组中元素个数大于0,表明有UILabel可删除
        if([self.labels count] > 0)
        {
            // 将最后一个UILabel从界面上删除
            [[self.labels lastObject] removeFromSuperview];
            [self.labels removeLastObject];  // 从labels数组中删除最后一个元素
            nextY -= 50;  // 控制nextY的值减50
        }
    }
    @end
     

    上面的代码中,第一段粗体字代码创建了应用的初始界面,该初始界面只包含两个按钮,并且程序还为这两个按钮绑定了事件处理方法。
    提示:

    上面程序中多次使用了CGRectMake()函数,该函数专门用于创建一个CGRect对象。当使用代码来创建UI控件时,总需要控制UI控件的大小和位置,通常都会用CGRect结构体,它代表一个矩形区的大小和位置。CGRect结构体包括origin、size两个成员,其中origin又是CGPoint类型的一个结构体,它包括x、y两个成员,代表该矩形区左上角的位置;size又是CGSize类型的一个结构体,它包括width、height两个成员,代表该矩形区的宽度和高度。正如CGRectMake()函数可返回一个CGRect结构体一样,CGPointMake(x,y)可返回一个CGPoint结构体,CGSizeMake(width,height)可返回一个CGSize对结构体。

    该应用的关键就是实现add:和remove:两个方法,其中add:方法中粗体字代码负责创建一个UILabel控件(每次创建的UILabel的Y坐标并不相同),并将这个UILabel控件添加到该控制器关联的UIView内。这样即可实现每次用户触碰该按钮,程序界面就会添加一个UILabel控件;而remove:方法中粗体字代码则负责把labels数组的最后一个元素(UILabel控件)从父控件中删除,并从该数组中删除该元素。

    通过上面的程序,即可实现通过用户交互来动态添加、删除程序界面控件。编译、运行该程序,并多次触碰添加、删除按钮后,可能看到如图9.37所示的动态界面。
    ![Uploading screenshot . . .]()

    2019-07-17 19:49:25
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
使用TensorFlow搭建智能开发系统自劢生成App UI代码 立即下载
Fusion Design - 企业级UI解决方案揭秘 立即下载
使用TensorFlow搭建智能开发系统自动生成App UI 立即下载