ios - 用户拖动后将 UIView 固定到 4 个位置之一

标签 ios objective-c uiview

我希望我的 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/

相关文章:

javascript - 如何覆盖 console.log

ios - 导航 Controller 不显示后退按钮

ios - Swift:如何从字典中删除空值?

ios - UICollectionView 页眉和页脚 View

iphone - 如何捕获UIView中CG内容的触摸事件?

ios - UITableView 索引超出范围

ios - shouldChangeCharactersInRange 从 UITextField 返回第二个字符

objective-c - 在 View Controller 的实现和头文件中出现“@interface ViewController”的原因

ios - 如何从 NSString 获取特定字节长度的子字符串

ios - UIView 作为 UIImageView 的父级