仅旋转视图而不旋转其子视图

4
有没有一种方法,可以使视图旋转的变换不会传递给其子视图? 我有一个自定义的MKAnnotationView,根据用户的方向值旋转。在自定义注释视图类中的下面方法中,我将子视图添加到注释视图中。
- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
    [super setSelected:selected animated:animated];

    if(selected)
{
  [self addSubview:self.myCallOutView];
  return;
}
  [self.myCallOutView removeFromSuperview];


}

但问题在于当我的注释视图被旋转后,我选择任何注释时,myCallOutView也会出现旋转,这不是我想要的。我使用以下语句旋转自定义注释视图:
  [self setTransform:CGAffineTransformMakeRotation(angle * M_PI / -180.0)];

如何避免这种情况?在将myCallOutView添加为子视图之前,我需要对其进行某些变换吗?

1个回答

7

一个非常简单的解决方案是在子视图上执行反向旋转:

[self setTransform:CGAffineTransformMakeRotation(angle * M_PI / -180.0)];
// NOTE: we're using the negative of the angle here
[self.myCallOutView setTransform:CGAffineTransformMakeRotation(- angle * M_PI / -180.0)]];

这将取消对父视图的旋转效果。

替代方法:稍微改变视图结构:不要让视图A在视图B中,而是让视图A和B都成为容器视图C的子视图。然后只需对视图A应用旋转,B不会受到影响。如果要在显示器上移动整个集合,则重新定位容器视图C。


4
好的,我会尝试并且我认为它会起作用。顺便说一下,你需要对你的个人资料图片进行一些转换...:p - Vishal Singh
1
对于遇到同样问题的人,我采用了上面Occulus提供的替代方法解决了问题。因为在子视图上执行反向旋转不会旋转子视图,但其框架会受到影响。建议采用第二种方法。 - Vishal Singh
嗨,Occulus,上面的代码运行正常,子视图组件的大小正在改变。如何解决这个问题? - Kavitha Madhu
@KavithaMadhu 为了获得最好的帮助机会,请发布一个新问题并附上示例代码。 - occulus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接