【问题标题】:How can I create a CGRect with a new origin but utilizing the existing size?如何创建具有新原点但利用现有大小的 CGRect?
【发布时间】:2014-02-14 19:58:27
【问题描述】:

在 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 的 center 属性是更好的方法。无需定义内联函数,如果视图应用了变换,它也将继续工作。

【问题讨论】:

  • 为此,建议设置“center”属性而不是框架,这不会改变视图的大小
  • 请注意,一旦应用了transform,frame 属性就未定义,不应修改。虽然这对于您当前的设置可能不是问题,但按照 @JackWu 的建议操作 center 属性可能会让您在以后头疼。
  • 谢谢大家。在大多数情况下,这确实是解决我的问题的正确方法。我会将 0x7ffffff 的答案标记为正确答案,但更新问题文本以提及调整中心更合适。我最终在我自己的项目中使用了 center 属性。谢谢@JackWu!

标签: ios objective-c cgrect


【解决方案1】:

定义一个新的内联方法很容易,就像已经使用的方法一样,比如 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);

【讨论】:

  • 谢谢,我想知道是否已经有一种方法可以做到这一点,或者我是否必须自己定义它。感谢您的回答,因为现在我知道它不存在,这是一种等效的方法!
【解决方案2】:

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

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

【讨论】:

  • 关闭,但移动矩形,它不会重置原点。
  • @ClayBridges:是的,但是在编写动画代码时考虑位置变化通常很有用。
  • 谢谢,但我已经试过了。正如 Clay 指出的那样,它有效地将矩形从其当前原点转换。它在动画代码中很有用,但在这种情况下,它不是我想要的。
【解决方案3】:

这行得通:

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};;
}

【讨论】:

    【解决方案4】:

    这很好用:

    CGRect newFrame = view.frame;
    
    newFrame.origin = CGPointMake(25.0, 25.0);
    
    view.frame = newFrame;
    

    【讨论】:

      【解决方案5】:

      试试这个:

      CGPoint newOrigin = CGPointMake(25.0, 25.0);
      
      CGRect newFrame = view.frame;
      newFrame.origin = newOrigin;
      
      
      view.frame = newFrame;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多