iOS 如何手动调整 UIImageView 使其像按钮一样?

Posted

技术标签:

【中文标题】iOS 如何手动调整 UIImageView 使其像按钮一样?【英文标题】:iOS how to manually tweak UIImageView to make it acts like a button? 【发布时间】:2014-09-29 04:13:33 【问题描述】:

出于某种原因,我必须使用自定义的UIView,其中包含几个UIImageViews 作为按钮。 (我不能使用按钮,因为 imageViews 有独立的动态内容)

我希望它们(我自定义的UIView 中的所有图像视图)在触摸开始时变暗,然后在触摸结束时恢复正常。

我计划使用UITapGestureRecognizer 来实现这一点。所以在我定制的UIView 中,我有一个tapGestureRecognizer。我的代码如下所示:

- (void)costomizedViewTapped:(UITapGestureRecognizer *)tapRecognizer 
  if (tapRecognizer.state == UIGestureRecognizerStateBegan) 
    // dim all my imageViews
    NSLog(@"????dimmed");
  
  if (tapRecognizer.state == UIGestureRecognizerStateCancelled ||
      tapRecognizer.state == UIGestureRecognizerStateEnded ||
      tapRecognizer.state == UIGestureRecognizerStateFailed) 
    // make all my imageViews back to normal
    NSLog(@"????normaled");
    if (tapRecognizer.state == UIGestureRecognizerStateEnded) 
      // do something to handle the tap
    
  

我的一个简单愚蠢的问题是,我怎样才能使 imageViews 变暗以使它们看起来像一个被按下的按钮?

另外,我发现我的代码只能在每次点击时注销消息????normaled,但我希望它能够在点击开始时注销????dimmed,我该如何修改我的代码来做到这一点?

【问题讨论】:

可能是***.com/questions/4681903/…的副本 @danh 这个不错。 【参考方案1】:

为什么不能使用 UIButton ?如果您担心图像大小,可以随时这样处理:

[myButton.imageView setContentMode:UIViewContentModeScaleAspectFill];

其他选项有:

typedef NS_ENUM(NSInteger, UIViewContentMode) 
    UIViewContentModeScaleToFill,
    UIViewContentModeScaleAspectFit,      
    UIViewContentModeScaleAspectFill,     
    UIViewContentModeRedraw,              
    UIViewContentModeCenter,              
    UIViewContentModeTop,
    UIViewContentModeBottom,
    UIViewContentModeLeft,
    UIViewContentModeRight,
    UIViewContentModeTopLeft,
    UIViewContentModeTopRight,
    UIViewContentModeBottomLeft,
    UIViewContentModeBottomRight,
;

这样您就不必实现点击手势。

而且,该按钮具有高亮属性,因此可以解决您的调光问题。

【讨论】:

这是绝对你应该做的。 我不使用UIButton 的原因是UIButton 不支持大量自定义:我无法通过界面生成器将子视图添加到UIButton(我可以在代码中做到这一点但在我的情况下,我有一些图像视图需要添加到按钮中,并且每个视图都有自动布局约束,我宁愿在界面生成器中使用自动布局) 也许,取一个 UIView(添加任何图像视图并设置自动布局道具。) > 将其子类更改为 UIControl > 这样您的视图可以响应所有事件(UIControlEventTouchUpInside、UIControlEventTouchDown 等)。简而言之,您的视图将充当按钮 :) @114100웃 好点,这是我今天学到的新东西,谢谢!【参考方案2】:

我会考虑一下您不使用 UIButton 的原因。如果您决定做正确的事,那么您可以通过添加子层来“暗化” UIImageView。

我会继承 UIImageView 并使用类似这样的东西:

CALayer *downStateLayer = [CALayer layer];
downStateLayer.backgroundColor = [[UIColor grayColor] CGColor];
downStateLayer.opacity = 0.5;
downStateLayer.frame = self.view.frame;
[self.view.layer addSublayer:downStateLayer];

去除暗淡效果:

[downStateLayer removeFromSuperlayer];

CALayer 的更多属性可用于进一步自定义下状态。

【讨论】:

这解决了我的问题,谢谢! @danh 提到的UIImageView 解决方案的类别非常好,但在我的情况下,我的图像不在应用程序包中,它们是从服务器以代码下载的,所以如果我继续这样做,我将不得不手动保留我自己的原始图像的旧记录。

以上是关于iOS 如何手动调整 UIImageView 使其像按钮一样?的主要内容,如果未能解决你的问题,请参考以下文章

调整UIImageView的大小以包装“适合方面”的图像

在 iOS 中调整 UIImageView 的大小

用手指IOS调整UIImageView的大小

iOS UIImageView 调整大小问题

自动调整 TableViewCell 的高度以适应 iOS 6 中的 UIImageVIew

如何手动下载 GitHub iOS 代码并使其在 XCode 11.7 中运行?