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

Posted

技术标签:

【中文标题】将 CGRect 从视图转换为超级视图不起作用【英文标题】:Converting a CGRect from a view to superview not working 【发布时间】:2017-05-18 13:37:19 【问题描述】:

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

    想象一个棋盘被分成 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 不是视图。我该如何解决?

【问题讨论】:

【参考方案1】:

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

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

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

顺便说一句,这将等同于:

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

fromView 和 toView 的区别只是谁是接收者,谁是参数。 (使用 convertRect 方法时,具有相同的调用者和参数是一个很大的危险信号)。

【讨论】:

以上是关于将 CGRect 从视图转换为超级视图不起作用的主要内容,如果未能解决你的问题,请参考以下文章

视图和超级视图之间的自动布局标准空间不起作用

UIView addSubview 自动布局不起作用

布局约束不起作用

在 TextView 上点击 Gesture,其超级视图在 iOS 11 中不起作用

InputAccessoryView的子视图工具栏按钮不起作用

removeAllAnimations 不起作用后添加动画