DrawRect를 통한 UinavationBar 배경 이미지 - 프롬프트 애니메이션 문제
-
06-07-2019 - |
문제
카테고리를 통해 DrawRect를 재정의하여 UinaVigationBar에 사용자 정의 배경 이미지를 추가하고 있습니다.
- ( void )drawRect:( CGRect )rect{ [[UIImage imageNamed:@"navbar.png"] drawInRect:CGRectMake( 0, self.frame.size.height-44, self.frame.size.width, 44 )]; }
이 솔루션은 NavigationItem.prompt 속성을 사용하려고 할 때까지 잘 작동하는 것 같습니다. 프롬프트를 제시하는 부드러운 애니메이션을 수행하는 대신 갑자기 갑자기 수행됩니다.
이것을 해결하는 방법에 대한 제안이 있습니까? 또는 배경 이미지를 설정하는 대체 방법.
추신. 뷰가 푸시/팝 할 때 물건이 재 배열되는 방식으로 인해 배경 이미지를 하위 뷰로 추가하는 것을 피하려고합니다. 그리고 나는 모든 뷰의 ViewDidAppear에서 sendsubviewtoback을 보내는 것을 싫어합니다.
티아!
편집 : 나는 또한 Method Swizzling을 시도했는데 이미지를 늘릴 수 있다면 잘 작동하지만 이미지가 스트레칭 할 수 없으므로 뻗기.
편집 : 아래의 해킹 대답을 참조하십시오
해결책
너무 "해킹"이지만 이것은 내가 원하는 것을 할 수있는 가장 가까운 곳입니다 ...
기본적으로 메소드 스위이즈를 할 때, 단순히 모서리가 둥글게 되었기 때문에 이미지 스트레치가 잘 작동하지 않았습니다. 대신 코너를 별도의 투명 IMG로 만들고 스트레치 애니메이션의 영향을받지 않도록 하위 뷰로 추가했습니다.
그래서 내 카테고리는 이제 이렇게 보입니다 ..
#import "UINavigationBar+custom.h" #define cornersTag 1 @implementation UINavigationBar (UINavigationBarCategory) -(void)setCornersIfNeeded{ UIImageView *corners = (UIImageView*)[self viewWithTag:cornersTag]; if(!corners){ UIImage *img = [[UIImage imageNamed:@"navbar_corners.png"] stretchableImageWithLeftCapWidth:10 topCapHeight:0]; corners = [[[UIImageView alloc] initWithImage:img] autorelease]; corners.frame = CGRectMake(0, 0, self.frame.size.width, img.size.height); corners.tag = cornersTag; [self addSubview:corners]; } } - (void)customDrawRect:( CGRect )rect{ [self customDrawRect:rect]; [[UIImage imageNamed:@"navbar.png"] drawInRect:rect]; [self setCornersIfNeeded]; } @end
Method Swizzling에 대한 자세한 내용은 ... http://www.cocoadev.com/index.pl?methodswizzling그리고 iPhone 장치의 방법 스위 즈