将 CGRect 从视图转换为超级视图不起作用
Converting a CGRect from a view to superview not working
我正在创建一个基于棋盘的棋盘游戏。
为了创建棋盘游戏,我这样做了:
- 想象一个棋盘被分成 8 列白色和方块。
- 我创建了一个 XIB 来表示偶数列。 XIB 是垂直
UIStackView
的白色和黑色方块。
- 我创建了第二个 XIB 来表示奇数列。那个XIB是黑白的竖
UIStackView
squares.column.
- 在故事板上,我创建了板视图并添加了这些列,偶数列、奇数列、偶数列、奇数列等,以表示具有 8 列的完整板,每列有 8 个正方形。所以我有这个:
`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
不是视图。我该如何解决?
convertRect:toView: 将接收器坐标系中的矩形转换为不同的坐标系。但是 [aSquare frame] 不在 MyBoardView
坐标系中,它在它的超级视图的坐标系中(即中间的视图之一)。而是尝试
CGRect convertedFrame = [self convertRect:[aSquare bound] fromView:aSquare];
这里 MyBoardView
被要求将 aSquare
坐标系中的 Rect 转换为它自己坐标系中的 rect。如果他们共享任何共同的超级视图,它将能够做到这一点。
顺便说一句,这与:
CGRect convertedFrame = [aSquare convertRect:[aSquare bound] toView:self];
fromView和toView的区别只是谁是接收者,谁是参数。 (使用 convertRect 方法时,具有相同的调用者和参数是一个大危险信号)。
我正在创建一个基于棋盘的棋盘游戏。 为了创建棋盘游戏,我这样做了:
- 想象一个棋盘被分成 8 列白色和方块。
- 我创建了一个 XIB 来表示偶数列。 XIB 是垂直
UIStackView
的白色和黑色方块。 - 我创建了第二个 XIB 来表示奇数列。那个XIB是黑白的竖
UIStackView
squares.column. - 在故事板上,我创建了板视图并添加了这些列,偶数列、奇数列、偶数列、奇数列等,以表示具有 8 列的完整板,每列有 8 个正方形。所以我有这个:
`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
不是视图。我该如何解决?
convertRect:toView: 将接收器坐标系中的矩形转换为不同的坐标系。但是 [aSquare frame] 不在 MyBoardView
坐标系中,它在它的超级视图的坐标系中(即中间的视图之一)。而是尝试
CGRect convertedFrame = [self convertRect:[aSquare bound] fromView:aSquare];
这里 MyBoardView
被要求将 aSquare
坐标系中的 Rect 转换为它自己坐标系中的 rect。如果他们共享任何共同的超级视图,它将能够做到这一点。
顺便说一句,这与:
CGRect convertedFrame = [aSquare convertRect:[aSquare bound] toView:self];
fromView和toView的区别只是谁是接收者,谁是参数。 (使用 convertRect 方法时,具有相同的调用者和参数是一个大危险信号)。