【问题标题】:Setting the origin of the frame in iOS在 iOS 中设置框架的原点
【发布时间】:2013-04-26 07:10:45
【问题描述】:

我正在尝试以编程方式设置框架的原点。

方法一:

button.frame.origin.y = 100;

方法二:

CGRect frame = button.frame;
frame.origin.y = 100;

我尝试了方法 1,但它不起作用(显示错误,说 Expression is not assignable)。方法 2 有效。为什么会这样?

需要关于我在做什么正确的指导。

【问题讨论】:

  • 正如错误所说 - 视图的框架属性不可分配。只有框架本身是可分配的。所以你只需要坚持方法#2。
  • 所以只有方法 2?还有其他方法吗?
  • 对于 UIView,框架 (CGRect) 为 R/W,frame.origin 为只读。

标签: ios frame


【解决方案1】:

您不能执行方法 #1 的原因是框架的各个属性是只读的。但是,整个框架本身是可写/可分配的,因此您可以执行方法 #2。

你甚至可以做这样的把戏:

CGRect newFrame = button.frame;
newFrame.origin.y += 100; // add 100 to y's current value
button.frame = newFrame;

【讨论】:

    【解决方案2】:

    你知道的 button.frame.origin.y 返回一个值。

    如果你正在使用这个,那么你会得到这个错误......

    表达式不可赋值。

    button.frame.origin.y = 100;
    

    所以这是正确的方法

    CGRect frame = button.frame;
    frame.origin.y = 100;
    

    否则你可以这样做......

    button.frame = CGRectMake(button.frame.origin.x, 100, button.frame.size.width, button.frame.size.height)
    

    【讨论】:

    • 是的.. 否则你可以这样做。 button.frame = CGRectMake(button.frame.origin.x, 100, button.frame.size.width, button.frame.size.height)
    【解决方案3】:

    这是因为如果你能够直接改变一个框架的原点或大小,你会绕过 UIView 的 frame 属性的 setter 方法。由于多种原因,这会很糟糕。

    UIView 将没有机会收到有关其框架更改的通知。但它必须知道这些更改才能更新它的子视图或重绘自身。

    【讨论】:

      【解决方案4】:
      button.frame.origin.y = 100;
      

      等于以下调用:

      [button getFrame].origin.y = 100;
      

      其中[button getFrame] 为您提供了复制的CGRect

      您正在尝试设置结构的结构的变量。没有从UIView 指向该结构的指针(因为它是基本的C struct,因此无法指向)。因此,改为复制。

      所以基本上,你是在复制结构并设置它。但是,那样做是行不通的。

      【讨论】:

      • 不确定...差不多 4 岁的答案。有什么问题?
      • 总之,这行代码课程编译错误。但我仍然不明白该属性不是只读的。我发现这个线程可以解决我的困惑。 stackoverflow.com/questions/9411429/…
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-27
      • 1970-01-01
      • 1970-01-01
      • 2023-04-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多