Ken*_*and 7 objective-c uiscrollview ios uiedgeinsets ios7
我正在使用UIScrollView作为我的分页滚动视图pagesScrollView.在其中,我放置了专门用于缩放的单独UIScrollViews.在每个内部,我有一个视图,它是应该可缩放的页面项目.所有这些都在带有半透明导航栏的UINavigationController中.
我pagesScrollView有contentInset.top = 64和bounds.origin.y = -64(这对我来说似乎很奇怪,但这就是系统为我自动设置的),这很好用.我的屏幕看起来很棒!
然而,当我滚动pagesScrollView甚至一点点,只要scrollViewWillEndDragging被调用时,pagesScrollView开始动画的变化来自bounds.origin.y = -64于bounds.origin.y = 0这导致我的页面项目由导航栏被遮蔽.
左边是它加载时的样子,右边是我拖动几个像素然后松开后它会在导航栏下滑动(因为bounds.origin.y变为0) .

问题是我没有任何改变边界的代码,并且在各种滚动委托方法中没有任何代码可以做任何事情.我添加了一堆滚动委托方法,只是添加了NSLog(),所以我可以弄清楚改变发生的时间/地点,但是我的代码中没有发生任何事情.
所以,我不知道我可以告诉你什么代码来帮助你.
编辑:我从头开始构建一个新项目以删除所有其他变量..我将一个裸UIViewController放入UINavigationController.我将UIScrollView放入我的View中查看整个视图的大小.以下代码是整个项目.
事实证明,只有在UIScrollView上启用PAGING后才会出现问题(如下所述)!跆拳道?:)
这是一个下载基本项目的链接,只需几行代码即可演示此问题.只需单击滚动视图,您就会看到它随着边界的变化而向上移动.http://inadaydevelopment.com/stackoverflow/WeirdScrollViews.zip
如何在我的滚动视图中启用分页,而不会在滚动和移动导航栏下的所有内容时突然出现限制?
可以将导航栏设置为不透明并避免出现问题,但理想的是具有标准的iOS7行为,以便在内容视图缩放后,允许内容位于导航栏下并且应该通过半透明度正常显示.
- (void) viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
NSArray *colors = @[
[UIColor blueColor],
[UIColor orangeColor],
[UIColor magentaColor],
];
NSArray *zoomerColors = @[
[UIColor greenColor],
[UIColor yellowColor],
[UIColor purpleColor],
];
self.scroller.pagingEnabled = YES;
[self.scroller setContentSize:CGSizeMake(self.scroller.frame.size.width*colors.count, self.scroller.frame.size.height)];
CGRect subviewFrame = CGRectMake(0, 0, 160, 240);
for (int index=0; index < colors.count; index++) {
UIColor *color = [colors objectAtIndex:index];
UIColor *zoomerColor = [zoomerColors objectAtIndex:index];
UIView *subview = [[UIView alloc] initWithFrame:subviewFrame];
subview.backgroundColor = color;
CGRect zoomerFrame = CGRectMake(index*self.scroller.frame.size.width, 0, self.scroller.frame.size.width, self.scroller.frame.size.height);
UIScrollView *zoomer = [[UIScrollView alloc] initWithFrame:zoomerFrame];
[zoomer addSubview:subview];
zoomer.backgroundColor = zoomerColor;
[self.scroller addSubview:zoomer];
}
}
Run Code Online (Sandbox Code Playgroud)
Tom*_*mmy 11
这是一个iOS错误.我创建了以下子类UIScrollView来获取y随着时间的推移会发生什么以及谁在推动它的日志:
@implementation CSScrollView
- (void)setContentOffset:(CGPoint)contentOffset
{
NSLog(@"%0.0f %@", contentOffset.y, [NSThread callStackSymbols]);
NSLog(@"[%@]", self.layer.animationKeys);
[super setContentOffset:contentOffset];
}
@end
Run Code Online (Sandbox Code Playgroud)
(并更改了故事板中的视图类)
释放手指时,会调用一个方法,UIScrollView _smoothScrollDisplayLink:将滚动视图设置为最终位置.根据第二个日志,没有CAAnimation涉及,滚动视图使用自己的显示链接来进行自己的转换.该自定义代码的出现使从动画的错误y = whatever来y = 0,没有采取内容偏移考虑在内.
作为一个概念验证黑客,我将代码更改为:
@implementation CSScrollView
- (void)setContentOffset:(CGPoint)contentOffset
{
contentOffset.y = -64.0f;
[super setContentOffset:contentOffset];
}
@end
Run Code Online (Sandbox Code Playgroud)
而且,毫不奇怪,问题消失了.
你可能不想硬编码,-64.0f但我得出结论:
UIScrollView使用合适的自定义实现的子类拒绝无意义的值来解决它- setContentOffset:.一个明智的通用方法可能是检查state的self.panGestureRecognizer-那将让您滚动用户负责和其他滚动,而不必依赖于任何未公开的API或委托事件的复杂捕捉区分.然后,如果需要,contentOffset.y从当前值中取出正确的值而不是硬编码.
| 归档时间: |
|
| 查看次数: |
8771 次 |
| 最近记录: |