将CGRect从视图转换为superview不起作用

时间:2017-05-18 13:37:20

标签: ios objective-c iphone uistackview

我正在创建一个基于国际象棋棋盘的棋盘游戏。 为了创建棋盘游戏,我做了这个:

  1. 想象一下,棋盘分为8列白色和方块。
  2. 我创建了一个XIB来表示偶数列。 XIB是垂直UIStackView的白色和黑色方块。
  3. 我创建了第二个XIB来表示奇数列。那个XIB是一个垂直的UIStackView黑白squares.column。
  4. 在故事板上的
  5. 我创建了板视图并添加了这些列,偶数,奇数,偶数,奇数等,以表示具有8个方块的8个方块的整个电路板。所以我有这个:
  6. `BOARD VIEW`
       |
       ├─ EVEN COLUMN VERTICAL UISTACKVIEW with 8 vertical squares
       ├─ ODD COLUMN VERTICAL UISTACKVIEW with 8 vertical squares
       ├─ EVEN COLUMN VERTICAL UISTACKVIEW with 8 vertical squares
       ├─ ODD COLUMN VERTICAL UISTACKVIEW with 8 vertical squares
       ├─ EVEN COLUMN VERTICAL UISTACKVIEW with 8 vertical squares
       ├─ ODD COLUMN VERTICAL UISTACKVIEW with 8 vertical squares
       ├─ EVEN COLUMN VERTICAL UISTACKVIEW with 8 vertical squares
       └─ ODD COLUMN VERTICAL UISTACKVIEW with 8 vertical squares
    

    现在我想得到一个位于其中一个列中的正方形的框架,并将其转换为电路板的框架参考。

    我在MyBoardView.m上执行此操作:

    CGRect convertedFrame = [self convertRect:[aSquare frame] toView:self];
    

    self是电路板视图,aSquare是位于self内的堆栈内的一个正方形。此转换无效。 convertedFrame等于[aSquare frame]

    我认为问题在于UIStackView不是视图。我该如何解决?

1 个答案:

答案 0 :(得分:2)

convertRect:toView:将接收器坐标系中的矩形转换为不同的坐标系。但是[aSquare frame]不在MyBoardView坐标系中,它位于superview的坐标系中(即中间的一个视图)。而是尝试

CGRect convertedFrame = [self convertRect:[aSquare bound] fromView:aSquare];

这里要求MyBoardViewaSquare坐标系中的Rect转换为自己坐标系中的rect。如果他们共享任何共同的超级视图,它将能够做到。

顺便说一句,这与以下内容相同:

CGRect convertedFrame = [aSquare convertRect:[aSquare bound] toView:self];

fromView和toView之间的区别仅在于谁是接收者,谁是参数。 (使用convertRect方法时,具有相同的调用者和参数是一个很大的红旗)。