저는 Pinterest에 익숙하지 않아서 당신이하려고하는 것을 정확히 이해했기를 바랍니다.
저는 다소 객관적으로 새로운 것 같습니다. 아마도 훨씬 간단한 방법 일 수 있습니다.
나는 영어 원어민이 아니기 때문에 설명이 불완전하면 말해 주겠다. 나는 그 말을 바꿔 볼 것입니다.
첫째,있는 UIScrollView 위임을 준수하고, 탭 표시 줄 및 탐색 표시 줄 또한
의 원래 프레임을 잡고 2 개 속성을 생성, 인터페이스 빌더 또는 코드 중, 뷰 컨트롤러로 사용자의 스크롤 뷰의 대리자를 설정
ViewController.m
@interface ViewController() <UIScrollViewDelegate>
@property (nonatomic) CGRect navBarFrame;
@property (nonatomic) CGRect tabBarFrame;
@end
그런 다음,있는 viewDidLoad에서, 위의 속성
- (void)viewDidLoad {
[super viewDidLoad]
self.navBarFrame = self.navigationController.navigationBar.frame;
self.tabBarFrame = self.tabBarController.tabBar.frame;
}
이제 우리는 스크롤 뷰의 위임 메타를 사용 설정 od가 스크롤이 시작된시기를 결정합니다.
먼저 우리는 스크롤 탭을 표시하기 위해 종료 될 때
- (void)scrollViewDidBeginDragging:(UIScrollView *)scrollView
{
[UIView animateWithDuration: 0.3
delay: 0
options: UIViewAnimationOptionCurveLinear
animations: ^(void){
CGFloat tabBarX = self.tabBarController.tabBar.frame.origin.x;
CGFloat tabBarWidth = self.tabBarController.tabBar.frame.size.width;
CGFloat tabBarHeight = self.tabBarController.tabBar.frame.size.height;
self.tabBarController.tabBar.frame = CGRectMake(tabBarX, self.view.frame.size.height, tabBarWidth, tabBarHeight);
CGFloat navBarX = self.navigationController.navigationBar.frame.origin.x;
CGFloat navBarWidth = self.navigationController.navigationBar.frame.size.width;
CGFloat navBarHeight = self.navigationController.navigationBar.frame.size.height;
self.navigationController.navigationBar.frame = CGRectMake(navBarX, 0, navBarWidth, navBarHeight);
}
completion: ^(BOOL finished){
if(finished){
[self.tabBarController.tabBar setHidden: YES];
[self.navigationController.navigationBar setHidden: YES];
}
}];
}
이제 우리는 결정이 위임 방법을 사용하는 탐색 및 탭 표시 줄을 숨기려면, 스크롤이 시작될 때 호출되는 대리자로 시작 막대 및 탐색 모음을 다시 엽니 다.
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
if(!decelerate){
[self.tabBarController.tabBar setHidden: NO];
[self.navigationController.navigationBar setHidden: NO];
[UIView animateWithDuration: 0.3
animations: ^(void){
self.tabBarController.tabBar.frame = self.tabBarFrame;
self.navigationController.navigationBar.frame = self.navBarFrame;
}];
}
}
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
[self.tabBarController.tabBar setHidden: NO];
[self.navigationController.navigationBar setHidden: NO];
[UIView animateWithDuration: 0.3
animations: ^(void){
self.tabBarController.tabBar.frame = self.tabBarFrame;
self.navigationController.navigationBar.frame = self.navBarFrame;
}];
}
우리가이 별도의 메소드를 호출하는 이유는 사용자가 스크롤 뷰는 여전히 스크롤 경우에도 (당신이 정말로 빠르게 스크롤 할 때처럼, 스크롤을 중지 할 때마다 첫 번째 호출지고 있다는 것입니다, 그리고 당신은 스크롤을 중지 스크롤 뷰는 여전히 완전히 정지 할 때까지 몇 초 동안 계속 스크롤됩니다.
첫 번째 메소드에는 스크롤이 여전히 스크롤되는지 확인하는 'decelerate'변수도 있습니다.
스크롤 막대가 여전히 스크롤되는 동안 탭 막대와 탐색 막대를 표시하고 싶지 않았기 때문에
첫 번째 방법은 '감속'이 잘못된 경우에만 탐색 및 탭 막대를 다시 표시하는 코드를 실행합니다. 스크롤이 중지 된 것을 의미하는
두 번째 방법은 사용자가 스크롤을 중지 한 후에 스크롤보기를 수행 한 경우와 스크롤이 끝난 후에 만 호출됩니다.
그런 다음 위와 동일한 코드를 실행하여 탭과 탐색 모음을 다시 표시합니다.
우리가 기본적으로하는 일은 탭과 탐색 모음의 프레임을보기 밖으로 이동하거나보기로 이동시키는 애니메이션을 만드는 것입니다.
임의로 애니메이션 길이를 0.3으로 설정했습니다. 바가 더 빨리 또는 더 느리게 표시되거나 숨겨 지도록하려면 다소 시간을 바꿀 수 있습니다.
행운을 빌어 요.
출처를 알려 주셔서 감사합니다. 당신의 설명이 충분히 명확해서 더 이상 구술을 쓸 필요가 없었습니다 .... 나는 당신이 준 방법을 시험해 보았습니다. 그러나 '- (void) scrollViewDidEndDragging : (UIScrollView *) scrollView willDecelerate : (BOOL) 메소드를 감속 시키면 애니메이션이 조금 이상하게 보입니다. 당신이 제안하는대로, 나는 또 다른 방법을 사용할 것입니다. 어쨌든, 정말 고마워요 !!!! –
멋진 코드 조각, 매력처럼 작동합니다! – loretoparisi