2

我正在为我的应用程序构建一个自定义滑块。

我在 Github 上找到了一个图书馆作为灵感。

我已经创建了文件:NKSlider作为库的子类UIView并在其上实现drawRect并实现了方法:touchesMoved: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)]];

这就是课程。我究竟做错了什么??

.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 技巧不起作用,也许您应该检查视图的父视图自动调整大小属性

我像下面这样更改它,因为故事板“最初”以纵向模式加载它,但我以横向模式呈现它,所以父级的视图高度变为 0 px。甚至视图本身保持其高度,父母变为 0 px,因此视图没有收到事件。

在此处输入图像描述 在此处输入图像描述

于 2014-04-10T12:01:05.130 回答
0

这可能是一个超级边缘情况,但是当我的自定义视图类意外地从UICollectionViewCell代码中下降时,我遇到了这个问题,但在 XIB 中使用的元素是UIView.

于 2016-08-30T23:03:33.187 回答
0

我已经看到这条线导致 UIView 事件出现问题:

contentView.translatesAutoresizingMaskIntoConstraints = NO;

在您使用 pushViewController 和 popViewControllerAnimated 方法推送和弹出视图控制器后,这一行可能会让人头疼。一旦您的 contentView 再次显示,您可能会发现事件处理不起作用。

于 2017-10-05T00:44:48.623 回答