将手势识别器添加到 UISlider 最小值/最大值图像

Posted

技术标签:

【中文标题】将手势识别器添加到 UISlider 最小值/最大值图像【英文标题】:Add gesture recognizer to UISlider min/max value image 【发布时间】:2013-10-16 02:45:13 【问题描述】:

我需要为UISlider 的最小值和最大值图像添加触摸响应。滑块是一个缩放条,因此图像是减号和加号,如果触摸,它们应该相应地放大或缩小。 UISlider 属性 minimumValueImagemaximumValueImage 的类型是 UIImage,而不是 UIImageView,所以我不能直接向它添加手势识别器。

有什么想法吗?是唯一的选择,可以在图像顶部制作清晰的按钮吗?如果是这种情况,我怎样才能获得最小/最大图像帧?

【问题讨论】:

【参考方案1】:

您要查找的图像视图位于 UISlider 类的 @package 内,无法从外部访问

UIImageView *_minValueImageView;UIImageView *_maxValueImageView;

您仍然可以使用 Objective C 运行时获取它们。

#import <objc/runtime.h>

// Initialize slider and images
UISlider *slider = [[UISlider alloc] initWithFrame:CGRectMake(100, 100, 300, 40)];
[slider setMinimumValueImage:[UIImage imageNamed:@"img1"]];
[slider setMaximumValueImage:[UIImage imageNamed:@"img2"]];

Ivar minimumValueImageViewIvar = class_getInstanceVariable([slider class], "_minValueImageView");
UIImageView *minimumValueImageView =  (UIImageView*)( object_getIvar(slider, minimumValueImageViewIvar) );
// [minimumValueImageView setHidden:YES];

Ivar maximumValueImageViewIvar = class_getInstanceVariable([slider class], "_maxValueImageView");
UIImageView *maximumValueImageView =  (UIImageView*)( object_getIvar(slider, maximumValueImageViewIvar) );
// [maximumValueImageView setHidden:YES];

【讨论】:

【参考方案2】:

您可以查看滑块的子视图。应该有 2 个 UIImageView。然后,您可以设置 userInteractionEnabled=YES 并向它们中的每一个添加一个 UITapGestureRecognizer。

NSMutableArray* images = [NSMutableArray array];
for (id sv in slider.subviews) 
   if ([sv isKindOfClass:[UIImageView class]]) 
       [image addObject:sv];
   

if (images.count == 2) 
    UITapGestureRecognizer* gr = [[UITapGestureRecognizer alloc] initWithTarget:self
                                                                         action:@selector(minImageTapped:)];
    [imageViews[0] addGestureRecognizer:gr];
    [imageViews[0] setUserInteractionEnabled:YES];

    gr = [[UITapGestureRecognizer alloc] initWithTarget:self
                                                 action:@selector(maxImageTapped:)];
    [imageViews[1] addGestureRecognizer:gr];
    [imageViews[1] setUserInteractionEnabled:YES];

【讨论】:

【参考方案3】:

GenesisST 答案的 Swift 版本:

let images:[UIView] = outsSlider.subviews.filter($0 is UIImageView)

if (images.count == 2) 
    let tapMin = UITapGestureRecognizer(target: self, action: #selector(minImageTapped));
    let tapMax = UITapGestureRecognizer(target: self, action: #selector(maxImageTapped));
    images[0].addGestureRecognizer(tapMin)
    images[1].addGestureRecognizer(tapMax)
    images[0].isUserInteractionEnabled = true
    images[1].isUserInteractionEnabled = true

【讨论】:

以上是关于将手势识别器添加到 UISlider 最小值/最大值图像的主要内容,如果未能解决你的问题,请参考以下文章

UISlider - 将 UILabel 添加到最小/最大 UIImageView?

如何将大图像添加到 UISlider 背景或放置在滚动视图中?

屏幕边缘手势识别器问题

偏移 UISlider 最小值/最大值图像

如何反转 UISlider 的最小值-最大值?

如何增加 UISlider 的最大轨道的大小?