iOS 分类:按顺序添加视图

一, 场景:

  1. 在一个父视图上添加多个子视图的情况下, 有可能出现添加视图的时机有先后的问题, 后来的视图会遮盖住先来的视图.
  2. 可以在添加子视图的时候, 获取需要展示的优先级大小..优先级越高, 就在已有视图更外层显示.

二, 分类方法代码如下:

1 // UIView+addsubview.h
2
3 @interface UIView (addsubview)
4 @property (nonatomic,assign) NSInteger sort;
5 - (void)addsubviewBysort:(UIView *)newView ;
6
7 @end
 1 //UIView+addsubview.m
 2
 3 #import "UIView+addsubview.h"
 4 #import <objc/runtime.h>
 5 @implementation UIView (addsubview)
 6 - (void)setSort:(NSInteger)sort{
 7     objc_setAssociatedObject(self, @selector(setSort:), @(sort), OBJC_ASSOCIATION_ASSIGN);
 8 }
 9
10 - (NSInteger)sort{
11     NSNumber *num = objc_getAssociatedObject(self, @selector(setSort:));
12     return num.integerValue;
13 }
14
15 - (void)addsubviewBysort:(UIView *)newView {
16     BOOL bInsert = NO;
17     for (NSInteger i = self.subviews.count - 1; i >= 0  ; i--) {
18         UIView *subview = [self.subviews objectAtIndex:i];
19         if (subview.sort <= newView.sort) {
20             bInsert = YES;
21             NSLog(@"lz--insert->%li---on:%li",(long)newView.sort,(long)subview.sort);
22             [self insertSubview:newView aboveSubview:subview ];
23             break;
24         }
25     }
26     if (bInsert == NO) {
27         NSLog(@"lz--below all->%li",(long)newView.sort);
28         [self insertSubview:newView atIndex:0];
29     }
30 }
31
32 - (NSInteger)getMaxSort{
33     NSInteger maxSort = 0;
34     for (UIView *subview in self.subviews) {
35         if (maxSort < subview.sort) {
36             maxSort = subview.sort;
37         }
38     }
39     return maxSort;
40 }
41 @end

三, 调用方式代码如下:

 1 - (void)test{
 2     for (int i = 100; i > 0; i--) {
 3         dispatch_async(dispatch_get_main_queue(), ^{
 4             UIView *view = [UIView new];
 5             view.sort = arc4random()%100;
 6             [self.view addsubviewBysort:view];
 7         });
 8     }
 9
10
11     dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
12         for (UIView *subview in self.view.subviews) {
13             NSLog(@"lz-->%li",(long)subview.sort);
14         }
15     });
16
17 }

原文地址:https://www.cnblogs.com/lz465350/p/10238241.html

时间: 2024-11-09 08:39:55

iOS 分类:按顺序添加视图的相关文章

Xamarin iOS开发实战上册-----2.2.2 使用代码添加视图

Xamarin iOS开发实战上册-----2.2.2  使用代码添加视图 如果开发者想要使用代码为主视图添加视图,该怎么办呢.以下将为开发者解决这一问题.要使用代码为主视图添加视图需要实现3个步骤. 1.实例化视图对象 每一个视图都是一个特定的类.在C#中,经常会说,类是一个抽象的概念,而非具体的事物,所以要将类进行实例化.实例化一个视图对象的具体语法如下: 视图类 对象名=new 视图类(); 以我们接触的第一个视图View为例,它的实例化对象如下: UIView vv=new UIView

iOS 11开发教程(十四)iOS11应用代码添加视图

iOS 11开发教程(十四)iOS11应用代码添加视图 如果开发者想要使用代码为主视图添加视图,该怎么办呢.以下将为开发者解决这一问题.要使用代码为主视图添加视图需要实现3个步骤. (1)实例化视图对象 每一个视图都是一个特定的类.在Swift中,经常会说,类是一个抽象的概念,而非具体的事物,所以要将类进行实例化.实例化一个视图对象的具体语法如下: let/var 对象名=视图类() 以我们接触的第一个视图View为例,它的实例化对象如下: let newView=UIView() 其中,UIV

