تأخر Uibultton Touch عندما يكون في UisCrollView
-
30-09-2019 - |
سؤال
أنا أواجه مشكلة صغيرة في تطبيقي.
لدي أساسا سلسلة من 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
الممتلكات إلى لا.
في سويفت 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