我正在尝试创建一个UIView / UIControl,人们可以向上拖动并显示一个文本框,然后向下拖动以隐藏它。但是,我还没有找到一种方法来使这种“流动” - 它总是似乎停留在随机的地方,不允许任何更多的运动。目前我正在使用UIView作为视图的顶部,这是当前的代码:
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = [touches anyObject];
if ([touch view] == topMenuView) {
CGPoint location = [touch locationInView:self.superview];
CGPoint locationInsideBox = [touch locationInView:self];
CGPoint newLocation = location;
newLocation.x = self.center.x;
newLocation.y = newLocation.y + (self.frame.size.height - locationInsideBox.y) / 2;
if ((self.superview.frame.size.height - newLocation.y) < (self.frame.size.height / 2) && (self.superview.frame.size.height - newLocation.y) > -32)
{
self.center = newLocation;
}
return;
}
}
非常感谢任何帮助!
答案 0 :(得分:1)
我会使用平移手势识别器。以下代码将简单地将视图与用户的手指一起上下移动。如果你想限制它移动的距离,让它快速放置或有动量,你需要添加它。
UIView * view; // The view you're moving
CGRect originalFrame; // The frame of the view when the touch began
- (void) pan:(UIPanGestureRecognizer *)pan {
switch (pan.state) {
case UIGestureRecognizerStateBegan: {
originalFrame = view.frame;
} break;
case UIGestureRecognizerStateChanged:
case UIGestureRecognizerStateEnded: {
CGPoint translation = [pan translationInView:view];
CGRect frame = originalFrame;
frame.origin.y += translation.y;
view.frame = frame;
} break;
}
}
答案 1 :(得分:0)
删除此行可能会对您有所帮助:
newLocation.y = newLocation.y + (self.frame.size.height - locationInsideBox.y) / 2;
答案 2 :(得分:0)
你想要完成的只是一个可滚动的视图,所以我建议使用UIScrollView。
将UIView放在具有透明背景的UIScrollView中,并将UIScrollView放在文本框的顶部。设置正确的contentSize,你就可以了。
答案 3 :(得分:0)
使用uiview动画块更新与接收到的触摸点对应的滑动视图的帧。将动画块的持续时间设置为非常短的.01或更低。
答案 4 :(得分:0)
我建议将问题分成两部分:
This是一个很好的教程,它演示了UIScrollView的正确初始化以及在其中嵌入内容。
自定义视图/控制器是一个更广泛的主题:)