父子控件(控件可以内嵌其他控件,形参父子关系)

#import "ViewController.h"

@interface ViewController ()
@property (weak, nonatomic) IBOutlet UISwitch *customSw;
@property (weak, nonatomic) IBOutlet UIView *redView;
@property (weak, nonatomic) IBOutlet UIView *greenView;
@property (weak, nonatomic) IBOutlet UISegmentedControl *customSmt;

@end

@implementation ViewController

// 只要程序已启动就会调用该方法/ 和main函数一样, 该方法是由系统调用的
// 只要UI界面创建好了就会调用该方法
// 只要控制器对应的那个UIView属性对应的控件创建好了就会调用
- (void)viewDidLoad {
    [super viewDidLoad];

    // Do any additional setup after loading the view, typically from a nib.
    /*
    // 注意: 虽然在Storyboard中不能将某个控件添加到另一个控件中, 但是只要通过代码, 所以继承于UIView的控件都可以添加子控件
    UIButton *btn = [[UIButton alloc] init];
    btn.frame = CGRectMake(100, 100, 200, 300);
    btn.backgroundColor = [UIColor redColor];
    [self.view addSubview:btn];

    UILabel *lab = [[UILabel alloc] init];
    lab.text = @"abdc";
    lab.frame = CGRectMake(0, 0, 100, 100);
    lab.backgroundColor = [UIColor greenColor];
    [btn addSubview:lab];
     */
    /*
//    NSLog(@"redView = %@", self.redView);
    // superview是用于获取父控件
    // 谁调用superview, 那么获取的就是谁的父控件
//    NSLog(@"superView = %@", self.customSw.superview);

    // subviews是用于获取所有的子控件
    // 谁调用subviews, 那么就是获取谁的子控件
    NSLog(@"%@", self.redView.subviews);
    NSLog(@"--------------------");
    NSLog(@"%@", self.greenView.subviews);

    // 给redView打了一个标记, 将来就可以通过这个标记找到redView
//    self.redView.tag = 110;
//     NSLog(@"redView = %@", self.redView);
//    NSLog(@"greenView = %@", self.greenView);
    NSLog(@"customSmt = %@", self.customSmt);
  */
    /*
    //1.通过代码创建一个控件
    UISwitch *sw = [[UISwitch alloc] init];
    sw.tag = 998;
    // 2.将sw添加到控制器的view中
    // 谁掉用就会添加到谁里面
    [self.view addSubview:sw];
     */

    // 大部分UI控件是没有默认的尺寸的, 所以看不见UIButton
    UIButton *btn = [[UIButton alloc] init];
    btn.backgroundColor = [UIColor redColor];
    // frame是以父控件的左上角为0,0
//    btn.frame = CGRectMake(100, 100, 100, 100);
    // 注意:bounds是以自己的左上角为00, 所以一般情况下设置bounds的x/y无效

    // 了解: 默认情况下控件会用锚点来对其左上角, 锚点默认就是center的位置, 所以才导致了只看到了控件的一部分, 并没有完全展示
    // 一般情况使用bounds来修改尺寸
    btn.bounds = CGRectMake(0, 0, 100, 100);
    // 中心点就是控件宽高的交点, 宽高的一半的位置
    // 一般情况下使用center来修改位置
    btn.center = CGPointMake(200, 200);

    [self.view addSubview:btn];

//    UIView *customView = [[UIView alloc] init];
//    customView.backgroundColor = [UIColor purpleColor];
//    customView.frame = CGRectMake(0, 200, 300, 300);
//    [self.view addSubview:customView];

//    [customView addSubview:btn];

}

