从viewWillAppear触发时,为什么CATransform3D无法正常工作?

时间:2012-02-28 16:03:03

标签: cocoa-touch xamarin.ios catransform3d

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中添加相同的代码,它就可以了。 我已经检查过所有视图都有有效的大小。

2 个答案:

答案 0 :(得分:1)

你有没有想过这个?我遇到了类似的情况,当3D变换应用于UIViewController的根视图的直接子视图时,它拒绝表现。我的解决方法是将子视图包装在另一个容器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];
}

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

谢谢!

答案 1 :(得分:0)

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

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

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

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