色選択スライダーを表示/非表示にするボタンを作成しようとしています。それは簡単な部分です。
どうすればよいかわからないのは、ボタンを輪郭のある円(黒など)にし、塗りつぶしをスライダーに表示される色にすることです。ユーザーがスライダーを動かすと、それに応じて円の色が変化します。
私は 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