实施 previousScrollViewYOffset 不起作用
implement previousScrollViewYOffset not work
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
CGRect frame = self.navigationController.navigationBar.frame;
CGFloat size = frame.size.height - 21;
CGFloat framePercentageHidden = ((20 - frame.origin.y) / (frame.size.height - 1));
CGFloat scrollOffset = scrollView.contentOffset.y;
CGFloat scrollDiff = scrollOffset - self.previousScrollViewYOffset;
CGFloat scrollHeight = scrollView.frame.size.height;
CGFloat scrollContentSizeHeight = scrollView.contentSize.height + scrollView.contentInset.bottom;
if (scrollOffset <= -scrollView.contentInset.top) {
frame.origin.y = 20;
} else if ((scrollOffset + scrollHeight) >= scrollContentSizeHeight) {
frame.origin.y = -size;
} else {
frame.origin.y = MIN(20, MAX(-size, frame.origin.y - scrollDiff));
}
[self.navigationController.navigationBar setFrame:frame];
[self updateBarButtonItems:(1 - framePercentageHidden)];
self.previousScrollViewYOffset = scrollOffset;
}
错误:
属性 'previousScrollViewYOffset' 未在 'HomeScreen'
类型的对象上找到
@interface HomeScreen : UITableViewController <UIScrollViewDelegate,UIScrollViewAccessibilityDelegate>
我添加了 ScrollViewDelegate 为什么看不到 previousScrollViewYOffset 有什么想法?
声明您的 class 符合 UIScrollViewDelegate 协议并不会授予它访问其他属性的权限。这意味着您的 class 将实现委托协议中指定的方法,因此您的 class 可以支持 UIScrollView 作为其委托。所以,声明你的 class 是一个 UIScrollViewDelegate 所做的就是启用你发布的方法。
关于您收到的错误,您应该尝试自己创建 previousScrollViewYOffset 属性 并使用 0 等值对其进行初始化。
我从未尝试过创建这种特定效果,所以我可以关闭,但看起来 previousScrollViewYOffset 是您每次调用 ScrollViewDidScroll 时计算的 class 上的 属性 .下次调用此方法时将使用该计算的结果。如果是这种情况,您需要自己创建 属性,并在 class 的初始化方法中对其进行初始化。
试一试 [编辑添加代码] 让我知道进展如何:
在你的.h中:
@property CGFloat thisFloat;
在您的 .m 顶部:
@synthesize thisFloat;
在你的初始化方法中:
thisFloat = 0.0;
将其设为 属性 并对其进行合成的替代方案 - 因为外部 classes 无法访问 属性 - 您可以将其声明为私有变量.m 是这样的:
@implementation HomeScreen {
CGFloat previousScrollViewYOffset;
}
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
CGRect frame = self.navigationController.navigationBar.frame;
CGFloat size = frame.size.height - 21;
CGFloat framePercentageHidden = ((20 - frame.origin.y) / (frame.size.height - 1));
CGFloat scrollOffset = scrollView.contentOffset.y;
CGFloat scrollDiff = scrollOffset - self.previousScrollViewYOffset;
CGFloat scrollHeight = scrollView.frame.size.height;
CGFloat scrollContentSizeHeight = scrollView.contentSize.height + scrollView.contentInset.bottom;
if (scrollOffset <= -scrollView.contentInset.top) {
frame.origin.y = 20;
} else if ((scrollOffset + scrollHeight) >= scrollContentSizeHeight) {
frame.origin.y = -size;
} else {
frame.origin.y = MIN(20, MAX(-size, frame.origin.y - scrollDiff));
}
[self.navigationController.navigationBar setFrame:frame];
[self updateBarButtonItems:(1 - framePercentageHidden)];
self.previousScrollViewYOffset = scrollOffset;
}
错误: 属性 'previousScrollViewYOffset' 未在 'HomeScreen'
类型的对象上找到@interface HomeScreen : UITableViewController <UIScrollViewDelegate,UIScrollViewAccessibilityDelegate>
我添加了 ScrollViewDelegate 为什么看不到 previousScrollViewYOffset 有什么想法?
声明您的 class 符合 UIScrollViewDelegate 协议并不会授予它访问其他属性的权限。这意味着您的 class 将实现委托协议中指定的方法,因此您的 class 可以支持 UIScrollView 作为其委托。所以,声明你的 class 是一个 UIScrollViewDelegate 所做的就是启用你发布的方法。
关于您收到的错误,您应该尝试自己创建 previousScrollViewYOffset 属性 并使用 0 等值对其进行初始化。
我从未尝试过创建这种特定效果,所以我可以关闭,但看起来 previousScrollViewYOffset 是您每次调用 ScrollViewDidScroll 时计算的 class 上的 属性 .下次调用此方法时将使用该计算的结果。如果是这种情况,您需要自己创建 属性,并在 class 的初始化方法中对其进行初始化。
试一试 [编辑添加代码] 让我知道进展如何:
在你的.h中:
@property CGFloat thisFloat;
在您的 .m 顶部:
@synthesize thisFloat;
在你的初始化方法中:
thisFloat = 0.0;
将其设为 属性 并对其进行合成的替代方案 - 因为外部 classes 无法访问 属性 - 您可以将其声明为私有变量.m 是这样的:
@implementation HomeScreen {
CGFloat previousScrollViewYOffset;
}