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

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

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

【问题讨论】:

    标签: iphone ios uiimage uigesturerecognizer uislider


    【解决方案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
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-03-27
          • 1970-01-01
          相关资源
          最近更新 更多