アプリで小さな問題が発生しています。
基本的には、nibの一部であるUIButtons
のサブビューとして追加された一連のUIScrollView
があります。ボタンをタップするたびに、ボタンが強調表示されるまでにかなりの遅延があります。ボタンが暗くなり、選択されたように見える前に、私は基本的にそれを約0.5秒間保持する必要があります。
これは、UIScrollView
がタッチがスクロールであるのか、それともサブビュー用のタッチであるのかを判別する必要があるためだと思います。
とにかく、どうすればいいか分からない。ボタンをタップするとすぐに、ボタンが選択された状態で表示されるようにするだけです。
どんな助けでもありがたいです!
編集:
私はdelaysContentTouches
を[〜#〜] no [〜#〜]に設定しようとしましたが、スクロールのほとんどが不可能になります私のscrollViewはUIButtons
で埋められています。
UIScrollView
をサブクラス化してtouchesShouldCancelInContentView
をオーバーライドすることで解決しました
これで、99とタグ付けされたUIButton
が正しくハイライト表示され、スクロールビューがスクロールします。
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/uibutton-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];
}
Swift 4:
override func touchesShouldCancel(in view: UIView) -> Bool {
if view is UIControl {
return true
}
return super.touchesShouldCancel(in: view)
}
UIScrollView delaysContentTouches
プロパティをNOに設定してみてください。
Swift 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