iOS-仿手電筒效果實現(xiàn)

效果圖如下:

拖動按鈕.png

實現(xiàn)方案

1、采用系統(tǒng)UISlider實現(xiàn)
2奔浅、自己使用貝塞爾曲線繪制

方案一(不可行馆纳,有bug)

遇到的問題:當將UISlider的寬度加寬的一定寬度后,拖動效果不是漸變汹桦,會突然發(fā)送改變鲁驶,此處簡單記錄下UISlider的基礎用法
1、基礎設置

// 初始化
UISlider *slider = [[UISlider alloc] initWithFrame:CGRectMake(100, 200, 100, 20)];  
// 添加到俯視圖
[self.view addSubview:slider]; 

// 設置最小值
slider.minimumValue = 9;  
// 設置最大值
slider.maximumValue = 11;  
// 設置初始值  
 slider.value = (slider.minimumValue + slider.maximumValue) / 2;
// 設置可連續(xù)變化
 slider.continuous = YES;  
//滑輪左邊顏色舞骆,如果設置了左邊的圖片就不會顯示  
slider.minimumTrackTintColor = [UIColor greenColor]; 
//滑輪右邊顏色钥弯,如果設置了右邊的圖片就不會顯示  
slider.maximumTrackTintColor = [UIColor redColor];
 
/// 也可設置為圖片
///[slider setMinimumTrackImage:[UIImageimageNamed:@"max.png"] forState:UIControlStateNormal];
//[slider setMaximumTrackImage:[UIImageimageNamed:@"min.png"] forState:UIControlStateNormal];
 
//設置了滑輪的顏色,如果設置了滑輪的樣式圖片就不會顯示  slider.thumbTintColor = [UIColor redColor];
// 針對值變化添加響應方法  
 [slider addTarget:self action:@selector(sliderValueChanged:) forControlEvents:UIControlEventValueChanged];

2督禽、旋轉(zhuǎn)90度脆霎,豎直放置

slider.transform = CGAffineTransformMakeRotation(1.57079633);

3、改變slider的寬度(方法3)狈惫,需要重寫一個繼承與UISlider的類了,然后重寫里面的實現(xiàn)方法來控制:

/// 設置最小值
- (CGRect)minimumValueImageRectForBounds:(CGRect)bounds;
/// 設置最大值
- (CGRect)maximumValueImageRectForBounds:(CGRect)bounds;
/// 控制slider的寬高
- (CGRect)trackRectForBounds:(CGRect)bounds;
/// 改變滑塊的觸摸范圍
- (CGRect)thumbRectForBounds:(CGRect)bounds trackRect:(CGRect)rect value:(float)value;

方案二(自己繪制)

提供實現(xiàn)代碼如下
.h文件

#import <UIKit/UIKit.h>

typedef void (^sliderBlock)(float);
NS_ASSUME_NONNULL_BEGIN

@interface HYLightSlider : UIView
@property (nonatomic, copy) sliderBlock clickBlock;
-(instancetype)initWithFrame:(CGRect)frame defaultValue:(float)defaultValue;
@end

NS_ASSUME_NONNULL_END

.m文件

#import "HYLightSlider.h"

@interface HYLightSlider()
@property (nonatomic, assign) float defaultValue;
@property (nonatomic, assign) float offSet;
@property (nonatomic, strong) UIBezierPath *path;
@property (nonatomic, strong) CAShapeLayer *tubeShape;
@end

@implementation HYLightSlider
-(instancetype)initWithFrame:(CGRect)frame defaultValue:(float)defaultValue{
    self = [super initWithFrame:frame];
    if(self){
        self.backgroundColor = [UIColor clearColor];
        self.defaultValue = defaultValue;
        UIPanGestureRecognizer *imageViewPanGesture = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(panGesture:)];
        [self addGestureRecognizer:imageViewPanGesture];
        [self initNewPath];
        [self drawWholeShape];
    }
    return self;
}
- (void)initNewPath{
    self.path = [UIBezierPath bezierPath];
    self.tubeShape = [[CAShapeLayer alloc]init];
    self.tubeShape.strokeColor = [UIColor colorWithHexValue:HY_COR3].CGColor;
    self.tubeShape.fillColor = [UIColor colorWithHexValue:HY_COR3].CGColor;
}

