iOS 8案例开发大全
上QQ阅读APP看书,第一时间看更新

实例012 设置UIView的位置和尺寸

实例说明

曾经有人这么说过,在iOS里看到的和摸到的都是UIView,所以UIView在iOS开发里具有非常重要的作用。视图和窗口展示了应用的用户界面,同时负责界面的交互。UIKit和其他系统框架提供了很多视图,开发人员可以就地使用而几乎不需要修改。当展示的内容与标准视图允许有很大的差别时,开发人员也可以定义自己的视图。无论是使用系统的视图还是创建自己的视图,需要理解类UIView和类UIWindow所提供的基本结构。这些类提供了复杂的方法来管理视图的布局和展示。理解这些方法的工作非常重要,使开发人员在应用发生改变时可以确认视图有合适的行为。

在iOS应用中,绝大部分可视化操作都是由视图对象(即UIView类的实例)进行的。一个视图对象定义了一个屏幕上的一个矩形区域,同时处理该区域的绘制和触屏事件。一个视图也可以作为其他视图的父视图,同时决定着这些子视图的位置和大小。UIView类做了大量的工作去管理这些内部视图的关系,但是需要的时候也可以定制默认的行为。

在本实例中,使用方法initWithFrame可以依照Frame建立新的View,建立出来的View要通过addSubview加入到父View中。本实例的最终目的是,分别在屏幕中间和屏幕右上角设置两个区域。

具体实现

实例文件UIkitPrjFrame.h的实现代码如下所示。

#import "SampleBaseController.h"
@interface UIKitPrjFrame : SampleBaseController
{
 @private
}
@end

实例文件UIkitPrjFrame.m的实现代码如下所示。

#import "UIKitPrjFrame.h"
@implementation UIKitPrjFrame
#pragma mark ----- Override Methods -----
- (void)viewDidLoad {
  [super viewDidLoad];
  self.view.backgroundColor = [UIColor blackColor];
  UILabel* label1 = [[[UILabel alloc] initWithFrame:CGRectZero] autorelease];
  label1.text = @"右上方";
  // 将label1的frame修改成任意的区域
  CGRect newFrame = CGRectMake( 220, 20, 100, 50 );
  label1.frame = newFrame;
  UILabel* label2 = [[[UILabel alloc] initWithFrame:[label1 frame]] autorelease];
  label2.textAlignment = UITextAlignmentCenter;
  label2.text = @"中心位置";
  // 将label2的center调整到画面中心
  CGPoint newPoint = self.view.center;
  // 空出状态条高度大小
  newPoint.y -= 20;
  label2.center = newPoint;
  // 向画面中追加label1 与label2
  [self.view addSubview:label1];
  [self.view addSubview:label2];
UILabel* label = [[[UILabel alloc] initWithFrame:CGRectZero] autorelease];
  // frame的设置
  label.frame = CGRectMake( 0, 0, 200, 50 );
  // center设置
  label.center = CGPointMake( 160, 240 );
  // frame的参照
  NSLog( @"x = %f", label.frame.origin.x );
  NSLog( @"y = %f", label.frame.origin.y );
  NSLog( @"width = %f", label.frame.size.width );
  NSLog( @"height = %f", label.frame.size.height );
  // center的参照
  NSLog( @"x = %f", label.center.x );
  NSLog( @"y = %f", label.center.y );
}
- (void)touchesEnded:(NSSet*)touches withEvent:(UIEvent*)event {
  [self.navigationController setNavigationBarHidden:NO animated:YES];
}
@end

执行效果如图2-15所示。

图2-15 执行效果