IOS 自动布局-UIStackPanel和UIGridPanel

我以前是做windows phone开发的,后来转做IOS的开发,因此很多windows phone上面的开发经验也被我带到了IOS中。其实有些经验本身跟平台无关,跟平台有关的无非就是实现方法而已。好了,废话不多说。

我今天给大家介绍一个IOS自动华布局的辅助类(UIPanel   UIStackPanel  UIGridPanel),做过windows phone开发的同学看到这三个类肯定很眼熟,没错,这三个类正是windows phone布局的核心,只是名称稍微有点不一样而已。

我先介绍下我开发这个类库的背景,有助于大家理解我为什么要这么做。

在IOS上开发程序的界面目前有三种方式,第一种纯代码开发,第二种使用XIB开发,第三种是使用storyboard开发。先不说哪种方式好吧,三种方式各有优劣,我本身开发是倾向于纯代码开发的,因为我一开是学IOS的时候使用XIB做的,有可能是我对XIB不是很熟练,XIB跟windows phone的界面开发两项一比较,我实在没有兴趣继续使用XIB来开了,storyboard是后来才出的一种技术,所以我一开始几乎就是一直采用纯代码的方式来开发IOS的界面。

纯代码的方式在固定分辨率下开发还是不错的选择,但是遇到可以旋转界面或者要适配ipad那就有点力不从心了。对于这个问题,在苹果还没推出autolayout这个技术之前基本没办法。但是苹果从IOS6.0开始引入了autolayout的技术,自从这个技术的引入使用xib来开发界面就变得相对比较方便了,如果还是用纯代码来做autolayout就显得无比的蛋疼了,当然熟悉以后还是很好用的啦(但是看着一堆的约束信息就显得郁闷了)。

最近在考虑这个问题的时候灵机一动,突然想到能否参考windows phone上面的布局方式呢,既然IOS6.0已经加入了autolayout技术,那么我是否可以使用autolayout技术开发一个类似windows phone中的stackpanle和gridview 那样的控件呢,想到就干。花了几天时间的研究还真被我研究出来了。这就是我前面提到的(UIPanel   UIStackPanel  UIGridPanel)三个类。

我先介绍下这三个类的使用方法

  • UIPanel,UIPanel是所有其他派生panel的基类。添加到其中的subview的大小都跟uipanel的大小一样。
  • UIStackPanel,UIStackPanel继承UIPanel,UIStackPanel有一个属性isHorizontal,就是subviews的排列是否是水平排列,默认是垂直自上而下的排列,添加到UIStackPanel中的subview如果是垂直排序,那么subview的宽度跟UIStackPanel的宽度一样,高度通过UIView的扩展属性size来控制。反之如果是水平排列,那么subview的高度跟UIStackPanel的高度一样,宽度通过UIView的扩展属性size来控制。
  • UIGridPanel,UIGridPanel继承UIPanel,UIGridPanel类似表格,有rows和colums的两个属性,可以指定subview的row和colum的扩展属性来实现详细的排列,甚至可以通过subview的rowSpan和columSpan两个扩展属性实现跨多列或多行布局。

下面先放两张竖屏和横屏的对比截图

上面是竖屏的。

上图是横屏的

上面的截图中除了黑色的是uilable和一个clicke me的一个按钮以外,其他每种颜色代表一个uipanel,panel里面嵌套其他的panel就组成了如上图的布局界面。点击按钮以后还能看到随着属性的改变,布局的方式也会改变。

下面我以代码的形式介绍各个panel的用法。

  • 首先是gridpanel。
    gridPanel=[[UIGridPanel alloc] init];
    gridPanel.rows=3;
    gridPanel.colums=3;
    gridPanel.isBindSizeToSuperView=YES;
    gridPanel.margin=UIEdgeInsetsMake(20, 0, 0, 0);
    gridPanel.backgroundColor=[UIColor grayColor];
    [self.view addSubview:gridPanel];
    currentPanle=gridPanel;

