Почему CATransform3D не работает при запуске из viewWillAppear? - PullRequest
2 голосов
/ 28 февраля 2012

В 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 ]

1 голос
/ 20 июня 2012

Вы когда-нибудь понимали это?Я столкнулся с подобной ситуацией, когда трехмерное преобразование отказывается вести себя при применении к непосредственному подпредставлению корневого представления 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];
}

Конечно, я бы предпочел, чтобы не былосделать это.Это такой взлом.Если бы кто-нибудь сталкивался с этим и нашел лучшее решение, я бы хотел его увидеть.

Спасибо!

0 голосов
/ 01 марта 2012

Не уверен, что я полностью понимаю вопрос, но я собираюсь сделать хабар.

CATransform3D имеет точку схода, к которой относятся преобразования.Точка схода всегда является центральной точкой x, y любого вида, на который вы помещаете преобразованный вид.Когда я боролся с проблемами трехмерного преобразования и получал неожиданные результаты, это всегда было решено, просто убедившись, что я знал размер и центральную точку представления контейнера.

Вы говорите, что ваш код работает в ViewDidLoad ...Означает ли это, что вы добавляете преобразованный вид в базовый вид?как: this.View.AddSubview (yourTransformedView);??

Я имею в виду, я не думаю, что ваша проблема связана с ViewWillAppear против ViewDidLoad;Я собираюсь догадаться, что если бы я увидел код, в котором вы применяете свое преобразование к представлениям, а затем добавляете ваши представления в базовое представление или в какое-то другое суперпредставление, я смог бы быстро рассказать вам, что происходит.

...