如何创建具有新原点但使用现有大小的CGRect?

时间:2014-02-14 19:58:27

标签: ios objective-c cgrect

在objective-c中,我经常在动画期间更新视图的帧。我目前有一个混乱的解决方案:

CGPoint newOrigin = CGPointMake(25.0, 25.0);    
view.frame = CGRectMake(newOrigin.x, newOrigin.y, view.frame.size.width, view.frame.size.height);

我正在寻找的是一种简单的方便方法,其工作原理如下:

view.frame = CGRectWithNewOrigin(view.frame, newOrigin);

SDK中是否存在执行此操作的现有方法,还是需要定义自己的方法?

解决:0x7fffffff有正确的答案,但JackWu的建议是更好的方法:

Jack Wu提供的解决方案解决了我的问题。 iOS SDK没有这样做的方法,因此您需要定义自己的内联方法来执行此操作。但是,利用UIView的中心属性是一种更好的方法。无需定义内联函数,如果视图已应用了变换,它也将继续有效。

5 个答案:

答案 0 :(得分:2)

很容易定义一个新的内联方法,就像已经使用过的方法一样,比如CGRectMake()..这样的事情怎么样?

static inline CGRect CGRectWithNewOrigin(CGPoint origin, CGRect frame) {
    return CGRectMake(origin.x, origin.y, frame.size.width, frame.size.height);
}

然后像使用CGRect的任何其他功能一样使用它

CGPoint newOrigin = CGPointMake(25.0, 25.0); 
CGRect newRect = CGRectWithNewOrigin(newOrigin, oldRect);

答案 1 :(得分:2)

CGRectOffset做的事情(很多但不是所有情况):

  

返回一个原点偏离源矩形的矩形。

答案 2 :(得分:1)

这有效:

view.frame = (CGRect){.origin = newOrigin, .size = view.frame.size};

否则,您可以编写自己的C函数,我很确定不存在。 (我只看了CGGeometry.h第一百次。)

虽然它比你要求的更为通用,但我经常认为这样的事情会有用:

static inline CGRect CGRectFromOriginSize(CGPoint origin, CGSize size) {
    return (CGRect){.origin = newOrigin, .size = view.frame.size};;
}

答案 3 :(得分:0)

这很好用:

CGRect newFrame = view.frame;

newFrame.origin = CGPointMake(25.0, 25.0);

view.frame = newFrame;

答案 4 :(得分:0)

试试这个:

CGPoint newOrigin = CGPointMake(25.0, 25.0);

CGRect newFrame = view.frame;
newFrame.origin = newOrigin;


view.frame = newFrame;