我希望我的 UIView 可以被用户移动,然后移动到 4 个角之一(以最接近用户最终触摸的那个为准)——有点像 FaceTime 中的秒摄像头窗口。有什么现成的方法可以帮助我吗?还是我应该手动计算用户的最后位置与 4 个角之间的距离,并使其动画移动到最近的角?
最佳答案
此方法将 View 动画到其父 View 的最近角...
- (void)pinToCorner:(UIView *)view {
CGPoint parentCenter = view.superview.center;
CGPoint viewCenter = view.center;
CGSize parentSize = view.superview.bounds.size;
CGSize viewSize = view.bounds.size;
CGPoint targetOrigin;
if (viewCenter.x < parentCenter.x && viewCenter.y < parentCenter.y) {
// top left
targetOrigin = CGPointMake(0, 0);
} else if (viewCenter.x < parentCenter.x && viewCenter.y >= parentCenter.y) {
// bottom left
targetOrigin = CGPointMake(0, parentSize.height-viewSize.height);
} else if (viewCenter.x >= parentCenter.x && viewCenter.y < parentCenter.y) {
// top right
targetOrigin = CGPointMake(parentSize.width-viewSize.width, 0);
} else if (viewCenter.x >= parentCenter.x && viewCenter.y >= parentCenter.y) {
// bottom right
targetOrigin = CGPointMake(parentSize.width-viewSize.width, parentSize.height-viewSize.height);
}
CGRect frame = view.frame;
frame.origin.x = targetOrigin.x;
frame.origin.y = targetOrigin.y;
[UIView animateWithDuration:0.5 animations:^{
view.frame = frame;
}];
}
拖动完成后以拖动的 View 作为参数调用此方法。
仅供引用,测试它的完整类(class)...
@interface ViewController ()
@property(assign,nonatomic) CGPoint dragOrigin;
@end
@implementation ViewController
// lazy button creator
- (UIButton *)button {
UIButton *button = (UIButton *)[self.view viewWithTag:32];
if (!button) {
button = [UIButton buttonWithType:UIButtonTypeSystem];
button.tag = 32;
[button setTitle:@"Click Me" forState:UIControlStateNormal];
[button addTarget:self action:@selector(tapped:) forControlEvents:UIControlEventTouchUpInside];
button.frame = CGRectMake(0, 0, 80, 40);
button.center = self.view.center;
[self.view addSubview:button];
UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panned:)];
[button addGestureRecognizer:pan];
}
return button;
}
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
[self button];
}
- (void)tapped:(id)sender {
NSLog(@"Tapped");
}
- (void)panned:(UIPanGestureRecognizer *)gr {
if (gr.state == UIGestureRecognizerStateBegan) {
self.dragOrigin = gr.view.center;
} else if (gr.state == UIGestureRecognizerStateChanged) {
CGPoint translation = [gr translationInView:gr.view];
gr.view.center = CGPointMake(self.dragOrigin.x + translation.x, self.dragOrigin.y + translation.y);
} else if (gr.state == UIGestureRecognizerStateEnded) {
[self pinToCorner:[self button]];
}
}
// pinToCorner implementation from above goes here
关于ios - 用户拖动后将 UIView 固定到 4 个位置之一,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40684777/