Очень похоже на UIRefreshControl, я пытаюсь поместить UIView поверх UITableView. Перетаскивание вниз по экрану таблицы должно показывать представление и оставаться там. Перетаскивание должно скрыть его снова, а затем прокрутить представление таблицы. Когда скрытый просмотр таблицы должен прокручиваться нормально. Прокрутка назад в верхнюю часть должна либо снова открыть скрытый вид, либо привязать к скрытому состоянию. В конечном итоге открытое представление должно содержать некоторые кнопки или сегментированный элемент управления. Он должен выглядеть и вести себя очень похоже на приложение OmniFocus.Добавить скрытый UIView в UITableView, похожий на UIRefreshControl
Hidden Посмотреть в OmniFocus
Показали Смотреть в 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];
}
Может быть, я не ясно, но я не ищу, чтобы заменить UIRefreshControl и я не нужна функциональность обновления. Это должен быть просто статический вид с UISegmentedControl, который выглядит LIKE UIRefreshControl с точки зрения того, что он сидит поверх UITableView и обнаруживается при панорамировании. – Simon