KJGridLayout
是一个为 iOS 应用中视图提供简单网格布局管理的类。
它可以用在 UIViewController 的子类中以排列视图,也可以用在 UIView 子类的 -[UIView layoutSubviews]
实现。
KJGridLayoutView
是一个 UIView 子类,它在 -layoutSubviews
实现中使用 KJGridLayout
。它允许你在特定的网格位置添加子视图,当视图大小改变或添加新的子视图时,网格布局会自动更新。
项目包含以下目标:
KJGridLayout
和 KJGridLayoutView
类的静态库。您可以将其库复制到自己的项目中,或者只需将 .h
和 .m
文件复制到您的项目中。KJGridLayout
库的单元测试。要在 Xcode 中运行测试,选择 KJGridLayout 方案并运行 产品 > 测试 命令。KJGridLayout
类使用的简单应用程序。KJGridLayoutView
类使用的简单应用程序。要在您的应用中使用 KJGridLayout
,将 KJGridLayout.h
和 >复制到您的项目中(或者复制整个 KJGridLayout 库目标)。
通过调用 [[KJGridLayout alloc] init]
创建 KJGridLayout
实例。
然后,通过调用 -addView:rowIndex:columnIndex:
向布局中添加视图。该方法有不同的变体,允许指定跨多个网格单元的 columnSpan
和/或 rowSpan
参数。
在执行布局之前,调用 -setBounds:
设置布局的边界矩形。您可能想要使用视图的边界,或者如果您希望网格只占用视图的一部分,可以设置一个更小的边界矩形。
如果想在列和行之间留一些空隙,就调用 -setColumnSpacing
和 -setRowSpacing
。
最后,调用 -layoutViews
执行布局操作。这将遍历添加到网格布局中的每个视图并调用 -[UIView setFrame:]
。每当父视图大小发生变化时(例如,由于自动旋转),应设置布局的新边界,然后再次调用 -layoutViews
。
如果要从布局中删除视图,请使用 -removeView:
或 -removeAllViews
。如果要将布局更改为元素(例如,将元素从一个列移动到另一个列),则必须先删除它,然后调用 -addView:...
方法的其中一个来将其放在新位置。
// @property (nonatomic, retain) KJGridLayout *gridLayout;
@synthesize gridLayout;
- (void)viewDidLoad {
[super viewDidLoad];
// Initialize the layout manager
gridLayout = [[KJGridLayout alloc] init] autorelease];
[gridLayout setColumnSpacing:4];
[gridLayout setRowSpacing:4];
// Create 1-9 keypad buttons in 3x3 grid
for (NSUInteger i = 0; i < 9; ++i) {
NSString *title = [NSString stringWithFormat:@"%u", (unsigned) i + 1];
UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[button setTitle:title forState:UIControlStateNormal];
[self.view addSubview:button];
NSUInteger rowIndex = i / 3;
NSUInteger columnIndex = i % 3;
[gridLayout addView:button row:rowIndex column:columnIndex];
}
// Set the layout bounds to match the view's bounds.
[gridLayout setBounds:[self.view bounds]];
// Call -layoutViews
[gridLayout layoutViews];
}
- (void)viewDidUnload {
// Release the grid layout to release the retained views
self.gridLayout = nil;
[super viewDidUnload];
}
- (void)dealloc {
[gridLayout release];
[super dealloc];
}
- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)orientation
duration:(NSTimeInterval)duration {
[super willAnimateRotationToInterfaceOrientation:orientation duration:duration];
// Redo layout during autorotation
[UIView animateWithDuration:duration animations:^{
[gridLayout setBounds:[self.view bounds]];
[gridLayout layoutViews];
}];
}
请参阅包含的 KJGridLayoutDemo
应用程序以获取更完整的示例。
KJGridLayoutView
的使用方法要在您的应用程序中使用 KJGridLayoutView
,将 KJGridLayout.h
,KJGridLayout.m
,KJGridLayoutView.h
和 KJGridLayoutView.m
复制到您的项目中(或复制整个 KJGridLayout 库目标)。
使用 KJGridLayoutView
与使用 KJGridLayout
类似,但您不是调用 -addView:row:rowSpan:column:columnSpan:options:
,而是调用 -addSubview:row:rowSpan:column:columnSpan:options:
,这两个方法都会将视图添加为子视图并设置其网格布局参数。
您也可以用 -[UIView addSubview:]
与 KJGridLayoutView
一起使用。使用该方法添加的子视图不会参与网格布局。
如果您正确设置了网格布局视图的 autoresizingMask
,则在自动旋转或其他导致视图大小变化的任何事件发生时,其网格布局代码将自动调用。
请参阅 KJGridLayoutViewDemo
以获取完整示例。
版权所有 © 2012 Kristopher Johnson
特此授予任何收到此软件和关联文档副本(以下简称“软件”)的人士在不受限制的情况下处理软件的权利,包括但不仅限于使用、复制、修改、合并、发布、分发、再许可和/或出售软件副本,并允许将软件提供给他人,前提是满足以下条件
上述版权声明和本许可协议应包含在软件的所有副本或实质性部分中。
本软件按“现状”提供,不提供任何类型的保证,无论是明示的还是暗示的,包括但不限于适销性、适用于特定目的和无侵权性。在任何情况下,作者或版权持有人不对任何索赔、损害或其他责任,以及因软件或使用或以其他方式处理软件而引起的任何行动、侵权、损害或其他责任承担责任。