UIScrollview Touch Events أثناء الرسوم المتحركة لا تطلق النار مع تحريكها: ولكن العمل بشكل جيد مع uiview chanimations:

StackOverflow https://stackoverflow.com/questions/3614116

سؤال

لدي فئة فرعية UIScrollView التي أقوم بتمريرها برمجيًا باستخدام الرسوم المتحركة UIVIEW.

أود أن يتمكن المستخدم من النقر أو التكبير في محتوى UiimageView لعرض التمرير في حين الرسوم المتحركة تحدث.

لقد عمل هذا بشكل جيد أثناء استخدام تركيبة أقرب إلى هذا:

- (void) scrollSmoothlyatPixelsPerSecond:(float)thePixelsPerSecond {
    // distance in pixels / speed in pixels per second
    float animationDuration = _scrollView.contentSize.width / thePixelsPerSecond;

    [UIView beginAnimations:@"scrollAnimation" context:nil];
    [UIView setAnimationCurve: UIViewAnimationCurveLinear];
    [UIView setAnimationDuration:animationDuration];
    _scrollView.contentOffset = CGPointMake(_scrollView.contentSize.width, 0);
    [UIView commitAnimations];
}

الآن ، منذ iOS 4.0 ، uiview chanimations: تم إحباطه. لذلك حاولت تحديث الكود الخاص بي باستخدام كتلة و uiview متحركًا: يعمل التمرير بشكل مماثل على ما سبق.

الفرق الرئيسي والجنون هو أنه خلال الرسوم المتحركة ، فإن UisCrollView وغيرها من المشاهدات غير المضيئة تستجيب لطرق معالجة الأحداث:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event; 

ولا:

-(UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView;

الحصول على استدعاء عند محاولة التكبير.

تحرير للوضوح: لا يوجد حاضر Uiview يستجيب لأحداث اللمس. هذا لا يقتصر فقط على uiscrollview. لا يستجيب نظير UisCrollview A Uitoolbar للأحداث التي تعمل باللمس ، ولا تقوم أزرار أخرى بعرض نظرات فرعية لنظير إلى UisCrollView. يبدو أن الوالد بأكمله UIVIEW يتجمد من تفاعل المستخدم بينما تحدث الرسوم المتحركة. مرة أخرى ، بعد اكتمال الرسوم المتحركة ، كل ما ذكر أعلاه UIViews تستجيب مرة أخرى.

يتم استدعاء كل هذه في uiview chanimations: الصيغة بغض النظر عن حالة الرسوم المتحركة.

تحريكي مع ذلك: الكود مختلف قليلاً - لكن الاختلافات ليست مادة. بمجرد اكتمال الرسوم المتحركة ، تسمى أحداث اللمس أعلاه مرة أخرى ...

هذا هو رمز التحريك الخاص بي:

- (void) scrollSmoothlyToSyncPoint:(SyncPoint *) theSyncPoint andContinue:(BOOL)theContinueFlag{

    float animationDuration = theSyncPoint.time - [player currentTime];
    [UIView animateWithDuration:animationDuration 
                          delay:0 
                        options:UIViewAnimationOptionCurveLinear 
                     animations:^{
        [_scrollView setContentOffset:theSyncPoint.contentOffset];
    } 
                     completion:^(BOOL finished){
                         if (theContinueFlag) {
                             SyncPoint *aSyncPoint = [self nextSyncPoint];
                             if (aSyncPoint) {
                                 [self scrollSmoothlyToSyncPoint:aSyncPoint andContinue:YES];
                             }
                         }
    }];
}

معالج الحدث الوحيد الذي يطلق النار خلال كتلة الرسوم المتحركة أعلاه هو:

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event;

لذا ، سؤال: هل يجب أن أتجاهل Apple's محبط تسمية ومواصلة استخدام صياغة veryanimation؟ هل يجب أن أقوم بتكبير التصغير والأحداث الأخرى القائمة على اللمس باستخدام Hittest؟ هل هناك بعض المعرفة بالفرق في التنفيذ بين كتل الرسوم المتحركة التي يمكن أن تساعدني في مواجهة هذه المشكلة؟ هل هناك شيء واضح أنني مفقود؟

أنا مطور جديد لـ Apple ، ولذا لا أعرف مدى جدية أخذهم محبط بطاقة شعار. ولكن إذا تم إهمال واجهة برمجة التطبيقات هذه ثم تختفي ، فأنا أفضل التحرك في اتجاه دائم.

شكرا جزيلا على اهتمامك.

هل كانت مفيدة؟

المحلول

تحتاج فقط إلى تضمين خيار uiviewAnimationOptionAllowUserInterTaction عند استدعاء الرسوم المتحركة مثل:

[UIView animateWithDuration:animationDuration 
                          delay:0 
                        options:(UIViewAnimationOptionCurveLinear | UIViewAnimationOptionAllowUserInteraction)
                     <snip>];

هذا متستر ، وأنا أعلم! ؛)

رد: علامة "الإحباط" - بشكل عام ، عندما تخبرك Apple بعدم القيام بشيء فيما يتعلق بتصميم التطبيقات التي تعمل على منصاتها ، عادة ما تكون مصلحة خاصة بك. لذلك أنت محق في الرغبة في تبني كتل الرسوم المتحركة بدلاً من الطريقة القديمة العسكرية.

نصائح أخرى

quickthymeإجابة صحيحة. ها هو المقتطف في سويفت

سريع 4

UIView.animate(
    withDuration: 0.3, // specify animation duration here 
    delay: 0, // specify delay if needed 
    options: [
        UIView.AnimationOptions.allowUserInteraction, 
        UIView.AnimationOptions.curveLinear
    ], 
    animations: {
        // animations code    
    }
)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top