마스터-디테일 탐색 컨트롤러에서 부모 및 자식 컨트롤러 사이를 앞뒤로 탐색 할 때 상단 탐색 모음 오른쪽에 어두운 그림자가 표시됩니다. Xcode 5.1로 업그레이드 한 후에 시작되었습니다. 거칠고 산만하게 느껴집니다. 어떻게 제거 할 수 있습니까?
답변:
self.navigationController.view.backgroundColor = [UIColor whiteColor];
내비게이션 컨트롤러 뷰의 배경색을 설정하여이 문제를 해결했습니다.
self.navigationController.navigationBar.translucent = NO;
고쳤다
navigationController.view.backgroundColor = .white
아이폰 OS (11)에 더 이상 작동하지 않습니다
navigationController.view.backgroundColor = .white
은 iOS 12 에서 작동합니다. 필요한 경우 탐색 모음에서 반투명을 제거하는 것은 사용할 수 없지만 검은 그림자는 사용할 수 없습니다.
nonamelive의 대답은 완벽합니다. Interface Builder에서 동일한 작업을 수행하고 여전히 투명성을 유지 하려면 내비게이션 컨트롤러를 선택 view.backgroundColor
하고 스크린 샷 (Identity Inspector에서)에 표시된대로 사용자 정의 런타임 속성 을 설정합니다 . 이 문제를 나타내는 모든 탐색 컨트롤러에 대해 반복합니다.
애니메이션이 시작될 때 CoreGraphics가 스냅 샷을 찍을 때 UINavigationController의 검은 색 (또는 실제로는 색상이 없음)이 누출되어이 모든 문제가 발생하는 것 같습니다. 따라서 흰색으로 설정하면이를 방지 할 수 있습니다.
UINavigationController
하려면 viewController가 아닌 on 으로 설정해야합니다 .
이것은 iOS 7.1에서 도입 된 버그 인 것 같습니다. 제 경우에는 탐색 모음 바로 아래에 위치한 UIToolbar로 인해 발생합니다. 어두운 그림자는 반투명 탭 표시 줄에도 나타납니다.
그림자는 UIToolbar의 배경보기로 인해 발생한 것 같습니다. 이제 전환하는 동안 도구 모음의 배경보기를 숨기는 도구 모음이있는보기 컨트롤러에서이 해결 방법을 사용합니다.
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
UIView *toolbarBackgroundView = [self.toolbar findViewRecursively:^BOOL(UIView *subview, BOOL *stop) {
BOOL isToolbarBackgroundView = ([subview isKindOfClass:[UIImageView class]]
&& [NSStringFromClass(subview.class) isEqualToString:@"_UIToolbarBackground"]);
if (isToolbarBackgroundView) {
*stop = YES;
}
return (! isToolbarBackgroundView);
}];
if (toolbarBackgroundView) {
// fade toolbar background view back in
[UIView animateWithDuration:0.1f animations:^{
toolbarBackgroundView.alpha = 1.0f;
}];
}
}
- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
UIView *toolbarBackgroundView = [self.toolbar findViewRecursively:^BOOL(UIView *subview, BOOL *stop) {
BOOL isToolbarBackgroundView = ([subview isKindOfClass:[UIImageView class]]
&& [NSStringFromClass(subview.class) isEqualToString:@"_UIToolbarBackground"]);
if (isToolbarBackgroundView) {
*stop = YES;
}
return (! isToolbarBackgroundView);
}];
if (toolbarBackgroundView) {
// hide toolbar background view
toolbarBackgroundView.alpha = 0.0f;
}
}
이것은 코드입니다 [UIView findViewRecursively:]
@interface UIView (FindSubview)
- (UIView*)findViewRecursively:(BOOL(^)(UIView* subview, BOOL* stop))recurse;
@end
@implementation UIView (FindSubview)
- (UIView*)findViewRecursively:(BOOL(^)(UIView* subview, BOOL* stop))recurse {
for (UIView* subview in self.subviews) {
BOOL stop = NO;
if (recurse(subview, &stop)) {
UIView* view = [subview findViewRecursively:recurse];
if (view) return view;
} else if (stop) {
return subview;
}
}
return nil;
}
@end
이 레이더를 제출했습니다 : http://openradar.appspot.com/16418845
backgroundView
있습니다. [self.toolbar valueForKey:@"_backgroundView"]
. 이것은 개인 API이지만 _backgroundView
일반적인 이름 이기 때문에 Apple에 잡히지 않을 것이라고 생각합니다 .
반투명 한 막대 (TabBar 또는 ToolBar)에서 발생하는 것 같습니다.
그래서 그것을 고치는 한 가지 방법은 _tabBar.translucent = NO;
(제 경우) 를 설정하는 것입니다 . 이렇게하면 탐색 모음을 반투명으로 유지하면서 상단 탐색 모음 아래에 원하지 않는 그림자가 생기는 것을 방지 할 수 있습니다. 불행히도 하단 막대는 더 이상 반투명하지 않습니다.
반투명으로 다시 설정할 수 있지만이 모든 작업은 전체 푸시 애니메이션이 완료된 후에 발생해야하므로이 속성을 전환하는 것이 눈에 잘 띄게됩니다.
그러나 하단 막대도 반투명해야하며 사용자가 변경 사항을 보지 않기를 원합니다.
/* create a simple quick animation of the bottom bar
just before pushing the new controller */
[UIView animateWithDuration:0.1
animations:^{
_tabBar.barTintColor = [UIColor colorWithWhite:0.97254901960784 alpha:1.0]; // this is the closest color for my case
_tabBar.translucent = NO;
} completion:^(BOOL finished) {
/* now when the animation that makes the bar not translucent
is finished we can push the new controller
the controller is instantiated before the animation code */
[self.navigationController pushViewController:controller animated:YES];
}];
그런 다음 viewDidAppear:
간단히 되돌립니다.
[UIView animateWithDuration:0.1
animations:^{
_tabBar.barTintColor = nil;
_tabBar.translucent = YES;
}];
특히 외형에 약간의 변화가 있지만 거의 눈에 띄지 않으며 탐색 모음 아래에 그림자를 두는 것보다 훨씬 좋습니다.
바는 특히 다른 게시물에서 제안 된 것과는 달리 일부 경우에 막대가 숨겨지기 때문에 Apple이이 동작을 수정할 때까지 다른 사람들이 막대를 반투명하게 유지하는 데 도움이되기를 바랍니다. UITabBar
view.backgroundColor
. 스토리 보드에서 UITabBarController 의 런타임 속성 을 정의하고 흰색으로 설정했습니다.
에 나를 위해이 작품 아이폰 OS (13) 모두 빛 과 어두운 주제와도 이전의 iOS 버전.
application(didFinishLaunchingWithOptions)
메서드 의 AppDelegate에 다음 코드를 추가합니다 .
if #available(iOS 13.0, *) {
window?.backgroundColor = UIColor.systemBackground
} else {
window?.backgroundColor = UIColor.white
}
여기에 내 변형이 있습니다 ... 톰의 대답보다 훨씬 적은 코드가 필요하며 더 효율적입니다. 반투명 탐색 모음을 원하고 그림자 문제를 수정하려는 경우입니다.
소스 ViewController (탐색 컨트롤러에 포함됨)에서 ...
- (void)viewDidAppear:(BOOL)animated
{
self.navigationController.navigationBar.translucent = YES;
}
과
- (void)viewWillDisappear:(BOOL)animated
{
self.navigationController.navigationBar.translucent = NO;
}
결과는 Tom이 수행하는 작업 (시각적으로 최종 사용자에게)과 동일하며 구현하기가 더 쉽습니다. 도움이 되었기를 바랍니다...
self.navigationController!.navigationBar.translucent = false;
이것은 새로운 ViewController를 푸시하는 함수 내부에 배치합니다.
기본 iOS 구현과 동일하지는 않지만 문제를 해결하는 좋은 방법입니다.
- (void)viewWillAppear:(BOOL)animated {
[UIView animateWithDuration:0.35f animations:^{
self.tabBarController.tabBar.alpha = 1.0f;
}];
}
- (void)viewWillDisappear:(BOOL)animated {
[UIView animateWithDuration:0.35f animations:^{
self.tabBarController.tabBar.alpha = 0.0f;
}];
}
탭 바의 멋진 페이드 인 / 페이드 아웃 애니메이션을 얻을 수 있습니다. 루트에 코드를 추가합니다 UIViewController
.
darkColor
보기가 여전히있는 것처럼 보이며이 문제를 발생시킵니다.