iOS:变色圆形按钮

标签 ios cocoa-touch uibutton

我正在尝试制作一个显示/隐藏颜色选择 slider 的按钮。那是容易的部分。

我不知道该怎么做是让按钮成为一个带有轮廓(比如黑色)的圆圈,填充是 slider 中显示的颜色。当用户移动 slider 时,圆圈的颜色应相应改变。

我是 iOS 开发的新手,所以可能我在处理这一切都是错误的。我真的很感激任何想法,即使它们与我在这里的想法完全不同。

我开始通过使用 QuartzCore 层的子类来解决这个问题,结果还不错,但是有些问题/事情困扰着我:

  • 出于某种原因,按下按钮
  • 时我没有高亮状态
  • 用圆角实现圆显然很奇怪
  • 不幸的是,似乎我绘制了图层,按钮尚未布局,所以我不得不硬编码半径而不是根据按钮大小来制作它。

  • 所以,是的,我几乎不认为这种方法是理想的。我将不胜感激任何和所有的帮助。谢谢!
            #import "ColorPickerButton.h"
            @implementation ColorPickerButton
    
            #pragma mark - UIButton Overrides
    
            + (ColorPickerButton *)buttonWithType:(UIButtonType)buttonType
            {
                return [super buttonWithType:UIButtonTypeCustom];
            }
    
            - (id)initWithCoder:(NSCoder *)aDecoder
            {
                self = [super initWithCoder:aDecoder];
    
                if (self)
                {
                    r = 0.3;
                    g = 0.6;
                    b = 0.9;
                    [self drawOutline];
                    [self drawColor];
                }
                return self;
            }
    
            - (id)initWithFrame:(CGRect)frame
            {
                self = [super initWithFrame:frame];
                if (self) {
                    // Initialization code
                }
                return self;
            }
    
            - (void)layoutSubviews
            {
                _outlineLayer.frame = CGRectInset(self.bounds, 5, 5);
                _colorLayer.frame = CGRectInset(self.bounds, 5+_outlineLayer.borderWidth,           5+_outlineLayer.borderWidth);
                [super layoutSubviews];
            }
    
            #pragma mark - Layer setters
    
            - (void)drawOutline
            {
                if (!_outlineLayer)
                {
                    _outlineLayer = [CALayer layer];
    
                    _outlineLayer.cornerRadius = 20.0;
                    _outlineLayer.borderWidth = 3;
                    _outlineLayer.borderColor = [[UIColor colorWithRed:170.0/255.0 green:170.0/255.0 blue:170.0/255.0 alpha:1.0] CGColor];
                    _outlineLayer.opacity = 0.6;
    
                    [self.layer insertSublayer:_outlineLayer atIndex:1];
                }
            }
    
            - (void)drawColor
            {
                if (!_colorLayer)
                {
                    _colorLayer = [CALayer layer];
                }
    
                _colorLayer.cornerRadius = 16.0;
                _colorLayer.backgroundColor = [[UIColor colorWithRed:r green:g blue:b alpha:1.0] CGColor];
                _colorLayer.opacity = 1.0;
    
                [self.layer insertSublayer:_colorLayer atIndex:2];
            }
    
            - (void)changeColorWithRed:(CGFloat)red green:(CGFloat)green blue:(CGFloat)blue
            {
                r = red;
                g = green;
                b = blue;
                [self drawColor];
            }
            @end
    

    最佳答案

    我们在我们的应用程序中执行此操作。我们在按钮上使用 CALayer 并添加 1/2 组件宽度大小的圆角。我们为按钮添加边框,然后设置按钮背景颜色以实现“填充”颜色。效果很好。

    关于iOS:变色圆形按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17032732/

    相关文章:

    ios - 用户注册并登录 (Firebase Cloudstore iOS)

    android - 为什么 TableView (UITableView) 必须有独立的源对象来提供数据?

    ios - 不要在 UICollectionViewCell 中突出显示 UIImageViews

    ios - 如何使用 XML 发送请求

    ios - addTarget 到自定义按钮 Swift 4

    iphone - ios 7 tableView didSelectRowAtIndexPath 在第一次选择时显示空白数据

    iphone - iphone 应用程序如何与服务器交互?

    iphone - 如何检查用户是否在 iOS 设备上启用了 PIN 码

    swift - 如何重构我的代码以避免重复

    swift - 如何以编程方式创建一个按钮以快速显示在单独的 View Controller 中