2

アプリケーションにカスタムスライダーを作成しています。

インスピレーションとしてGithubでライブラリを見つけました。

私はファイルを作成しました:ライブラリが行ったようにNKSlider、そのサブクラスとしてそのUIView上に実装し、メソッド:とを実装しました。しかし、タッチイベントはどれも呼び出されていません。drawRecttouchesMoved:withEvent:touchesBegan:withEvent:

これが、このカスタムビューをビューコントローラに追加する方法です。

NKHandler *nk = [[NKHandler alloc] init];
nk.frame = CGRectMake(20, 20, 280, 36);
[self.view addSubview:nk];
[self.view addSubview:[[NKHandler alloc] initWithFrame:CGRectMake(20, 60, 280, 100)]];

これがクラスです。私は何が間違っているのですか?

the.h

#import <UIKit/UIKit.h>

@interface NKHandler : UIView

@end

.m

#import "NKHandler.h"

static inline CGPoint CGPointTopCenter(CGRect rect) {
  CGPoint p; p.x = rect.origin.x + (rect.size.width / 2); p.y = rect.origin.y; return p;
}
static inline CGPoint CGPointBottomCenter(CGRect rect) {
  CGPoint p; p.x = rect.origin.x + (rect.size.width / 2); p.y = rect.origin.y + rect.size.height; return p;
}
static inline CGPoint CGPointLeftCenter(CGRect rect) {
  CGPoint p; p.x = rect.origin.x; p.y = rect.origin.y + (rect.size.height / 2); return p;
}
static inline CGPoint CGPointRightCenter(CGRect rect) {
  CGPoint p; p.x = rect.origin.x + rect.size.width; p.y = rect.origin.y + (rect.size.height / 2); return p;
}

@implementation NKHandler {
  int _selectedStep;
}

-(id)init {
  self = [super init];
  if (self) {
    self.backgroundColor = [UIColor clearColor];

    self.clipsToBounds = NO;
    self.opaque = YES;

    _selectedStep = 5;   
  }
  return self;
}

-(void) setStep:(int) step {
  _selectedStep = step;
  [self setNeedsDisplay];
}

-(void)layoutSubviews {
  ... layout stuff ...
}
-(void)drawRect:(CGRect)rect {
  ... Boring drawing stuff ..
}

#pragma mark - Touch Handling

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
  NSLog(@"%s", __PRETTY_FUNCTION__);
  [self setStep:(_selectedStep+1)%11];
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
  NSLog(@"%s", __PRETTY_FUNCTION__);
}

@end
4

4 に答える 4

4
nk.userInteractionEnabled = YES;
于 2012-12-19T15:09:14.193 に答える
2

userInteractionEnabledトリックが機能しない場合は、ビューのparentview自動サイズ設定属性を確認する必要があります。

ストーリーボードが「元々」ポートレートモードでロードしたため、次のように変更しましたが、横向きで表示したため、親のビューの高さは0pxになります。また、ビュー自体の高さを維持しても、親は0ピクセルになるため、ビューはイベントを取得しませんでした。

ここに画像の説明を入力してください ここに画像の説明を入力してください

于 2014-04-10T12:01:05.130 に答える
0

これはおそらくスーパーエッジのケースですが、誤ってカスタムビュークラスUICollectionViewCellをコードから派生させたときにこの問題が発生しましたが、XIBでは使用された要素はでしたUIView

于 2016-08-30T23:03:33.187 に答える
0

この行がUIViewイベントで問題を引き起こすのを見ました:

contentView.translatesAutoresizingMaskIntoConstraints = NO;

この行は、pushViewControllerメソッドとpopViewControllerAnimatedメソッドを使用して、View Controllerをプッシュしてポップした後、頭痛の種になる可能性があります。contentViewが再度表示されると、イベント処理が機能しない場合があります。

于 2017-10-05T00:44:48.623 に答える