2012-02-28 13 views
2

viewWillAppear我想調整的一些使用下面的變換(MonoTouch的代碼),我的看法:爲什麼從viewWillAppear觸發時,CATransform3D不工作?

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中,它就可以工作。 我已經檢查過所有的視圖都有有效的大小。

回答

0

不知道我完全理解這個問題,但我會採取一個贓物。

CATransform3D有一個轉換指向的消失點。消失點始終是將變換視圖放置在任何視圖上的x,y中心點。當我在3D轉換問題上掙扎並獲得意想不到的結果時,只需確保知道容器視圖的大小和中心點即可解決問題。

你說你的代碼在ViewDidLoad中工作......這是否意味着你正在向基本視圖添加一個轉換後的視圖?像:this.View.AddSubview(yourTransformedView); ??

我的意思是,我不認爲你的問題是ViewWillAppear與ViewDidLoad的問題;我會猜測,如果我看到將代碼應用於視圖的代碼,然後將視圖添加到基本視圖或其他超級視圖,我將能夠快速告訴您發生了什麼。

+0

我有一個UIViewController。爲了這個控制器的視圖,我添加了一個子視圖。在這個子視圖中,我應用了上面的轉換。如果我把上面的代碼放在viewDidAppead中,這個轉換是按預期工作的。但是,如果我把它放在視圖中,結果是不同/錯誤的。我想明白爲什麼。 AFAIK在viewWillAppear所有意見都已定位,並有他們的最終尺寸已經。 – Krumelur 2012-03-01 20:36:39

+0

ViewDidLoad在第一次使用ViewController時發生1次。 ViewWillAppear會在每次視圖被回憶時發生,比如離開它,然後再回來。我的建議是嘗試在ViewDidLoad中放置你的代碼塊,作爲發生在你的ViewDidLoad代碼中的其他地方的最後一件事,你正在移動或改變與基本視圖相關的東西。 – 2012-03-07 13:41:35

0

你有沒有想過這個?我遇到了類似的情況,即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]; 
} 

當然,我寧願不做到這一點。這是一個黑客。如果有人遇到這個問題並有更好的解決方案,我很樂意看到它。

謝謝!

相關問題