iOS开发中frame与Bounds的区别,以及几何方法的小结

关于frame和bounds​

  • bounds以控件的内容左上角为坐标原点。如果内容设置了缩进60,那么bounds就变成了-60。

案例一:

  • 假设一个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)
  • 综上:要让子控件贴合父控件,那么直接设置子控件的frame = 父控件的bounds就对了。而如果是要子控件与父控件的左上角对齐,那么只要子控件的frame的前两位坐标等于父控件的bounds的前两位坐标。

案例二:

  • 设置左右滑动图片会缩放的流水布局那个项目中,一个collectionView,它紧挨左边有一个子控件cell,此时cell的位置是(0,0);此时往左拖动了一下collectionView,让其contentOffset变为(50,0)那么cell的位置是多少呢?答案是:依然(0,0)。
  • 因为cell的参考系是其父控件collectionView,而collectionView的坐标系是以自己内容的左上角为原点;于是当往左拖动contentOffset改变之后,也就是其内容改变之后,它的坐标原点也往左滑了50的距离。此时cell的位置相对于这个坐标原点是没有改变的。
  • 于是,要计算这个cell与collectionView中心线的距离,那应该这么算:CGFloat margin = ABS(cellX - collectionViewCenterX - self.collectionView.contentOffset.x);

注意设置中心点不能直接A.center = B.center,因为参考系不同,比如父控件的参考系是控制器的view,子控件是个按钮,它们的参考系不同

  • 必须CGFloat x = B.frame.size.width / 2 ;CGFloat y = B.frame.size.height / 2 ,然后A.center = CGPointMake(x,y) .

小语法点

  • 不能直接修改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;
    }
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值