iOS开发之窗口和视图

视图就是应用程序的界面.视图可以使用nib文件实现,也可以使用代码创建.一个视图也是一个响应器(UIResponder的子类)这意味着一个视图可以与用户交互.因此,视图不只是用户可看到的界面,也是可以和用户交互的界面. 视图相关结构的名称.属性和功能 CGPoint   {x,y}  坐标信息  视图所在的坐标信息 CGSize     {width,height}   宽度和高度  视图所在的大小信息 CGRect    {origin,size}  CGPoint和CGSize的综合 视图所

iOS开发项目-02添加子控制器以及项目分层

iOS开发项目-02添加子控制器以及项目分层 一.添加子控制器 1.设置根控制器(自定义) 说明:分析新浪微博应用,观察其整体建构层次.而系统的控制器不能满足项目开发的需求,这里把项目中原有的控制器删除. 自己定义一个TabBarViewController类.让这个类作为window窗口的根控制器. YYAppDelegate.m文件代码: 1 #import "YYAppDelegate.h" 2 #import "YYTabBarViewController.h&quo

iOS 分类和继承

iOS 中分类(Categories) 和 继承(Inherit)有相同的功能,但在一些细节上又有差异,简单介绍一下两者的异同. 分类可以在不知道系统类源代码的情况下,为这个类添加新的方法.分类只能用来添加方法,不能添加成员变量.通过分类增加的方法,系统会认为是该类类型的一部分.比如: 1 #import <UIKit/UIKit.h> 2 3 @interface UIImage (WB) 4 5 /** 6 * 返回一张自由拉伸的图片 7 */ 8 + (UIImage *)resized

MVC中添加视图

可以在视图文件夹中手动创建一个视图文件,一般都是在控制器中的操作方法中鼠标右键,然后选择添加视图或者转到视图,如果选择添加视图的话就会创建一个跟当前操作方法一样名字的视图,如图: 模板中有一些,模板可以选择,会根据选择的模型自动生成一些相关的HTML代码,其实也没什么用.下方三个选择框,第一个是说明创建的是一个部门视图,跟部分类差不多的道理.如果选择了引用脚本库的话,IDE会自动的帮你在页面中引用的三方的类库等样式文件,如果选择的是使用布局页,说明此页面是否引用布局,还是成为一个完全独立的视图.

iOS分类底层实现原理小记

http://www.jianshu.com/p/b7169a5a558e OS 分类底层是怎么实现的?本文将分如下四个模块进行探究 分类的结构体 编译时的分类 分类的加载 总结 本文使用的runtime源码版本是 objc4 - 680文中类与分类代码如下 //类 @interface Person : NSObject @property (nonatomic ,copy) NSString *presonName; @end @implementation Person - (void)d

iOS分类、延展和子类的区别

iOS分类.延展和子类的区别 类别.延展.子类的区别   类别 延展 子类 功能 为类添加方法,不用知道类的源码,添加变量(通过运行时,具体参考下面注解) 为类添加私有变量和私有方法,在类的源文件中书写,所以知道类的源代码 即能为类添加方法又能添加变量 特点 添加的方法称为类的一部分,可以被子类继承 添加的变量和方法只有这个类内部访问,正常情况下外边不能访问(可以通过运行时,见注解),不能被子类继承 新添加的变量和方法只能子类才能具有,父类不具有 使用 使用原始类的对象(调用-方法)或者类(调用

iOS开发项目—04添加导航栏的按钮

iOS开发项目—04添加导航栏的按钮 一.设置导航栏的按钮 要求实现的效果:             说明:默认状态下和高亮状态下的图片是不一样的. 按钮的图片需要设置默认状态和高亮状态时的显示,系统了提供的下面方法 viewController.navigationItem.leftBarButtonItem=[UIBarButtonItem alloc]initWithImage:<#(UIImage *)#> style:<#(UIBarButtonItemStyle)#>