Skip to content

Commit

Permalink
FIX: hideNoMore, pullingPercent, and happen offset in ios11
Browse files Browse the repository at this point in the history
  • Loading branch information
SolaWing committed Jun 7, 2018
1 parent 1884570 commit aa7dea2
Show file tree
Hide file tree
Showing 7 changed files with 88 additions and 30 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IDEDidComputeMac32BitWarning</key>
<true/>
</dict>
</plist>
38 changes: 25 additions & 13 deletions SWRefresh/SWRefreshAutoFooterViewModel.m
Original file line number Diff line number Diff line change
Expand Up @@ -64,23 +64,29 @@ __unsafe_unretained bool(^canAutoRefresh)() = ^bool{
self.state != SWRefreshStateNoMoreData &&
!self.scrollView.isTracking);
};
if ([self isRefreshing] ||
(self.pullingLength <= 0 && !canAutoRefresh())
) { return; }
if ( [self isRefreshing] ) { return; }

CGFloat pullingOffsetY = [self pullingOffsetY];
CGFloat offsetY = self.scrollView.contentOffset.y;

if (self.pullingLength > 0) { // 计算percent
// 开始改变pullingPercent的位置
CGFloat happendOffsetY = pullingOffsetY - self.pullingLength;
if (offsetY < happendOffsetY) { return; }

self.pullingPercent = (offsetY - happendOffsetY) / self.pullingLength;

if (!canAutoRefresh()) { return; }
CGFloat pullingPercent = ^CGFloat{
if (self.pullingLength > 0) { // 计算percent
// 开始改变pullingPercent的位置
CGFloat happendOffsetY = pullingOffsetY - self.pullingLength;
if (offsetY < happendOffsetY) {
return 0;
} else {
return (offsetY - happendOffsetY) / self.pullingLength;
}
} else {
return offsetY > pullingOffsetY ? 1 : 0;
}
}();
if (self.pullingPercent != pullingPercent) {
self.pullingPercent = pullingPercent;
}
if (pullingOffsetY < offsetY) {

if (pullingOffsetY < offsetY && canAutoRefresh()) {
CGFloat bounceOffset = self.scrollView.contentSize.height
+ self.scrollView.contentInset.bottom - self.scrollView.frame.size.height;
if (offsetY <= bounceOffset) {
Expand All @@ -107,7 +113,13 @@ - (void)changeFromState:(SWRefreshState)oldState to:(SWRefreshState)newState {
}

- (CGFloat)pullingOffsetY {
UIEdgeInsets inset = self.scrollView.contentInset;
UIEdgeInsets inset = ^{
if (@available(iOS 11.0, *)) {
return self.scrollView.adjustedContentInset;
} else {
return self.scrollView.contentInset;
}
}();
// 自动触发点在刚显示view, 加上偏移值
CGFloat bounceOffset = self.scrollView.contentSize.height
+ inset.bottom - self.scrollView.frame.size.height;
Expand Down
5 changes: 4 additions & 1 deletion SWRefresh/SWRefreshBackFooterViewModel.m
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,10 @@ - (void)scrollViewContentOffsetDidChange:(NSDictionary *)change {
CGFloat happendOffsetY = [self happendOffsetY];

// 没达到临界点
if ( happendOffsetY > offset.y ) return;
if (happendOffsetY > offset.y) {
if (self.pullingPercent > 0) { self.pullingPercent = 0; }
return;
}

CGFloat pullingPercent = (offset.y - happendOffsetY) / _refreshThreshold;

Expand Down
13 changes: 11 additions & 2 deletions SWRefresh/SWRefreshController.m
Original file line number Diff line number Diff line change
Expand Up @@ -90,13 +90,14 @@ - (void)updateHeaderViewFrame {
@implementation SWRefreshFooterController

- (void)dealloc {
self.footerModel = nil;
self.scrollView = nil;
}

+ (instancetype)newWithFooterView:(UIView<SWRefreshView> *)footerView model:(SWRefreshFooterViewModel *)model {
SWRefreshFooterController* ctrl = [self new];
ctrl->_footerView = footerView;
ctrl->_footerModel = model;
ctrl.footerModel = model;
return ctrl;
}

Expand All @@ -121,7 +122,7 @@ - (void)setScrollView:(UIScrollView *)scrollView {
[self layoutFooterView];
}
if (_footerModel) {
_footerModel.scrollView = [self isFooterVisible]?_scrollView:nil;
_footerModel.scrollView = (_scrollView && [self isFooterVisible])?_scrollView:nil;
}
}
}
Expand All @@ -130,10 +131,12 @@ - (void)setFooterModel:(__kindof SWRefreshFooterViewModel *)footerModel {
if (_footerModel != footerModel) {
if (_footerModel) {
_footerModel.scrollView = nil;
[_footerModel removeObserver:self forKeyPath:@"state"];
}
_footerModel = footerModel;
if (_footerModel) {
_footerModel.scrollView = [self isFooterVisible]?_scrollView:nil;
[_footerModel addObserver:self forKeyPath:@"state" options:NSKeyValueObservingOptionOld context:@"state"];
}
}
}
Expand Down Expand Up @@ -184,6 +187,12 @@ - (void)observeValueForKeyPath:(nullable NSString *)keyPath ofObject:(nullable i
[self updateFooterViewFrame];
[self updateFooterVisible];
}
} else if (@"state" == context) {
SWRefreshState o = [change[NSKeyValueChangeOldKey] integerValue];
SWRefreshState n = _footerModel.state;
if (_hideWhenNoMore && o != n && (o == SWRefreshStateNoMoreData || n == SWRefreshStateNoMoreData) ) {
[self updateFooterVisible];
}
}
}

Expand Down
27 changes: 20 additions & 7 deletions SWRefresh/SWRefreshHeaderViewModel.m
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,8 @@ - (void)unbindScrollView:(UIScrollView *)scrollView {

- (void)scrollViewContentOffsetDidChange:(NSDictionary *)change {
CGPoint offset = self.scrollView.contentOffset;
UIEdgeInsets _scrollViewOriginInsets = self.scrollViewOriginInsets;
if (self.state == SWRefreshStateRefreshing) {
UIEdgeInsets _scrollViewOriginInsets = self.scrollViewOriginInsets;
if ( self.scrollView.dragging ) {
// Keep header, inset 应该在 origin top inset 和 加上高度之前
UIEdgeInsets inset = self.scrollView.contentInset;
Expand All @@ -34,13 +34,12 @@ - (void)scrollViewContentOffsetDidChange:(NSDictionary *)change {
return;
}

// inset可能改变, 改为父类监听修改
// _scrollViewOriginInsets = self.scrollView.contentInset;
// 刚好出现offset
CGFloat happendOffsetY = -_scrollViewOriginInsets.top;

CGFloat happendOffsetY = [self happendOffsetY];
// 没达到临界点
if ( happendOffsetY < offset.y ) return;
if ( happendOffsetY < offset.y ) {
if (self.pullingPercent > 0) { self.pullingPercent = 0; }
return;
}

CGFloat pullingPercent = (happendOffsetY - offset.y) / _refreshThreshold;

Expand All @@ -60,6 +59,20 @@ - (void)scrollViewContentOffsetDidChange:(NSDictionary *)change {
}
}

/// 刚好出现offset
- (CGFloat)happendOffsetY {
// inset可能改变, 改为父类监听修改
// _scrollViewOriginInsets = self.scrollView.contentInset;
UIEdgeInsets _scrollViewOriginInsets = self.scrollViewOriginInsets;
if (@available(iOS 11.0, *)) {
UIEdgeInsets c = self.scrollView.contentInset;
UIEdgeInsets adjust = self.scrollView.adjustedContentInset;
return -_scrollViewOriginInsets.top - (adjust.top - c.top);
} else {
return -_scrollViewOriginInsets.top;
}
}

- (void)changeFromState:(SWRefreshState)oldState to:(SWRefreshState)newState {
NSAssert([NSThread isMainThread], @"should change state in main thread!");
if (!self.weakScrollView) {return;}
Expand Down
18 changes: 11 additions & 7 deletions SWRefreshExample/Base.lproj/Main.storyboard
Original file line number Diff line number Diff line change
@@ -1,16 +1,20 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="9060" systemVersion="14F1509" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="JvY-Ub-j1K">
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="14113" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="JvY-Ub-j1K">
<device id="retina4_0" orientation="portrait">
<adaptation id="fullscreen"/>
</device>
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="9051"/>
<deployment version="2048" identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14088"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<scenes>
<!--Navigation Controller-->
<scene sceneID="6FH-n3-z9j">
<objects>
<navigationController id="JvY-Ub-j1K" sceneMemberID="viewController">
<navigationBar key="navigationBar" contentMode="scaleToFill" id="q4v-HN-hZk">
<rect key="frame" x="0.0" y="0.0" width="320" height="44"/>
<rect key="frame" x="0.0" y="20" width="320" height="44"/>
<autoresizingMask key="autoresizingMask"/>
</navigationBar>
<connections>
Expand All @@ -30,9 +34,9 @@
<viewControllerLayoutGuide type="bottom" id="wfy-db-euE"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC">
<rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
<rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</view>
<navigationItem key="navigationItem" title="DEMO" id="9FJ-iu-eAK"/>
</viewController>
Expand Down
9 changes: 9 additions & 0 deletions SWRefreshExample/TableViewController.m
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,10 @@ - (void)viewDidLoad {
SWRefreshingBlock block = ^(SWRefreshViewModel* model){
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 2* NSEC_PER_SEC),
dispatch_get_main_queue(), ^{
if (weak_tableView.refreshFooterModel.state == SWRefreshStateNoMoreData) {
[weak_self.dataSource removeAllObjects];
[weak_tableView.refreshFooterModel resetNoMoreData];
}
for (int i = 0; i < 3; ++i) {
[weak_self.dataSource addObject:[NSDate date].description];
}
Expand All @@ -61,6 +65,8 @@ - (void)viewDidLoad {
});
};
tableView.refreshFooter = [SWRefreshFooterView footerWithRefreshingBlock:block];
// comment this to see nomore state
tableView.refreshFooter.hideWhenNoMore = true;

tableView.contentInset = UIEdgeInsetsMake(50, 0, 0, 0);
CGRect frame = tableView.bounds;
Expand All @@ -72,6 +78,9 @@ - (void)viewDidLoad {
insetTopLabel.textAlignment = NSTextAlignmentCenter;
[tableView addSubview:insetTopLabel];

// if (@available(iOS 11.0, *)) {
// tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
// }
tableView.refreshHeader.headerOffset = 50;
}

Expand Down

0 comments on commit aa7dea2

Please sign in to comment.