0

Очень похоже на UIRefreshControl, я пытаюсь поместить UIView поверх UITableView. Перетаскивание вниз по экрану таблицы должно показывать представление и оставаться там. Перетаскивание должно скрыть его снова, а затем прокрутить представление таблицы. Когда скрытый просмотр таблицы должен прокручиваться нормально. Прокрутка назад в верхнюю часть должна либо снова открыть скрытый вид, либо привязать к скрытому состоянию. В конечном итоге открытое представление должно содержать некоторые кнопки или сегментированный элемент управления. Он должен выглядеть и вести себя очень похоже на приложение OmniFocus.Добавить скрытый UIView в UITableView, похожий на UIRefreshControl

Hidden Посмотреть в OmniFocus Hidden View in OmniFocus

Показали Смотреть в OmniFocus Revealed View in OmniFocus

Это насколько я получил. Особенно привязка назад к скрытому состоянию, когда прокручивание спинки стола не работает. Если у вас будет время, вы окажетесь в середине вид сверху, чего я не хочу.

static CGFloat const kTopViewHeight = 40; 

@interface ViewController() 
@property (nonatomic, weak) UIView *topView; 
@property (nonatomic, assign) CGFloat dragStartY; 
@end 

@implementation ViewController 

#pragma mark - View Lifecycle 

- (void)viewDidLoad 
{ 
    CGRect topViewFrame = CGRectMake(0.0, -kTopViewHeight, 320, kTopViewHeight); 

    UIView *myView = [[UIView alloc] initWithFrame:topViewFrame]; 
    myView.backgroundColor = [UIColor greenColor]; // DEBUG 
    self.topView = myView; 
    [self.tableView addSubview:myView]; 
} 

#pragma mark - UIScrollViewDelegate 

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView 
{ 
    NSLog(@"scrollViewWillBeginDragging %@", NSStringFromCGPoint(scrollView.contentOffset)); 
    self.dragStartY = scrollView.contentOffset.y; 
} 

- (void)scrollViewDidScroll:(UIScrollView *)scrollView 
{ 
    NSLog(@"scrollViewDidScroll %@", NSStringFromCGPoint(scrollView.contentOffset)); 
    if (scrollView.contentOffset.y > 0) { 
     // reset the inset 
     scrollView.contentInset = UIEdgeInsetsZero; 
    } else if (scrollView.contentOffset.y >= -kTopViewHeight) { 
     // set the inset for the section headers 
     scrollView.contentInset = UIEdgeInsetsMake(-scrollView.contentOffset.y, 0, 0, 0); 
    } else if (scrollView.contentOffset.y < -kTopViewHeight) { 
     // don't scroll further when the topView's height is reached 
     scrollView.contentInset = UIEdgeInsetsMake(-kTopViewHeight, 0, 0, 0); 
     scrollView.contentOffset = CGPointMake(0, -kTopViewHeight); 
    } 
} 

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate 
{ 
    NSLog(@"scrollViewDidEndDragging %@", NSStringFromCGPoint(scrollView.contentOffset)); 
    CGFloat yOffset = scrollView.contentOffset.y; 

    if (yOffset < 0) { 
     BOOL dragDown = self.dragStartY > yOffset; 
     CGFloat dragThreshold = 10; 

     if (dragDown) { 
      if (yOffset <= -dragThreshold) { 
       [self snapDown:YES scrollView:scrollView]; 
      } else { 
       [self snapDown:NO scrollView:scrollView]; 
      } 
     } else if (!dragDown) { 
      if (yOffset >= dragThreshold - kTopViewHeight) { 
       [self snapDown:NO scrollView:scrollView]; 
      } else { 
       [self snapDown:YES scrollView:scrollView]; 
      } 
     } 
    } 
} 

- (void)snapDown:(BOOL)down scrollView:(UIScrollView *)scrollView 
{ 
    [UIView animateWithDuration:0.3 
          delay:0 
         options:UIViewAnimationOptionAllowUserInteraction|UIViewAnimationOptionCurveEaseOut|UIViewAnimationOptionBeginFromCurrentState 
        animations:^{ 
         if (down) { 
          // snap down 
          scrollView.contentOffset = CGPointMake(0, -kTopViewHeight); 
          scrollView.contentInset = UIEdgeInsetsMake(kTopViewHeight, 0, 0, 0); 
         } else { 
          // snap up 
          scrollView.contentOffset = CGPointMake(0, 0); 
          scrollView.contentInset = UIEdgeInsetsZero; 
         } 
        } 
        completion:nil]; 
} 

ответ

-1
//paging for data you can use this spinner 

    spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]; 
     [spinner stopAnimating]; 
     spinner.hidesWhenStopped = NO; 
     spinner.frame = CGRectMake(0, 0, 320, 44); 
     tblView.tableFooterView = spinner; 
     tblView.tableFooterView.hidden = YES; 

#pragma mark Table pull to refresh data.... 

    - (void)scrollViewDidEndDragging:(UIScrollView *)aScrollView 
         willDecelerate:(BOOL)decelerate{ 

     CGPoint offset = aScrollView.contentOffset; 
     CGRect bounds = aScrollView.bounds; 
     CGSize size = aScrollView.contentSize; 
     UIEdgeInsets inset = aScrollView.contentInset; 
     float y = offset.y + bounds.size.height - inset.bottom; 
     float h = size.height; 

     float reload_distance = 50; 
     if(y > h + reload_distance && _nextPage) { 
      NSLog(@"load more data"); 
      tblView.tableFooterView.hidden = NO; 
// index for new page of data will increment here 
      index = index + 1; 
      [spinner startAnimating]; 
      [self performSelector:@selector(requestData) withObject:nil afterDelay:1.0f]; 
     } 
    } 

    // when you request for data and wants to stop spinner 

    CGPoint offset = tblView.contentOffset; 
    // if new page is there set bool 
      _nextPage = YES; 
    // want to remove spinner 
      tblView.tableFooterView.hidden = YES; 
      [spinner stopAnimating]; 
      [tblView setContentOffset:offset animated:NO]; 
+0

Может быть, я не ясно, но я не ищу, чтобы заменить UIRefreshControl и я не нужна функциональность обновления. Это должен быть просто статический вид с UISegmentedControl, который выглядит LIKE UIRefreshControl с точки зрения того, что он сидит поверх UITableView и обнаруживается при панорамировании. – Simon

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