uiscrollviewの場合、uibutton touchは遅延します
-
30-09-2019 - |
質問
アプリで小さな問題に遭遇しています。
私は本質的に一連のシリーズを持っています UIButtons
aのサブビューとして追加されました UIScrollView
これはペン先の一部です。ボタンをタップするたびに、ボタンが強調表示される前に顕著な遅延があります。ボタンが暗くて選択されているように見える前に、本質的に約0.5秒間保持する必要があります。
私はこれがだからだと思います 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/ubutton-in-uitableviewcell-has-no-highlight-state
オーバーライドに加えて touchesShouldCancelInContentView
スクロールビューサブクラスでは、まだ設定する必要があります delaysContentTouches
に false
. 。最後に、返す必要があります true
それよりも false
あなたのボタン用。上記のリンクの修正された例を次に示します。コメンターが示唆したように、それはのサブクラスをチェックします UIControl
それよりも UIButton
具体的には、この動作があらゆる種類のコントロールに適用されるように。
Objective-C:
- (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];
}
Swift4:
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
. 。 a UIButton
新しいものが押されています UIViewController
ユーザーに提示されます。ボタンを押して十分に長く保持している場合、ボタンには落ち込んだ状態が表示されます。私のクライアントは、タップが速すぎると、落ち込んだ状態が表示されないと不平を言っていました。
私の解決策:内部 UIButtons
'メソッドをタップします。ここで、新しいロードをロードします UIViewController
画面に表示すると、使用します
[self performSelector:@selector(loadNextScreenWithOptions:)
withObject:options
afterDelay:0.]
これにより、次のロードがスケジュールされます UIViewController
次のイベントループ。の時間を許可します UIButton
再描画する。 UIButton
次の状態をロードする前に、うつ状態を示しています UIViewController
.
SWIFT 3:
scrollView.delaysContentTouches = false