gpt4 book ai didi

ios - 调整 UITableView 的大小,如 Rdio iOS 应用程序中所示

转载 作者:可可西里 更新时间:2023-11-01 05:13:08 26 4
gpt4 key购买 nike

我试图复制在 iOS 应用 Rdio 中看到的屏幕大小调整行为。有问题的屏幕提供了所选专辑的概览,并在上半部分包含一个 UIView,在下半部分包含一个 UITableView。当 tableView 滚动时,它首先向上调整大小以填充屏幕,然后在达到最大高度后开始正常滚动其内容。

经过一番搜索,我发现了这个问题:Dragging UITableView这基本上要求相同的东西,但是它接受的方法与我最初的想法和试验相同,即使用 UIPanGestureRecognizer 并根据平移的平移调整 tableviews 高度。

提供我正在寻找的行为。使用此方法仅允许您静态向上或向下拖动 tableviews 的高度,并且它会增加 panGesture 覆盖 tableViews 的问题,从而阻止滚动内容。

Rdio 应用的调整大小行为和感觉完全就像一个 UIScrollView,它有惯性。您可以一直拖动它,向上或向下轻拂它,然后它会平滑地调整大小。当 tableView 达到其全尺寸或原始尺寸的一半时,剩余的惯性似乎传递到 tableview 上,导致单元格像通常那样滚动。我知道他们一定是在操纵 UIScrollViews,我只是不知道如何操作。

最后一点,我最终会在此屏幕上使用 AutoLayout,所以我想知道这将如何潜在地阻碍或帮助这种情况。

更新

到目前为止,这种方法使我最接近我正在寻找的行为。向上轻弹 tableView 的行为与我想要的完全一样(随着惯性调整大小并在达到最大高度时继续滚动),尽管灵敏度低于我想要的。然而,向下轻弹不会提供惯性并立即停止。

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
CGRect scrollViewFrame = scrollView.frame;
CGFloat scrollViewYOffset = scrollView.contentOffset.y;

if (scrollViewFrame.origin.y <= kTableViewMaxYOrigin || scrollViewFrame.origin.y <= _originalTableViewFrame.origin.y)
{
scrollViewFrame.origin.y -= scrollViewYOffset;

if(scrollViewFrame.origin.y >= kTableViewMaxYOrigin && scrollViewFrame.origin.y <= _originalTableViewFrame.origin.y)
{
scrollViewFrame.size.height += scrollViewYOffset;
scrollView.frame = scrollViewFrame;
scrollView.contentOffset = CGPointZero;
}
}
}

最佳答案

我制作了一个使用自动布局的版本。我花了一段时间试错才把这个弄对!

请使用评论,如果答案不清楚,请问我。

viewDidLoad 中保存布局约束的初始高度,确定您希望 ScrollView 的最低高度。

- (void)viewDidLoad
{
...
_initialTopLayoutConstraintHeight = self.topLayoutConstraint.constant;
...
}

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
BOOL leaveScrollAlone = self.topLayoutConstraint.constant == _initialTopLayoutConstraintHeight && scrollView.contentOffset.y <= 0;
if (leaveScrollAlone)
{
// This allows for bounce when swiping your finger downwards and reaching the stopping point
return;
}

// Do some capping of that layout constraint to keep it from going past the range you want it to be.
// In this case, I use self.topLayoutGuide.length so that my UICollectionView scales all the way until
// it hits the bottom of the navigation bar
CGFloat topLayoutConstraintLength = _initialTopLayoutConstraintHeight - scrollView.contentInset.top;
topLayoutConstraintLength = MAX(topLayoutConstraintLength, self.topLayoutGuide.length);
topLayoutConstraintLength = MIN(topLayoutConstraintLength, _initialTopLayoutConstraintHeight);
self.topLayoutConstraint.constant = topLayoutConstraintLength;


// Keep content seemingly still while the UICollectionView resizes
if (topLayoutConstraintLength > self.topLayoutGuide.length)
{
scrollView.contentInset = UIEdgeInsetsMake(scrollView.contentInset.top + scrollView.contentOffset.y,
scrollView.contentInset.left,
scrollView.contentInset.bottom,
scrollView.contentInset.right);

scrollView.contentOffset = CGPointZero;
}

// This helps get rid of the extraneous contentInset.top we accumulated for keeping
// the content static while the UICollectionView resizes
if (scrollView.contentOffset.y < 0)
{
self.topLayoutConstraint.constant -= scrollView.contentOffset.y;

scrollView.contentInset = UIEdgeInsetsMake(scrollView.contentInset.top + scrollView.contentOffset.y,
scrollView.contentInset.left,
scrollView.contentInset.bottom,
scrollView.contentInset.right);
}

// Prevents strange jittery artifacts
[self.view layoutIfNeeded];
}

关于ios - 调整 UITableView 的大小,如 Rdio iOS 应用程序中所示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18685888/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com