UIRefreshControl需要被拉得太远
我正在尝试在UIRefreshControl
上的项目中实现UICollectionView
。 它按预期工作,但是当它旋转时(一旦用户放手),我需要将UICollectionView
的高度拉大3倍。 我已经看过其他应用程序,你只需要在它旋转refreshControl
的高度。 如何更改需要下拉的金额?
码:
(void)viewDidLoad { [super viewDidLoad]; [self.collectionView setBackgroundColor:[UIColor clearColor]]; self.refreshControl = [UIRefreshControl new]; [self.refreshControl addTarget:self action:@selector(refreshFavorites) forControlEvents:UIControlEventValueChanged]; [self.collectionView addSubview:self.refreshControl]; self.collectionView.alwaysBounceVertical = YES; }
随附图片,以帮助想象我的意思。 我的collectionView
有一行(纯红色)。 red和refreshControl
之间的空间就是我拉下来试图激活refreshControl
。
在这张图片中,我几乎已经激活了控件,我已经在屏幕上拉下了相当多的数量。
在这个图像中,我已经激活了控件并且它开始加载(在它跳跃~20-30像素之后,但它仍然突出显示这是多么重要)
此图像显示控件在激活并处于动画状态后处于“静止”状态。
我已经尝试设置UIRefreshControl
的框架来尝试控制高度,但这不起作用。 我也改变了collectionView:layout:sizeForItemAtIndexPath
的大小,但没有帮助。
如果需要将UIRefreshControl拉得太远而无法触发,则可能是iOS SDK的错误。
我建议使用视图控制器的帮助来解决这种情况:
- (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; // Force update the snapping height of refresh control. [self.refreshControl didMoveToSuperview]; }
此外,如果您不介意使用私有API并需要更准确的控制,您可以这样写:
- (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; @try { [self.refreshControl setValue:@(60) forKey:@"_snappingHeight"]; } @catch (NSException *exception) { } }
这适用于iOS 7-10。 没有App Store审核问题。
看看里面
UIRefreshControl有一个名为snappingHeight的属性。 此属性控制用户需要拉下的距离。 但遗憾的是,此值始终未正确设置,尤其是您具有自定义视图层次结构。
UIRefreshControl有一个私有方法调用_updateSnappingHeight
,这个方法也在didMoveToSuperview
中didMoveToSuperview
。 因此,手动didMoveToSuperview
调用可以更新错误的捕捉值。
对于仍在寻找答案的人。 到目前为止,我有一个明确的,最好的答案……
SWIFT 3:
在viewDidLoad()里面:
self.refresher = UIRefreshControl() self.refresher.tintColor = UIColor.red self.scrollView.addSubview(self.refresher)
Next如果你的View是ViewController – 像这样实现ScrollViewDelegate:
class YourViewController: UIViewController, UIScrollViewDelegate
一旦你将scrollView @IBOulet链接起来……继续并在viewDidLoad()中将scrollView委托设置为self,如下所示:
self.scrollView.delegate = self
接下来,既然您已设置了委托,请设置scrollViewDidScroll函数并实现它,以检查下拉的人是否像这样传递-90:
func scrollViewDidScroll(_ scrollView: UIScrollView) { if scrollView == self.scrollView { if scrollView.contentOffset.y < -90 && !self.refresher.isRefreshing{ self.refresher.beginRefreshing() self.Refresh() print("zz refreshing") } } }
现在,请注意我们没有
self.refresher.addTarget(self, action: #selector(self.Refresh()), for: UIControlEvents.valueChanged)
我们也根本不需要它。 相反,我们调用beginRefresh()后跟实际函数...只需确保在你希望它结束的地方调用endRefresh() 。
在iOS 10.2中存在这个问题所以对于仍然遭受这种情况的人来说,我找到了一种方法来实现它,而无需触及私有API方法(尽管这确实解决了这个问题)。
我发现当设备在iPad上旋转时我遇到了问题。 UIRefreshControl在纵向表现不错,但在旋转设备时会出现问题。 在那之后,无论它处于何种方向都无关紧要,它总是需要拖得太远而不需要被激活。
我的解决方案基于这个答案: 抵消UIRefreshControl
每当设备旋转并且它工作时,我尝试设置UIRefreshControl的框架。 它并不理想,因为它不使用AutoLayout,但它比使用私有API更清洁。
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didRotate:) name:UIDeviceOrientationDidChangeNotification object:nil]; -(void)didRotate:(NSNotification *)notification { [self.refreshControl setFrame:CGRectMake(0, 0, 20, 20)]; [self.refreshControl setNeedsLayout]; }
- 防止iOS Safari中的方向更改
- 在不同的线程上调用我的方法有哪些不同的方法?
- iOS – 如何解码来自iTunes Connect的符号化崩溃报告?
- 隐藏状态栏时,我的导航栏在iOS7中向上移动
- TabBarController之前的启动画面
- 如何解决/处理委派EXC_BAD_ACCESS错误? Obj C
- UIAutomation iOS中的延迟和pushTimeout(),popTimeout()之间的区别
- 如何从UIImageView上传图片到Parse.com
- UIImagePickerController的cameraViewTransform忽略了iOS 10 beta上的“缩放”和“翻译”