从一开始——我的iOS学习之路

2018-06-07 开始我的控件之旅

2018-06-07  本文已影响3人  肠粉白粥_Hoben

一.UIImageView

1.导入图片

将文件夹内想要添加的图片拖动到图示位置,1x,2x,3x分别是原图和两张像素倍数为2、3倍的Retina高清版。


2.加入控件

3.属性介绍

在右侧工具栏我们可以看到UIImageView的一些属性。


  1. Opaque:告诉iOS当前视图的背后没有需要绘制的内容,同时允许iOS的绘图方法通过一些优化当前视图的绘制。
  2. Hidden:选中之后,用户就看不到该对象了。
  3. Clears Graphics Context:选中后,iOS会在实际绘制对象之前使用透明的黑色绘制被对象覆盖的所有区域。因为性能问题,这个选项基本不需要选中。
  4. Clip to Bounds:如果视图中包含子视图,并且这些子视图没有完全包含在其父视图的边界内,那么这个复选框的值可以决定子视图的绘制方式。如果选中了该选项,那么只有位于父视图边界内的子视图部分会绘制出来;如果不选中,那么子视图会被完全绘制出来,不管子视图是否超出了父视图的边界。但是因为计算裁剪区域是比较消耗资源的操作,所以一般默认为关闭,当然,需要的时候可以启用一下。

二.Text Field

1.相应的属性

在右侧工具栏我们可以看到Text Field的一些属性。


2.按下Done按钮之后的隐藏键盘


第一响应者即当前正在与用户进行交互的控件,因此,我们通知该控件放弃作为第一响应者的控制权,将其返还给用户之前的操作。

- (IBAction)textFieldDoneEditing:(id)sender {
    [sender resignFirstResponder];
}

3.触摸背景关闭键盘

UIControl是UIView的子类,因此,如果从UIView创建实例,更改为从UIControl类创建实例,则获得了触发操作方法的能力。首先我们创建一个点击背景需要调用的操作方法(隐藏TextField)

- (IBAction) backgroundTap:(id)sender
{
    [self.nameField resignFirstResponder];
    [self.numberField resignFirstResponder];
}

然后选中容器视图(注意是整个容器视图),将class类型改成UIControl。



最后,把TouchDown事件拖动到View Controller图标上面,选择我们的方法:backgroundTap,则可以达成我们的效果了。


三.滑动条

创建方法并将滑动条和该方法相关联:

- (IBAction)sliderChanged:(UISlider *)sender {
    //获得滑动条进度
    int progress = (int) lroundf(sender.value);
    //设置label显示的滑动条进度
    self.sliderLabel.text = [NSString stringWithFormat: @"%d", progress];
}

需要初始化我们的Label显示的进度:

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    self.sliderLabel.text = @"100";
}

四.Segment、Switch和Button

创建Segment并设置toogleControls方法,用于控制哪些控件应该显示。

- (IBAction)toggleControls:(UISegmentedControl *)sender {
    if (sender.selectedSegmentIndex == 0) {
        self.leftSwitch.hidden = NO;
        self.rightSwitch.hidden = NO;
        self.doSomethingButton.hidden = YES;
    }
    else {
        self.leftSwitch.hidden = YES;
        self.rightSwitch.hidden = YES;
        self.doSomethingButton.hidden = NO;
    }
}

设置两个Switch的开关方法,使它们的状态保存同步:

- (IBAction)switchChanged:(UISwitch *)sender {
    //设置一个开关的值会同时改变另一个开关的值
    BOOL setting = sender.isOn;
    [self.leftSwitch setOn: setting animated: YES];
    [self.rightSwitch setOn: setting animated: YES];
}

设置Button的背景为WhiteButton:



并设置相应的属性如下:



在这里科普一下iOS的控件状态:

五.操作表单和警告视图

它们均由UIAlertController创建,需要在preferredStyle设置UIAlertControllerStyleActionSheet(操作表单)/UIAlertControllerStyleAlert(警告视图)。

1.创建一个操作表单

UIAlertController *controller =
[UIAlertController alertControllerWithTitle: @"Are you sure?"
                                    message: nil
                            preferredStyle: UIAlertControllerStyleActionSheet];

设置两个UIAlertAction:yesAction和noAction。

UIAlertAction *yesAction =
[UIAlertAction actionWithTitle: @"Yes, I'm sure!"
                        style: UIAlertActionStyleDestructive
                       handler: ^(UIAlertAction *action) {
  //后续操作
}
UIAlertAction *noAction = [UIAlertAction actionWithTitle: @"No way!"
                                                   style: UIAlertActionStyleCancel
                                                 handler: nil];

其中,对于每个按钮来说,都有三种style:

往UIAlertController中添加这两种Action:

[controller addAction: yesAction];
[controller addAction: noAction];

为了让警告视图或操作表单显示出来,需要让当前视图控制器来展示警告控制器。

UIPopoverPresentationController *ppc = controller.popoverPresentationController;
if (ppc != nil) {
    ppc.sourceView = sender;
    ppc.sourceRect = sender.bounds;
}
[self presentViewController: controller
                   animated:YES
                 completion:nil];

通过获取到警告控制器的悬浮展示控制器,并设置它的sourceView和sourceRect属性来设定操作表单会出现的位置。

最后调用presentViewController的方法,将警告控制器作为展示的控制器以显示操作表单。在展示视图控制器时,被展示的视图会暂时取代展示它的视图控制器的视图。

对于警告控制器,操作表单或警告视图会部分覆盖展示它们的视图控制器的视图,而视图的剩余部分会被阴影覆盖。

设置完之后,可以看到效果如下:


2.创建一个警告视图

在上面的操作中,我们留了一个坑:在点击了确认按钮之后有个TODO,在这里,我们的TODO就是显示一个警告视图。

NSString *msg;
if ([self.nameField.text length] > 0) {
    msg = [NSString stringWithFormat: @"%@, Everything is OK.", self.nameField.text];
}
else {
    msg = [NSString stringWithFormat: @"Everything is OK."];
}
UIAlertController *controller2 = [UIAlertController
                                  alertControllerWithTitle: @"Something was done!"
                                  message: msg
                                  preferredStyle: UIAlertControllerStyleAlert];
UIAlertAction *cancelAction = [UIAlertAction actionWithTitle: @"Phew!"
                                                       style: UIAlertActionStyleCancel
                                                     handler: nil];
[controller2 addAction: cancelAction];
[self presentViewController: controller2
                   animated:YES
                 completion:nil];

很类似地,我们首先声明一个UIAlertController并设置preferredStyle为UIAlertControllerStyleAlert,说明这是一个警告视图类型的控制器。

然后,我们设置一个UIAlertAction,在这里只需设一个cancelAction即可,声明title和style后,将Action添加到Controller里面去。

最后调用presentViewController方法,使得AlertController能够在主视图中显示出来。


踩过的坑

  1. 当调整进度条的时候,由于数值位数的改变,按钮也会随着移动。



    这是因为数值Label的宽度没有固定好,而Label和Switch之间有个约束,因此他们会产生相对移动。
    解决方法:勾选Label的Width和Height选项,代表这个控件大小已经固定。


  2. 模拟器的键盘调不出来


上一篇下一篇

猜你喜欢

热点阅读