关于frame和bounds
bounds以控件的内容
左上角为坐标原点。
结论:要让子控件贴合父控件,那么直接设置子控件的frame = 父控件的bounds就对了。而如果是要子控件与父控件的左上角对齐,那么只要子控件的frame的前两位坐标等于父控件的bounds的前两位坐标。
举例:
- 假设一个scrollView的宽高是50,60,挨着屏幕左上角,那么正常情况下如果它的bounds是(0,0,50,60),frame是(0,0,50,60)。如果它的contentOffset改为100,100(就是内容往左上移动了100,100),那么此时scrollView的bounds就是(100,100,50,60),frame还是(0,0,50,60)。控件B此时成为它的子控件,它的frame要去找scrollView的坐标系的原点为参照,而此时scrollView的左上角已经变为(100,100),那么B要贴着scrollView的左上角,也要把frame设置为(100,100)。
- 换一种思路:scrollView的坐标系原点是内容左上角,现在内容往左移了。而B的frame参照原点就是scrollView的坐标系原点,所以应该是(100,100)
- 需要注意的地方:
- 不能直接修改OC对象的结构体属性的成员,但是允许修改“对象”的“结构体属性”
-
- 下面的写法是错误的
imageView.frame.size = imageView.image.size; imageView.frame.size.width = imageView.image.size.width;
正确修改结构体属性的成员方法如下:
(1)使用临时变量记录对象的结构体属性
(2) 修改临时变量的属性
(3)将临时变量重新设置给对象的结构体属性
数据类型:CGRect tempFrame = imageView.frame; tempFrame.size = imageView.image.size; imageView.frame = tempFrame;
CGFloat: 浮点值的基本类型
CGPoint: 表示一个二维坐标系中的点
CGSize: 表示一个矩形的宽度和高度
CGRect: 表示一个矩形的位置和大小typedef float CGFloat;// 32-bit typedef double CGFloat;// 64-bit struct CGPoint { CGFloat x; CGFloat y; }; typedef struct CGPoint CGPoint; struct CGSize { CGFloat width; CGFloat height; }; typedef struct CGSize CGSize; struct CGRect { CGPoint origin; CGSize size; }; typedef struct CGRect CGRect;
- 注意:CGRect数据结构的高度和宽度可以是负数。例如,一个矩形的原点是[0.0,0.0]和大小是[10.0,10.0]。这个矩形完全等同原点是[10.0,10.0]和大小是[-10.0,-10.0]的矩形。
打印这些值:转成字符串CGPoint CGPointMake ( CGFloat x, CGFloat y ); CGSize CGSizeMake ( CGFloat width, CGFloat height ); CGRect CGRectMake ( CGFloat x, CGFloat y, CGFloat width, CGFloat height ); CGFloat ten=10.0f; CGPoint point = CGPointMake(0.0f, 0.0f); CGSize size = CGSizeMake(10.0f, 10.0f); CGRect rect = CGRectMake(point.x, point.y, size.width, size.height);
常用方法NSLog(@"ten: %f", ten); NSLog(@"point: %@", NSStringFromCGPoint(point)); NSLog(@"size: %@", NSStringFromCGSize(size)); NSLog(@"rect: %@", NSStringFromCGRect(rect));
-
获得矩形最左边的x值 CGFloat CGRectGetMinX(CGRect rect);
-
获取矩形中点的x值 CGFloat CGRectGetMidX(CGRect rect);
-
获取矩形最右端的x值 CGFloat CGRectGetMaxX(CGRect rect);
-
获取矩形最上端的y值 CGFloat CGRectGetMinY(CGRect rect);
-
获取矩形中心点的y值 CGFloat CGRectGetMidY(CGRect rect);
-
获取矩形最下端的y值 CGFloat CGRectGetMaxY(CGRect rect);
-
获取矩形宽度 CGFloat CGRectGetWidth(CGRect rect);
-
获取矩形高度 CGFloat CGRectGetHeight(CGRect rect);
-
判断两个点是否相等 bool CGPointEqualToPoint(CGPoint point1, CGPoint point2);
-
判断两个尺寸是否相等 bool CGSizeEqualToSize(CGSize size1, CGSize size2);
-
判断两个矩形是否相等 bool CGRectEqualToRect(CGRect rect1, CGRect rect2);
- 必须保证同一个坐标系
-
这里curP的坐标系是self,btn.frame的坐标系是btn的父控件self,相同
// 获取当前触摸点
CGPoint curP = [touch locationInView:self]; if ( CGRectContainsPoint(btn.frame, curP)) { btn.selected = YES; }
-