// touchesBegan方法可以监听用户触摸屏幕
- (void)touchesBegan:(nonnull NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event
{
    /*
    UIView *sw = [self.view viewWithTag:998];
    // 从父控件中移除
    // 谁调用就移除谁
    [sw removeFromSuperview];
     */

    // 注意:viewWithTag只能查找当前控件和当前控件的子控件, 不能查找兄弟控件, 或者父控件
//    UIView *res = [self.greenView viewWithTag:666];
    UIView *res = [self.redView viewWithTag:777];
    NSLog(@"res = %@", res);

}

- (IBAction)customBtnClick
{
    // 利用tag获取对应tag的值
    // viewWithTag会到调用该方法的view以及它所有的子控件中查找, 有没有标记是110的控件, 如果有就返回标记是110的控件, 如果没有就返回nil
//    UIView *res = [self.view viewWithTag:110];
    // 查找顺序: 1.先找自己 2.找子控件 3.找间接子控件(孙子..)
    UIView *res = [self.view viewWithTag:110];
    NSLog(@"res = %@", res);
}

/*
- (UIView *)customViewWithTag:(NSInteger)tag
{
    if (self.view.tag == tag) {
        return self.view;
    }

    for (UIView *subView in self.view.subviews) {
        if (subView.tag == tag) {
            return subView;
        }
        // 递归
    }
}
 */

@end
时间: 2024-12-25 19:54:13

父子控件(控件可以内嵌其他控件,形参父子关系)的相关文章

转载 [WPF][C#]在WPF中内嵌WindowsForm控件-使用WindowsFormsControlLibrary

[WPF][C#]在WPF中内嵌WindowsForm控件-使用WindowsFormsControlLibrary 在[WPF][C#]在WPF中内嵌WindowsForm控件一文中为各位介绍了直接在WPF中使用XAML来嵌入Windows Form控件的作法,不过不是每个人都喜欢写XAML,而且有时候会需要把已经存在的Windows Form应用程序嵌入到WPF中,所以这次就来跟大家介绍怎么使用参考dll档的方式,把dll中的Windows Form加到WPF中. 都说了要使用Windows

Essential ASP.NET MVC日历排程控件Essential Schedule for ASP.NET MVC 控件介绍及下载

Essential Schedule for ASP.NET MVC是一款界面控件,让开发人员添加OutLook外观的日历日程控件到你应用程序中,支持AJAX,内嵌多种皮肤,支持多种时间视图,支持打印等. 具体功能: 支持日程水平或垂直显示. 支持在运行时创建.读取.更新和删除任务活动 支持拖拉任务活动 支持设置任务活动的优先级 支持设置循环任务活动 支持为任务活动设置提示信息 控件为任务活动提供了右键菜单,以便客户更方便操作 支持Day View.Week View.Workweek View

关于MFC控件删除出现“具有该ID的控件已存在”这样的情况的解决方案,详细,网上都没有这么详细的,我是“深受其害”,所以想将详细的方法分享出去。

网上关于MFC控件删除出现“具有该ID的控件已存在”这样的情况,在网上找了很多关于这方面的东西,但是都不是很全,也不容易弄明白.现在问我直接通过一个项目和图片的形式和大家一块分享一个这个解决方法(如有不对,请相互学习,qq1035169610): 1.创建一个MFC的项目,这里仅限于演示,就把项目名字称为“lu”吧. 2.下面就是将button控件添加到图形界面框中.结果如下: 3.只要将控件拉入到图形界面中,在Resource.h这个文件中创建宏,如下图所示: 4.那么开始改控件的名字和ID.

多线程.NET条码读写控件自动检测条码的方位条形码控件VintaSoftBarcode

VintaSoftBarcode.NET Library 条形码控件是一个完美的条码读写.NET 库,支持从数码图片读取条码或者生成数码图片条码. 具体功能: 支持多线程 支持创建条码图片 支持为生成的条码指定大小和分辨率 拥有许多选项控制条码创建 支持从图片对象.图片文件.和PDF文档读取条码 编程环境:.NET 框架. 这是一个可完全操纵的.NET 库,保证在.NET 框架中实现快速工作. 能够识别图片中的所有条码. 确认已识别的条码类型. 返回条码的字符串值. 自动检测条码的方位. 返回条

背水一战 Windows 10 (54) - 控件(集合类): ItemsControl 的布局控件 - OrientedVirtualizingPanel, VirtualizingStackPanel, WrapGrid

[源码下载] 作者:webabcd 介绍背水一战 Windows 10 之 控件(集合类 - ItemsControl 的布局控件) OrientedVirtualizingPanel VirtualizingStackPanel WrapGrid 示例1.OrientedVirtualizingPanel(基类) 的示例Controls/CollectionControl/ItemsControlDemo/LayoutControl/OrientedVirtualizingPanelDemo.

将MenuStrip控件中的信息添加到TreeView控件中【转载】

本文详细介绍怎样将MenuStrip控件中的信息添加到TreeView控件中 首先在WinForm窗体中添加一个MenuStrip控件和TreeView控件,根据个人的爱好把控件布局好后.在窗体的加载事件中(根据自己的情况而定)添加如下的代码: /// <summary>   /// 窗体加载时事件   /// </summary>   /// <param name="sender"></param>   /// <param n

如果希望点击父控件子控件也响应的话, 可以给子控件加如下属性: ?android:duplicateParentState="true"

如果希望点击父控件子控件也响应的话, 可以给子控件加如下属性: android:duplicateParentState="true" 来自为知笔记(Wiz)

iOS_book 02 - 基本交互(约束、视图控制器、基本控件:按钮、文本框、分段控件、开关、标签、图像控件)

实现基本交互 MVC模式 Cocoa Touch 设计者们采用MVC(Model-View-Controller, 模型 - 视图 - 控制器)模式作为指导原则. MVC 模式把代码功能划分为3个不同的类别. 模型: 保存应用程序数据的类. 视图:包括窗口.控件以及其他一些用户可以看到并能与之交互的元素. 控制器:把模型和视图绑定在一起的代码,包括处理用户输入的应用程序逻辑. MVC的目标最大限度地分离这三类代码.MVC可以帮助确保代码的最大可重用性. 控制器组件通常有应用程序的具体类组成.控制

五种情况下会刷新控件状态(刷新所有子FWinControls的显示)——从DFM读取数据时、新增加子控件时、重新创建当前控件的句柄时、设置父控件时、显示状态被改变时

五种情况下会刷新控件状态(刷新控件状态才能刷新所有子FWinControls的显示): 在TWinControls.PaintControls中,对所有FWinControls只是重绘了边框,而没有整个重绘这些FWinControl子控件.那么什么时候才整个重绘全部FWinControls呢?这时候,就不是一个单纯的WM_PAINT来解决控件重绘的问题了,而是这个TWinControl.UpdateShowing函数: procedure TWinControl.UpdateShowing; v