rows和colums属性指定该gridpanel有三行三列。isBindSizeToSuperView属性指定该panel的高宽是否绑定到父视图的高宽。如果绑定了,那么只要父视图的高宽改变,子视图的高宽也一并跟着变。margin属性指定该视图左上右下四个方向的间距,这个指定gridpanel永远距离顶部20像素。现在gridpanel已经初始化完毕,后面就是添加各个子视图了。既然是gridpanel,那么我可能希望里面的子视图是对角线排列的。也就是我们需要三个子视图。代码如下:

    UILabel *label = [[UILabel alloc] init];
    label.backgroundColor = [UIColor blackColor];
    label.textColor=[UIColor whiteColor];
    label.font=[UIFont systemFontOfSize:12];
    label.text = @"Label1";
    label.textAlignment = NSTextAlignmentCenter;
    label.size=CGSizeMake(50, 50);
    label.row=0;//第一行
    label.colum=0;//第一列
    [currentPanle addSubview:label];

    label = [[UILabel alloc] init];
    label.backgroundColor = [UIColor blackColor];
    label.textColor=[UIColor whiteColor];
    label.font=[UIFont systemFontOfSize:12];
    label.text = @"Label2";
    label.textAlignment = NSTextAlignmentCenter;
    label.size=CGSizeMake(50, 30);
    label.row=1;//第二行
    label.colum=1;//第二列
    [currentPanle addSubview:label];

    label = [[UILabel alloc] init];
    label.backgroundColor = [UIColor blackColor];
    label.textColor=[UIColor whiteColor];
    label.font=[UIFont systemFontOfSize:12];
    label.text = @"Label3";
    label.textAlignment = NSTextAlignmentCenter;
    label.size=CGSizeMake(50, 30);
    label.row=2;//第三行
    label.colum=2;//第三列
    [currentPanle addSubview:label];

效果如下:

如果我想把lable2改成横跨两列,并且下间距为5,那么代码如下:
    label = [[UILabel alloc] init];
    label.backgroundColor = [UIColor blackColor];
    label.textColor=[UIColor whiteColor];
    label.font=[UIFont systemFontOfSize:12];
    label.text = @"Label2";
    label.textAlignment = NSTextAlignmentCenter;
    label.size=CGSizeMake(50, 30);
    label.row=1;//第二行
    label.colum=1;//第二列
    label.columSpan=2;//跨两列
    label.margin=UIEdgeInsetsMake(0, 0, 5, 0);
    [currentPanle addSubview:label];

效果如下:

下面介绍stackpanel的用法

先看下初始化的代码:

    UILabel *label = [[UILabel alloc] init];
    label.backgroundColor = [UIColor blackColor];
    label.textColor=[UIColor whiteColor];
    label.font=[UIFont systemFontOfSize:12];
    label.text = @"Label1";
    label.textAlignment = NSTextAlignmentCenter;
    label.size=CGSizeMake(50, 50);
    [currentPanle addSubview:label];

    label = [[UILabel alloc] init];
    label.backgroundColor = [UIColor blackColor];
    label.textColor=[UIColor whiteColor];
    label.font=[UIFont systemFontOfSize:12];
    label.text = @"Label2";
    label.textAlignment = NSTextAlignmentCenter;
    label.size=CGSizeMake(50, 30);
    label.margin=UIEdgeInsetsMake(5, 0, 5, 0);
    [currentPanle addSubview:label];

    label = [[UILabel alloc] init];
    label.backgroundColor = [UIColor blackColor];
    label.textColor=[UIColor whiteColor];
    label.font=[UIFont systemFontOfSize:12];
    label.text = @"Label3";
    label.textAlignment = NSTextAlignmentCenter;
    label.size=CGSizeMake(50, 30);
    [currentPanle addSubview:label];

这个是垂直排列的,如果要是实现水平排列,那么只要把stackPanel的isHorizontal属性设为yes就可以了。

以上的布局不管在横屏和竖屏下都能正常布局。而且自适应。

而要实现第一张图里面那么复杂的布局,直接看我的demo就可以了。

点我下载demo

时间: 2024-12-28 16:08:44

IOS 自动布局-UIStackPanel和UIGridPanel的相关文章

IOS 自动布局-UIStackPanel和UIGridPanel(四)

为什么说scrollview的自动化布局是难点? 对scrollview做自动化布局,无非就是想对scrollview里面的subviews来做自动化布局.但是scrollview里面的subviews的自动化布局不是由scrollview的高宽来决定的,而是由scrollview的contentSize共同决定的,这样就出现一个问题了,就算scrollview的高宽是改变了,但是只要contentSize不变,那么对于scrollview里面的subviews的高宽其实是没有影响的.而实现自动

IOS 自动布局-UIStackPanel和UIGridPanel(三)

