Câu hỏi Dịch chuyển cử chỉ được đặt lại giữa bắt đầu và xử lý (với trạng thái bắt đầu) trên iOS7


Tôi có công cụ nhận dạng cử chỉ để kéo bảng điều khiển lên, xuống, sang trái hoặc sang phải. Khi không thể chỉ định hướng của pan, tôi không cho phép trình nhận dạng bắt đầu để các lần chạm có thể chuyển đến các phần tử giao diện người dùng khác trong bảng điều khiển.

Tuy nhiên, trên iOS7 bản dịch đôi khi được đặt lại giữa gestureRecognizerShouldBegin: và xử lý cử chỉ của tôi handlePan:

- (BOOL)gestureRecognizerShouldBegin:(UIPanGestureRecognizer*)panGR
{
    CGPoint trans = [panGR translationInView:self.view];
    NSLog(@"should begin trans: (%.2f, %.2f)", trans.x, trans.y);
    ...

Nhật ký này: should begin trans: (18.00, 0.00)

- (void)handlePan:(UIPanGestureRecognizer*)panGR
{
    CGPoint trans = [panGR translationInView:self.view];

    switch(panGR.state)
    {
        case UIGestureRecognizerStateBegan:
            NSLog(@"handlePan began trans: (%.2f, %.2f)", trans.x, trans.y);
            ...

Nhật ký này: handlePan began trans: (0.00, 0.00)

Điều này có nghĩa là mã chia sẻ để xác định hướng của chảo (phải, trong trường hợp này) hoạt động trong gestureRecognizerShouldBegin: và cho phép cử chỉ bắt đầu, nhưng sau đó không thể xác định được handlePan: khi mà state Là UIGestureRecognizerStateBegan.

Đây có phải là lỗi trong iOS7 hoặc có hành vi cố tình thay đổi để chứa các loại cử chỉ mới không? Ngoài ra, bất cứ ai có thể đề xuất một cách tốt để làm việc xung quanh vấn đề này?


17
2017-09-22 17:25


gốc




Các câu trả lời:


Các UIPanGestureRecognizer luôn đặt bản dịch thành (0,0) sau khi đạt đến UIGestureRecognizerStateBegan trạng thái - vì ngay cả bản dịch nhỏ nhất cũng được nhận ra nó chỉ được kích hoạt (nếu bạn thiết lập ngưỡng lớn để bắt đầu nhận dạng như (50,50), bạn rõ ràng sẽ bị "lag" trong hành vi UI - như một giải pháp thay thế sẽ đề xuất lưu trữ giá trị của bản dịch và sau đó sử dụng hoạt ảnh UIView để xoay đối tượng một cách mượt mà hơn). Bạn nên sử dụng UIGestureRecognizerStateChanged để cập nhật bản dịch và UIGestureRecognizerStateRecognized để thiết lập điểm kết thúc của chảo.


1
2017-07-22 11:58



Tôi nghĩ bạn hiểu nhầm câu hỏi. Việc đặt lại bản dịch này xảy ra giữa gestureRecognizerShouldBegin và xử lý với nhà nước UIGestureRecognizerStateBegan. Tôi nghĩ rằng đó là một lỗi trong iOS7 - jhabbott
những gì tôi có trong tâm trí bằng cách viết "sau khi đạt đến UIGestureRecognizerStateBeganTôi hiểu vấn đề và chạy một số mã để tái tạo nó - Tôi đồng ý với bạn rằng hành vi này rất khó hiểu và trong một số trường hợp có thể gây rắc rối, ví dụ như trong một tình huống khi bạn triển khai gestureRecognizerShouldBegin trả về YES chỉ khi tương đối lớn (tức là khoảng cách có thể được nhìn thấy trên màn hình, như của bạn (18.00, 0.00)) chuyển đổi xảy ra. Mà tôi hiểu là trường hợp? - Wladek Surala


Bạn có thể xác định hướng trong handlePan: bằng cách kiểm tra xem bản dịch ngang có cao hơn hay thấp hơn 0. Nhưng vào cuối handlePan: bạn cần phải đặt lại CGPoint của bản dịch làm tài liệu tham khảo mới cho bản dịch tiếp theo.

- (void)handlePan:(UIPanGestureRecognizer*)panGR
{
    CGPoint translation = [gr translationInView:self.view];
    if (translation.x > 0) {
        //Direction: Right
    } else if (translation.x < 0) {
        //Direction: Left
    }


    [gr setTranslation:CGPointZero
                inView:self.view];
}

-1
2018-05-28 20:41



Tôi không nghĩ bạn đọc câu hỏi. - jhabbott