2016-03-28 4 views
-2

Я создал представление как ящик. Он содержит UITableview. Когда я перетаскиваю UITableview вниз, вид будет swipedown и контент contentoffset UITableview.y все равно будет 0; Я изменил кадр UITableview в scrollViewDidScroll и scrollViewDidEndDragging, а после анимации UITableview по-прежнему будет перетаскивать его, если я нажму UITableview, не приведет к тому, что ячейка будет выбрана, а VerticalScrollIndicator скроется, после чего UITableview вернется в нормальное состояние.uitableview все еще показывает VerticalScrollIndicator при перетаскивании завершен

- (void)moveWithOffset:(CGFloat)offset { 

CGFloat searchBarTop = _searchBar.top; 
    self.height = SCREEN_HEIGHT-NavBar_HEIGHT; 
    if (offset > 0) { 
     if (GestureViewHeight - _searchBar.top > 0.1) { 
      _gestureView.hidden = YES; 
      searchBarTop = (_searchBar.top+offset) < GestureViewHeight ? (_searchBar.top+offset) : GestureViewHeight; 
     } else { 
      _gestureView.hidden = NO; 
      if (self.top < SCREEN_HEIGHT/2) { 
       self.top = (self.top+offset) < SCREEN_HEIGHT/2 ? (self.top+offset) : SCREEN_HEIGHT/2; 
      } 
     } 
    } else if (offset < 0) { 
     if (self.top - NavBar_HEIGHT > 0.1) { 
      _gestureView.hidden = NO; 
      self.top = (self.top+offset) > 64 ? (self.top+offset) : 64; 
      searchBarTop = GestureViewHeight; 
     } else { 
      _gestureView.hidden = YES; 
      if (searchBarTop > 0) { 
       searchBarTop = (_searchBar.top+offset) > 0 ? (_searchBar.top+offset) : 0; 
      } 
     } 
    } 

[self adjustLayoutWithSearchBarTop:searchBarTop]; 

}

- (void)endMoving { 
if ((int)self.top == NavBar_HEIGHT) { 
    _state = ALDHotScenicSpotSearchViewStateUp; 
} else if ((int)self.top == SCREEN_HEIGHT*2/3) { 
    _state = ALDHotScenicSpotSearchViewStateMiddle; 
} else if ((int)self.top == SCREEN_HEIGHT/2) { 
    _state = ALDHotScenicSpotSearchViewStateDown; 
} else { 
    if (self.top < SCREEN_HEIGHT/3 && _state != ALDHotScenicSpotSearchViewStateUp) { 
     _state = ALDHotScenicSpotSearchViewStateUp; 
    } else if (self.top > SCREEN_HEIGHT/3 && _state != ALDHotScenicSpotSearchViewStateDown) { 
     _state = ALDHotScenicSpotSearchViewStateDown; 
    } else { 
     _state = ALDHotScenicSpotSearchViewStateMiddle; 
    } 
} 
[self animatingToState:_state]; 

}

- (void)animatingToState:(ALDHotScenicSpotSearchViewState)state { 
switch (state) { 
    case ALDHotScenicSpotSearchViewStateUp: 
    { 
     [UIView animateWithDuration:0.3 animations:^{ 
      self.frame = CGRectMake(0, NavBar_HEIGHT, SCREEN_WIDTH, SCREEN_HEIGHT-NavBar_HEIGHT); 
      _gestureView.hidden = YES; 
      [self adjustLayoutWithSearchBarTop:0]; 
     }]; 
    } 
     break; 
    case ALDHotScenicSpotSearchViewStateDown: 
    { 
     [UIView animateWithDuration:0.3 animations:^{ 
      self.frame = CGRectMake(0, SCREEN_HEIGHT/2, SCREEN_WIDTH, SCREEN_HEIGHT/2); 
      _gestureView.hidden = NO; 
      [self adjustLayoutWithSearchBarTop:GestureViewHeight]; 
     }]; 
    } 
     break; 
    case ALDHotScenicSpotSearchViewStateMiddle: 
    { 
     [UIView animateWithDuration:0.3 animations:^{ 
      self.frame = CGRectMake(0, SCREEN_HEIGHT/3, SCREEN_WIDTH, SCREEN_HEIGHT*2/3); 
      _gestureView.hidden = NO; 
      [self adjustLayoutWithSearchBarTop:GestureViewHeight]; 
     }]; 
    } 
     break; 

    default: 
     break; 
} 

}

- (void)adjustLayoutWithSearchBarTop:(CGFloat)top { 
self.frame = CGRectMake(0, self.top, self.width, SCREEN_HEIGHT-self.top); 
_searchBar.frame = CGRectMake(0, top, self.width, 44); 
_tableView.frame = CGRectMake(0, _searchBar.bottom, self.width, self.height-_searchBar.bottom); 

}

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate { 
if (_isSwiping) { 
    _isSwiping = NO; 
    [self endMoving]; 

} 

}

- (void)scrollViewDidScroll:(UIScrollView *)scrollView { 
if (scrollView.contentOffset.y < 0 && !scrollView.isDecelerating && (int)_searchBar.top == 0) { 
    _isSwiping = YES; 
} 
if (_isSwiping) { 
    [self moveWithOffset:-scrollView.contentOffset.y]; 
    scrollView.contentOffset = CGPointMake(0, 0); 
} 

}

+0

Это происходит только тогда, когда я быстро перетаскиваю табличное представление, когда медленно перетаскиваю его, он отлично работает – Brazen

ответ

0

[_tableView setContentOffset: CGPointMake (0, -1) анимированные: ДА]; [_tableView setContentOffset: CGPointMake (0, 0) анимированный: ДА]; add to function adjustLayoutWithSearchBarTop решит проблему. reasom возможно scrollview.isdragging остается верным в scrollViewDidEndDragging.

Смежные вопросы