سؤال

أنا أواجه مشكلة صغيرة في تطبيقي.

لدي أساسا سلسلة من UIButtons إضافة كرسومات فرعية في أ UIScrollView وهو جزء من النقش. في كل مرة أنقر على زر ، يوجد تأخير ملحوظ قبل تمييز الزر. يجب أن أحتفظ به بشكل أساسي لمدة نصف ثانية قبل أن يظن الزر ويبدو أنه محدد.

أفترض أن هذا هو أن UIScrollView يحتاج إلى تحديد ما إذا كانت اللمس عبارة عن تمرير أو إذا كانت لمسة مخصصة لمرض فرعي.

على أي حال ، أنا غير متأكد قليلاً من كيفية المتابعة. أريد ببساطة أن يظهر الزر المحدد بمجرد النقر عليه.

أي مساعدة موضع تقدير!

يحرر:

لقد حاولت الإعداد delaysContentTouches إلى رقم لكن التمرير يصبح مستحيلًا تقريبًا منذ أن تمتلئ غالبية Scrollview UIButtons.

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

المحلول 2

حسنًا ، لقد قمت بحل هذا عن طريق التصنيف الفرعي UIScrollView والتجاوز touchesShouldCancelInContentView

الآن بلدي UIButton تم وضع علامة على 99 أبرز بشكل صحيح و Scrollview الخاص بي يتم التمرير!

myCustomScrollView.h:

@interface myCustomScrollView : UIScrollView  {

}

@end

و MyCustomsCrollView.M:

@implementation myCustomScrollView

    - (BOOL)touchesShouldCancelInContentView:(UIView *)view
    {
        NSLog(@"touchesShouldCancelInContentView");

        if (view.tag == 99)
            return NO;
        else 
            return YES;
    }

نصائح أخرى

لم يكن حل جيف يعمل بالنسبة لي تمامًا ، لكن هذا الحلم المشابه: http://charlesharley.com/2013/programming/UIBTHTON-IN-IUTABLEVIEWCELL-HAS-NO-HIGHLIGHT-TTATE

بالإضافة إلى تجاوز touchesShouldCancelInContentView في عرض الفئة الفرعية في عرض التمرير ، لا تزال بحاجة إلى ضبط delaysContentTouches إلى false. أخيرًا ، تحتاج إلى العودة true عوضا عن false لأزرارك. إليك مثال معدّل من الرابط أعلاه. كما اقترح المعلقون ، فإنه يتحقق من أي فئة فرعية من UIControl عوضا عن UIButton على وجه التحديد بحيث ينطبق هذا السلوك على أي نوع من السيطرة.

ج موضوعية:

- (instancetype)initWithFrame:(CGRect)frame {
    if (self = [super initWithFrame:frame]) {
        self.delaysContentTouches = false;
    }

    return self;
}

- (BOOL)touchesShouldCancelInContentView:(UIView *)view {
    if ([view isKindOfClass:UIControl.class]) {
        return true;
    }

    return [super touchesShouldCancelInContentView:view];
}

سويفت 4:

override func touchesShouldCancel(in view: UIView) -> Bool {
    if view is UIControl {
        return true
    }
    return super.touchesShouldCancel(in: view)
}

حاول تعيين UisCrollView delaysContentTouches الممتلكات إلى لا.

حل القصة المصورة: حدد عرض التمرير ، وافتح "مفتش السمات" وألاحك "لمس محتوى المحتوى"

enter image description here

في سويفت 3:

import UIKit

class ScrollViewWithButtons: UIScrollView {

    override init(frame: CGRect) {
        super.init(frame: frame)
        myInit()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        myInit()
    }

    private func myInit() {
        self.delaysContentTouches = false
    }

    override func touchesShouldCancel(in view: UIView) -> Bool {
        if view is UIButton {
            return true
        }
        return super.touchesShouldCancel(in: view)
    }
}

يمكنك بعد ذلك استخدام هذا ScrollViewWithButtons في IB أو في الكود.

لم يعمل أي من الحلول الحالية بالنسبة لي. ربما يكون وضعي أكثر فريدة من نوعه.

لدي الكثير UIButtons داخل أ UIScrollView. عندما UIButton تم الضغط عليه جديد UIViewController يتم تقديمه إلى المستخدم. إذا تم الضغط على زر وتم تعليقه لفترة كافية ، فسيظهر الزر حالته الاكتئاب. كان موكلي يشكو من أنه إذا قمت بالنقر فوقه بسرعة كبيرة ، فلا يتم عرض حالة من الاكتئاب.

الحل الخاص بي: داخل UIButtons"انقر على الطريقة ، حيث أقوم بتحميل الجديد UIViewController وقدمها على الشاشة ، أنا أستخدمها

[self performSelector:@selector(loadNextScreenWithOptions:) 
           withObject:options 
           afterDelay:0.]

هذا يحدد تحميل التالي UIViewController على حلقة الحدث التالي. يتيح الوقت ل UIButton لإعادة الرسم. ال UIButton الآن يظهر حالتها الاكتئاب قبل تحميل التالي UIViewController.

سريع 3:

scrollView.delaysContentTouches = false
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top