2

viewWillAppear我想使用以下转换(Monotouch 代码)调整我的一些视图:

CATransform3D oTransform3D = CATransform3D.Identity;
oTransform3D.m34 = 1.0f / -400;
oTransform3D = oTransform3D.Translate( 110, 0, 0);
oTransform3D = oTransform3D.Rotate( (-70f) * (float)Math.PI / 180f, 0, 1, 0);   

但是,这会导致视图呈现在屏幕的最左侧。如果我将相同的代码放入viewDidAppear,它就可以工作。我已经检查过所有视图的大小是否有效。

4

2 回答 2

1

你有没有想过这个?我遇到过类似的情况,当应用于 UIViewController 根视图的直接子视图时,3D 转换拒绝运行。我的一个解决方法是将子视图包装在另一个容器 UIView 中。

这些方面的东西:

- (void)viewDidLoad {
    [super viewDidLoad];
    UIView *container = [[UIView alloc] initWithFrame:CGRectMake(0,0,self.view.frame.size.width,self.view.frame.size.height)];
    container.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoResizingFlexibleHeight;
    [self.view addSubview:container];

    self.myCrazyFlippingSpinningView = [[CrazyFlippingSpinningView alloc] init];
    [container addSubview:self.myCrazyFlippingSpinningView];
}

当然,我宁愿不必这样做。这是一个黑客。如果有人遇到这个并且有更好的解决方案,我很乐意看到它。

谢谢!

于 2012-06-20T16:42:50.293 回答
0

不确定我是否完全理解这个问题,但我会采取一个赃物。

CATransform3D 有一个消失点,它是变换所指的。消失点始终是您放置转换视图的任何视图的 x,y 中心点。当我在 3D 变换问题上苦苦挣扎并得到意想不到的结果时,总是通过简单地确保我知道容器视图的大小和中心点来解决它。

您说您的代码在 ViewDidLoad 中工作......这是否意味着您正在将转换后的视图添加到基本视图?喜欢:this.View.AddSubview(yourTransformedView); ??

我的意思是,我不认为您的问题是 ViewWillAppear 与 ViewDidLoad 的问题。我猜如果我看到你将转换应用于视图的代码,然后将你的视图添加到基本视图或其他超级视图,我将能够快速告诉你发生了什么。

于 2012-03-01T19:27:21.470 回答