在这一篇了我将继续讲解UIGridPanel. 在iphone的app里面可以经常看到一些九宫格布局的应用,做过html开发的对这类布局应该是很熟悉的.在IOS中要实现这样的布局方法还是蛮多的,但是我这次主要是讲解直接通过控件来实现,我直接指定某个subview处于gridpanel的某行某列.甚至我要求该subview跨多行多列来显示. 要实现以上的需求,那么首先就得要求该panel具有行和列的属性,也就是该panel可以被拆分成多少行多少列.用代码表示如下: @interface UIGri

IOS 自动布局-UIStackPanel和UIGridPanel(五)

试想这样的一个需求场合,一个button靠右显示,并且距离superView的顶部和右边间距分别为10和5.如下图所示: 要实现这样的需求,如果不用自动布局技术,那么我们能想到的就是老老实实的使用绝对布局的坐标计算来实现了,假如这个button宽高都是100,父视图的宽是300,那么这个button的坐标就是:(300-100-5,10).但要是父视图的宽度变了,我们还得重新计算一遍.颇为麻烦. 幸好我们有自动布局技术.要实现这样的需求还是相对比较简单的. 既然我们要实现这样的需求,而且这个需求

iOS 自动布局

自动布局框架 Masonry PureLayout FLKAutoLayout KeepLayout UIView+Autolayout 相关教程: iOS 开发实践之 Auto Layout Masonry介绍与使用实践(快速上手Autolayout) IOS自动布局之Autoresizing iOS中的相对布局:AutoLayout

iOS 自动布局详细介绍

1. 自动布局的理解 iOS自动布局很有用,可以在不同size的屏幕上运行,原先看的头痛,还是习惯用最蠢的[UIScreen mainScreen].bounds.size.width等来布局,后来实在不行了,开始好好地看自动布局,发现理解后真的很好用,现在就来分享分享我的心得吧. 首先要明白一个控件在屏幕上的位置怎么样才能真正地确定.最简单的情况是: 1. 例如一个矩形,只要知道它左上角点的坐标,宽,高,那么位置就固定了. 2. 例如一个圆,只要知道它的圆心坐标,半径,那么位置就固定了. 自动

iOS自动布局——Masonry详解

欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由鹅厂新鲜事儿发表于云+社区专栏 作者:oceanlong | 腾讯 移动客户端开发工程师 前言 UI布局是整个前端体系里不可或缺的一环.代码的布局是设计语言与用户视觉感受沟通的桥梁,不论它看起来多么简单或是琐碎,但不得不承认,绝大部分软件开发的问题,都是界面问题.那么,如何高效的完成UI开发,也是软件行业一直在克服的问题. 所以,软件界面开发的核心点即是:如何减少UI设计稿的建模难度和减少建模转化到代码的实现难度 最初iOS提供了

iOS 自动布局扩展应用:代码中动态调整布局常量

一.设计需求 iOS Storyboard 自动布局技术,是iOS 6才出来的新技术,相当于多屏幕分辩率下自适应的技术. 但是一些复杂情况还是难处理. 比如有一个界面需求,进度条上显示标签,这个需求不难,难的是显要在显示表格框内,在各种机型显示正常. 最初设定是垂直居中向上偏15个像素 这是iPhone 4S 显示效果,下面与滑块还有错位 但是在iPhone 6下显示,下面有错位,但是上面留空太多 但如果把偏移量设为21.则出现另一种情况. 大屏幕的手机显示完美. 但是iPhone 4S下就错位

iOS自动布局学习(UIView+AutoLayout)

自动布局虽然在iOS6的时候已经推出,不过由于各个原因并没有被开发组广泛使用.一方面是大家的app支持版本都是低于iOS6的,另一方面来说是Xcode支持木有现在这么好.以前由于iPhone设备相对固定,所以在纯代码,纯坐标的布局下很流行,不过现在随着iPhone6发布,如果还要写一大堆乱七八糟的绝对坐标去适配,那工作量和维护成本是很大的. 下面的一些基础直接拿小伙伴分享整理的吧,之后向大家推荐一个开源的库,对AutoLayout进行了封装,用起来很简单也高效. 1.AutoLayout是什么?

iOS 自动布局过程

自动布局将视图显示在屏幕上的步骤: 更新约束,它会从子视图传递到父视图,设置布局信息:约束更新时自动触发setNeedsUpdateConstraints:updateConstraints可以增加本地约束 更新布局,从父视图到子视图,应用约束到视图上:setNeedsLayout可以触发这个传递,但是不是立即执行,而是多个布局请求合并到一个布局传递:layoutIfNeeded/layoutSubtreeIfNeeded(iOS/OS X)会强制更新视图树. 参考自:先进的自动布局工具箱