- (void)drawWholeShape{
    // 管道
    for (CALayer *object in self.layer.sublayers) {
        [object removeFromSuperlayer];
    }
    [self.path removeAllPoints];
    self.path.lineWidth = self.frame.size.width;
    [self.path moveToPoint:CGPointMake(self.frame.size.width/2.0, self.frame.size.height)];
    [self.path addLineToPoint:CGPointMake(self.frame.size.width/2.0, self.frame.size.height*(1.0-self.defaultValue))];//添加一條子路徑
    [self.path stroke];
    self.tubeShape = [[CAShapeLayer alloc]init];
    self.tubeShape.path = self.path.CGPath;
    self.tubeShape.lineWidth = self.frame.size.width;

    self.tubeShape.strokeColor = [UIColor colorWithHexValue:HY_COR3].CGColor;
    self.tubeShape.fillColor = [UIColor colorWithHexValue:HY_COR3].CGColor;
    [self.layer addSublayer:self.tubeShape];
}
#pragma mark --- targetView的拖拽手勢
- (void)panGesture:(UIPanGestureRecognizer *)gesture{
    switch (gesture.state) {
        case UIGestureRecognizerStateBegan:
        {
            NSLog(@"滑動開始");
        }
            break;
        case UIGestureRecognizerStateChanged:
        {
            // 獲得添加手勢的對象
            // 獲得滑動的距離  包含 x y 移動的數(shù)值
            CGPoint point  =[gesture translationInView:gesture.view];
            //向下滑動
            if(point.y >= self.frame.size.height*self.defaultValue){
                self.offSet = self.frame.size.height*self.defaultValue;
            //向上滑動
            }else if(-point.y >= self.frame.size.height - self.frame.size.height*self.defaultValue){
                self.offSet = -self.frame.size.height + self.frame.size.height*self.defaultValue;
            }else{
                self.offSet = point.y;
            }
            self.offSet = self.offSet*0.1;
            self.defaultValue = (-self.offSet+self.frame.size.height*self.defaultValue)/self.frame.size.height;
            if(self.defaultValue < 0.0 || self.defaultValue > 1.0){
                return;
            }
            [self.tubeShape setNeedsDisplay];
            [self drawWholeShape];
            NSLog(@"滑動中");
            NSLog(@"%f",self.offSet);
        }
            break;
        case UIGestureRecognizerStateEnded:
        {
            NSLog(@"%f",self.offSet);
            NSLog(@"滑動結(jié)束");
            self.clickBlock ? self.clickBlock(self.defaultValue) : nil;
            
        }
            break;
        default:
            break;
    }
}

@end
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末睛蛛,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子胧谈,更是在濱河造成了極大的恐慌忆肾,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件菱肖,死亡現(xiàn)場離奇詭異客冈,居然都是意外死亡,警方通過查閱死者的電腦和手機稳强,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進店門场仲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人退疫,你說我怎么就攤上這事渠缕。” “怎么了褒繁?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵亦鳞,是天一觀的道長。 經(jīng)常有香客問我,道長蚜迅,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任俊抵,我火速辦了婚禮谁不,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘徽诲。我一直安慰自己刹帕,他們只是感情好,可當我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布谎替。 她就那樣靜靜地躺著偷溺,像睡著了一般。 火紅的嫁衣襯著肌膚如雪钱贯。 梳的紋絲不亂的頭發(fā)上挫掏,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天,我揣著相機與錄音秩命,去河邊找鬼尉共。 笑死,一個胖子當著我的面吹牛弃锐,可吹牛的內(nèi)容都是我干的袄友。 我是一名探鬼主播,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼霹菊,長吁一口氣:“原來是場噩夢啊……” “哼剧蚣!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起旋廷,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤鸠按,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后柳洋,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體待诅,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年熊镣,在試婚紗的時候發(fā)現(xiàn)自己被綠了卑雁。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡绪囱,死狀恐怖测蹲,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情鬼吵,我是刑警寧澤扣甲,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響琉挖,放射性物質(zhì)發(fā)生泄漏启泣。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一示辈、第九天 我趴在偏房一處隱蔽的房頂上張望寥茫。 院中可真熱鬧,春花似錦矾麻、人聲如沸纱耻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽弄喘。三九已至,卻和暖如春甩牺,著一層夾襖步出監(jiān)牢的瞬間蘑志,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工柴灯, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留卖漫,地道東北人。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓赠群,卻偏偏與公主長得像羊始,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子查描,可洞房花燭夜當晚...
    茶點故事閱讀 43,440評論 2 348

推薦閱讀更多精彩內(nèi)容