我正在開發一個由其他人開發的應用程序,我相信當iOS 5是最新的時候就開始了。大部分用戶界面都是代碼生成的,不會明確使用自動佈局和約束。但是,有一些(後來添加的)自包含的UI元素,它們是在內部使用自動佈局的nib(xib)中定義的,這些元素由應用程序的更高級別視圖(在代碼中生成而不使用自動佈局)包含。問題重新進入iOS8中的[UIView(幾何)_applyISEngineLayoutValues]的視圖
代碼的一部分會生成這些自包含元素之一的合成圖像,然後將該圖像動畫化,然後交換實際UI元素視圖的圖像。各種這些自包含的UI元素(全都基於相同的基類但具有自己的nib(xib))可以傳入此例程,並按照說明顯示它們。他們中的大多數在iOS 7和iOS 8中工作得很好,在屏幕上進行動畫製作。
但是,只有iOS8上的一個特定UI元素會正確動畫,但動畫完成部分完成後,會重置其位置,使其中心位於0,0。這一個在iOS 7中工作正常。
我已經比較了代碼和筆尖,以便與這一個元素一起工作的很好,但在違規的UI元素的創建和內部組成中看不到任何不同的東西。
我添加了一個關鍵路徑觀察者到@「中心」鍵路徑的視圖,所以我可以看到是誰造成了這個重新居中,它似乎是在自動佈局系統代碼中 - 我的代碼都不在回溯。
#0 0x002ed826 in -[MyFundsManager observeValueForKeyPath:ofObject:change:context:] at /Users/me/Dev/MyApp/iosapp/MyApp/MyFundsManager.m:158 #1 0x24b30372 in NSKeyValueNotifyObserver() #2 0x24b3001e in NSKeyValueDidChange() #3 0x24b1c840 in -[NSObject(NSKeyValueObserverNotification) didChangeValueForKey:]() #4 0x27463738 in -[UIView(Geometry) _applyISEngineLayoutValues]() #5 0x273898ee in -[UIView(Geometry) _resizeWithOldSuperviewSize:]() #6 0x23dff6ee in __53-[__NSArrayM enumerateObjectsWithOptions:usingBlock:]_block_invoke() #7 0x23dff5ea in -[__NSArrayM enumerateObjectsWithOptions:usingBlock:]() #8 0x2737a54a in -[UIView(Geometry) resizeSubviewsWithOldSize:]() #9 0x2746389c in -[UIView(AdditionalLayoutSupport) _is_layout]() #10 0x2760dbd4 in -[UIView(Hierarchy) _updateConstraintsAsNecessaryAndApplyLayoutFromEngine]() #11 0x27372b36 in -[UIView(CALayerDelegate) layoutSublayersOfLayer:]() #12 0x26d9accc in -[CALayer layoutSublayers]() #13 0x26d966b4 in CA::Layer::layout_if_needed(CA::Transaction*)() #14 0x26d9653c in CA::Layer::layout_and_display_if_needed(CA::Transaction*)() #15 0x26d95f20 in CA::Context::commit_transaction(CA::Transaction*)() #16 0x26d95d24 in CA::Transaction::commit()() #17 0x2736afc4 in _afterCACommitHandler() #18 0x23e9e5cc in __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__() #19 0x23e9bc8a in __CFRunLoopDoObservers() #20 0x23e9c092 in __CFRunLoopRun() #21 0x23dea620 in CFRunLoopRunSpecific() #22 0x23dea432 in CFRunLoopRunInMode() #23 0x2b1980a8 in GSEventRunModal() #24 0x273d4808 in UIApplicationMain() #25 0x0003e3fc in main at /Users/me/Dev/MyApp/iosapp/MyApp/main.m:17
這裏是做在自包含UI元素,它是一個自包含視圖控制器和視圖,其與用於其內部組成的筆尖和經銷商的佈局實施的傳遞的動畫的代碼。
「inView」是傳入的視圖,應包含UI元素(UI元素的父視圖)。 「payPage」是自包含UI元素的視圖控制器。
CGRect payRect = CGRectMake(windowSize.width/2 - pageSize.width/2, windowSize.height/2 - pageSize.height/2 - offset, pageSize.width, pageSize.height); UIGraphicsBeginImageContext(payPage.view.bounds.size); [[[payPage view] layer] renderInContext:UIGraphicsGetCurrentContext()]; //[[payPage view] drawViewHierarchyInRect:payPage.view.bounds afterScreenUpdates:YES];// iOS8 issues with this -- jumps and flickers UIImage *compositeImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext();
UIImageView *compositeImageView = [[UIImageView alloc] initWithImage:compositeImage];
[[payPage view] setAlpha:0.0f];
UIViewController *parentVC = [self visibleVC];
_parentVC = parentVC;
UIView *inView = [(MyStandardViewController *)parentVC localView];
CGRect middleRect = CGRectZero;
if (nil == fromView)
{
middleRect.origin = [[[UIApplication sharedApplication] keyWindow] center];
}
else
{
middleRect.origin = [[fromView superview] convertPoint:[fromView center] toView:inView];
}
[compositeImageView setFrame:middleRect];
_blockingView = [[UIView alloc] initWithFrame:[inView frame]];
[_blockingView setAlpha:0.0f];
[_blockingView setBackgroundColor:BLOCKINGVIEWBACKGROUNDCOLOR];
[inView addSubview:_blockingView];
[inView addSubview:compositeImageView];
[UIView animateWithDuration:2.25f animations:^{
[compositeImageView setFrame:payRect];
[_blockingView setAlpha:1.0f];
}
completion:^(BOOL finished) {
[inView addSubview:[payPage view]];
if (nil != parentVC)
{
[parentVC addChildViewController:payPage];
}
[[payPage view] setFrame:payRect];
[[payPage view] setAlpha:1.0f];
[compositeImageView removeFromSuperview];
}
];
我不知道該怎麼做。我已經在各個地方的父視圖上嘗試了-setTranslatesAutoresizingMaskIntoConstraints:
,其中YES和NO都是。我查看了自包含的UI元素(視圖控制器),添加時沒有這樣做,並且沒有看到任何明顯的差異。我不知道有什麼途徑可以接近,因爲它的代碼是在自動佈局中,應用程序並沒有真正有意識地使用自動佈局,除了在特定的自包含視圖控制器內。