簡體   English   中英

iOS:同時調整大小和旋轉UIView

[英]iOS: Resize and Rotate UIView Concurrently

我正在視圖控制器中使用UIPanGestureRecognizer,試圖根據觸摸位置以一定角度繪制視圖(ArrowView)。 我正在嘗試使用CGAffineTransformRotate來基於第一次觸摸和當前觸摸之間的角度旋轉視圖,但是除非視圖已經被至少20個或更多的像素繪制,否則這將無法工作。 另外,在繪制時,視圖並不總是在我的手指下對齊。 這是針對這種情況的正確方法嗎? 如果沒有,是否有人建議一種更好的方法來實現這一目標? 如果是這樣,我在做什么錯?

ViewController.m

@implementation ViewController {
    ArrowView *_selectedArrowView;
    UIColor *_selectedColor;
    CGFloat _selectedWeight;
    CGPoint _startPoint;
}

- (void)viewDidLoad {
    [super viewDidLoad];

    _selectedColor = [UIColor yellowColor];
    _selectedWeight = 3;

    UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panHandler:)];
    [self.view addGestureRecognizer:pan];
}

- (void) panHandler: (UIPanGestureRecognizer *) sender {
    if (sender.state == UIGestureRecognizerStateBegan) {

        //Instantiate the arrow
        CGPoint touchPoint = [sender locationInView:sender.view];
        _startPoint = touchPoint;
        _selectedArrowView = [[ArrowView alloc] initWithFrame:CGRectMake(touchPoint.x, touchPoint.y, 0, 25) withColor:_selectedColor withWeight:_selectedWeight];
        _selectedArrowView.delegate = self;
        [self.view addSubview:_selectedArrowView];
        [self.view bringSubviewToFront:_selectedArrowView];

    } else if (sender.state == UIGestureRecognizerStateChanged) {

        //"Draw" the arrow based upon finger postion
        CGPoint touchPoint = [sender locationInView:sender.view];
        [_selectedArrowView drawArrow:_startPoint to:touchPoint];
    }
}

@end

ArrowView.m

- (void) drawArrow: (CGPoint) startPoint to: (CGPoint) endPoint {
    startPoint = [self convertPoint:startPoint fromView:self.superview];
    endPoint = [self convertPoint:endPoint fromView:self.superview];

    if (_initialAngle == -1000 /*Initially set to an arbitrary value so I know when the draw began*/) {
        _initialAngle = atan2(startPoint.y - endPoint.y, startPoint.x - endPoint.x);
        [self setPosition:0];
    } else {
        CGFloat ang = atan2(startPoint.y - endPoint.y, startPoint.x - endPoint.x);
        ang -= _initialAngle;
        self.transform = CGAffineTransformRotate(self.transform, ang);

        CGFloat diff = (endPoint.x - self.bounds.size.width);

        NSLog(@"\n\n diff: %f \n\n", diff);
        self.bounds = CGRectMake(0, 0, self.bounds.size.width + diff, self.bounds.size.height);

        _endPoint = CGPointMake(self.bounds.size.width, self.bounds.size.height);
        [self setNeedsDisplay];
    }
}

- (void) setPosition: (CGFloat) anchorPointX {
    CGPoint layerLoc;

    if (anchorPointX == 0) {
        layerLoc = CGPointMake(self.layer.bounds.origin.x, self.layer.bounds.origin.y + (self.layer.bounds.size.height / 2));
    } else {
        layerLoc = CGPointMake(self.layer.bounds.origin.x + self.layer.bounds.size.width, self.layer.bounds.origin.y + (self.layer.bounds.size.height / 2));
    }

    CGPoint superLoc = [self convertPoint:layerLoc toView:self.superview];

    self.layer.anchorPoint = CGPointMake(anchorPointX, 0.5);
    self.layer.position = superLoc;
}

- (CGFloat) pToA: (CGPoint) touchPoint {
    CGPoint start;
    if (_dotButtonIndex == kDotButtonFirst) {
        start = CGPointMake(CGRectGetMaxX(self.bounds), CGRectGetMaxY(self.bounds));
    } else {
        start = CGPointMake(CGRectGetMinX(self.bounds), CGRectGetMinY(self.bounds));
    }
    return atan2(start.y - touchPoint.y, start.x - touchPoint.x);
}

鏈接到GitHub上的項目Project Link

弄清楚了。

我必須使它具有初始寬度,這樣角度才能起作用。

_initialAngle = atan2(startPoint.y - endPoint.y, startPoint.x - (endPoint.x + self.frame.size.width));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM