情况:我有一个排序工具栏(不是UIToolbar,只是一个自定义的UIView),它位于我视图的顶部。此工具栏有许多按钮。在它下面,我有一个表格的滚动视图。当点击工具栏上的按钮时,相应的表格应该从右侧或左侧动画到屏幕上,具体取决于点击的按钮。我不希望工具栏移动到此。但是,当用户在滚动视图上向上或向下滚动时,我确实希望工具栏向上滚动。我现在完成它的方法是在scrollViewDidScroll委托方法中(注意我只允许水平滚动,如果是按下工具栏上的按钮):
-(void)scrollViewDidScroll:(UIScrollView *)scrollView
{
if(scrollView.contentOffset.x != 0 && _shouldScrollHorizontally == NO)
{
CGPoint offset = scrollView.contentOffset;
offset.x = 0;
scrollView.contentOffset = offset;
}
CGRect buttonFrame = [_buttons frame];
buttonFrame.origin.y = -scrollView.contentOffset.y + 10;
[_buttons setFrame:buttonFrame];
}
但是,我担心这样做效率低,会造成一些延迟。我想知道是否有更好的方法来实现我想要实现的目标。
在一天结束时,如果滚动视图水平滚动,我希望工具栏保持静止,但如果滚动视图垂直滚动,则希望工具栏与滚动视图一起移动。
感谢您的任何建议!
答案 0 :(得分:1)
由于仅在点按按钮时允许水平“滚动”,因此请将UIScrollView
contentSize
宽度设置为适当的屏幕宽度及其高度。要在按钮水龙头上“水平滚动”,只需为水平移动视图设置动画。
视图层次结构类似于outerView
,它是您将UIScrollView contentSize
设置为当前的宽度和高度。滚动视图是outerView
的子视图,工具栏是滚动视图的子视图。
要为水平移动设置动画,通常最简单的方法是更改outerView.center
和toolbarView.center
,例如:
CGPoint newCenterPoint; CGPoint newToolbarCenterPoint; CGPoint centerPoint1 = // set center as appropriate CGPoint centerPoint2 = // set center as appropriate CGPoint centerPoint3 = // set center as appropriate CGPoint toolbarCenter1 = // set center as appropriate CGPoint toolbarCenter2 = // set center as appropriate CGPoint toolbarCenter3 = // set center as appropriate if (buttonTapped == button1) { newCenterPoint = centerPoint1; newToolbarCenterPoint = toolbarCenter1; } else if (buttonTapped == button2){ newCenterPoint = centerPoint2; newToolbarCenterPoint = toolbarCenter2; } else if (buttonTapped == button3){ newCenterPoint = centerPoint3; newToolbarCenterPoint = toolbarCenter3; } [UIView animateWithDuration:0.25 animations:^{ outerView.center = newCenterPoint; toolbarView.center = newToolbarCenterPoint; }];