1. 程式人生 > >簡單自定義選擇按鈕(switchDemo)

簡單自定義選擇按鈕(switchDemo)

雖然系統的UISwitch效果已經很好了,附帶的動畫效果也是很好的,但是在實際開發中UI和程式設計師對頭(產品經理)經常會要求按照專案的整體效果使用其他的圖片或者背景來代替,這裡僅在專案中做了一個簡單的自定義switch.

demo圖樣

switchDemo.png

主要是使用自定義UIView,利用背景圖片的切換,和按鈕圖片的x的位置開實現.

這裡把demo放上,方便以後檢視 : demo地址
WJSwitch.h

#import <UIKit/UIKit.h>

@protocol WJSwitchViewDelegate <NSObject>

/**
 *  開關是否開啟
 *
 *  @param
isopen YES 開啟 NO 關閉 * @param tag tag值 */
-(void)WJSwitchViewDelegateWithSwitchStates:(BOOL)isopen withTag:(NSInteger)tag; @end @interface WJSwitchView : UIView @property(nonatomic,weak) id <WJSwitchViewDelegate> delegate;//代理 -(instancetype)initWithFrame:(CGRect)frame withTag:(NSInteger)tag delegate:(id)delegate; @end

WJSwitch.m

#import "WJSwitchView.h"

@interface WJSwitchView (){

    BOOL isOpen;//是否開啟(右邊為開啟)

}

@property(nonatomic,strong) UIImageView  * bgView;//背景圖片

@property(nonatomic,strong) UIImageView  * btnView;//按鈕圖片

@property(nonatomic,assign) CGFloat beginpoint;//開始的位置

@end

@implementation WJSwitchView
-(instancetype)initWithFrame:(CGRect)frame withTag:(NSInteger)tag delegate:(id)delegate{ if (self = [super initWithFrame:frame]) { [self setFrame:frame]; [self setBtnImageView]; self.tag = tag; self.delegate = delegate; } return self; } /** * 設定按鈕背景圖片 */ -(void)setBtnImageView{ //設定背景圖片 self.bgView = [[UIImageView alloc] initWithFrame:self.bounds]; [self.bgView setImage:[UIImage imageNamed:@"bgViewOff"]]; [self addSubview:self.bgView]; isOpen = NO; //設定按鈕圖片 self.btnView = [[UIImageView alloc] initWithFrame:CGRectMake(2, 2, CGRectGetWidth(self.frame)/2, CGRectGetHeight(self.frame)-4)]; [self.btnView setImage:[UIImage imageNamed:@"switchBtn"]]; [self addSubview:self.btnView]; }

觸控方法

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{


    //    UITouch * touch = [touches anyObject];
    //    self.beginpoint = [touch locationInView:self].x;

    if (!isOpen) {
        [self switchOpen];
        isOpen = YES;

    }else{

        [self switchClose];
        isOpen = NO;

    }

    //實現協議方法 傳遞按鈕tag和是否開啟
    if (self.delegate  && [self.delegate respondsToSelector:@selector(WJSwitchViewDelegateWithSwitchStates: withTag:)]) {
        [self.delegate WJSwitchViewDelegateWithSwitchStates:isOpen withTag:self.tag];
    }

}
/**
 *  開啟
 */
-(void)switchOpen{

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.005 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        [self.bgView setImage:[UIImage imageNamed:@"bgViewOn"]];
    });
    CGFloat X = CGRectGetWidth(self.frame)/2;
    CGRect frame = self.btnView.frame;
     /*建立彈性動畫
     damping:阻尼,範圍0-1,阻尼越接近於0,彈性效果越明顯
     velocity:彈性復位的速度
     */
    [UIView animateWithDuration:0.2 delay:0 usingSpringWithDamping:0.8 initialSpringVelocity:1.0 options:UIViewAnimationOptionCurveLinear animations:^{
        [self.btnView setFrame:CGRectMake(X, frame.origin.y, frame.size.width, frame.size.height)];
    } completion:nil];
}

/**
 *  關閉
 */
-(void)switchClose{
    //替換圖片 這裡僅做簡單的圖片替換
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.005 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        [self.bgView setImage:[UIImage imageNamed:@"bgViewOff"]];
    });
    CGFloat X = 2;
    CGRect frame = self.btnView.frame;
    //修改按鈕圖片的位置
 [UIView animateWithDuration:0.2 delay:0 usingSpringWithDamping:0.9 initialSpringVelocity:1.0 options:UIViewAnimationOptionCurveLinear animations:^{
         [self.btnView setFrame:CGRectMake(X, frame.origin.y, frame.size.width, frame.size.height)];
    } completion:nil];
}

viewController.m

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    //建立view
    WJSwitchView * firstView = [[WJSwitchView alloc] initWithFrame:self.firstSwitchView.bounds withTag:1 delegate:self];
    [self.firstSwitchView addSubview:firstView];

    WJSwitchView * secondView = [[WJSwitchView alloc] initWithFrame:self.firstSwitchView.bounds withTag:2 delegate:self];
    [self.secondSwitchView addSubview:secondView];

    WJSwitchView * thirdView = [[WJSwitchView alloc] initWithFrame:self.firstSwitchView.bounds withTag:3 delegate:self];
    [self.thirdSwitchView addSubview:thirdView];

}
#pragma mark - WJSwitchViewDelegate
//協議方法
-(void)WJSwitchViewDelegateWithSwitchStates:(BOOL)isopen withTag:(NSInteger)tag{

    NSLog(@"%ld",tag);
}

按鈕的位置移動可以使用CAAnimation做一些簡單的動畫過度,或者直接使用UIView的封裝方法實現一些效果來實現,關於動畫的一些基本應用,在文集中有轉載一篇寫的特好的文章講動畫的!!建議自己可以跟著敲一次!!
PS:能用自帶外掛最好勸說需求用吧,畢竟系統的很強大! ~~不過我和我們需求談判失敗了…

相關推薦

簡單定義選擇按鈕(switchDemo)

雖然系統的UISwitch效果已經很好了,附帶的動畫效果也是很好的,但是在實際開發中UI和程式設計師對頭(產品經理)經常會要求按照專案的整體效果使用其他的圖片或者背景來代替,這裡僅在專案中做了一個簡單的自定義switch. demo圖樣 主要是使用自

Android之——史上最簡單定義開關按鈕的實現

很多時候,我們在很多無論是Android還是IOS的APP中都會遇到這樣的一種效果,有一個按鈕,我們點選一下,便會滑動一下,一會顯示“開”,一會顯示“關”,這便是開關按鈕了,比如:很多Android手機的設定功能裡,就有很多功能是用開關按鈕實現的,那麼這些開關按鈕時如何實

定義左右按鈕選擇控制元件

public class UISwitchButton extends CheckBox { private Paint mPaint; private RectF mSaveLayerRectF; private float mFirstDownY; privat

導航欄使用UIButton定義返回按鈕的圖片

idl smi uic uiimage clas ini anim literal 使用 - (void)viewDidLoad { UIButton *backItem = [UIButton buttonWithType:UIButtonTypeCustom];

簡單定義VIEW報錯問題

nfc 定義 http dnf androi dem and .com android aNDROIDNFC%E8%AF%BB%E5%8D%A1%E5%99%A8%E7%9A%84DEMO http://music.baidu.com/songlist/495819911

定義選擇安裝offic2016組件

ins 點擊 後退 center 安裝完成 等待 忽略 3.0 下載 本次安裝使用Office 2016 Install v3.0 這個工具實現 1、首先下載 Office 2016 Install v3.0 工具 2、解壓後出現的一個與工具名一樣的文件夾以及一個安裝說明(

Jquery mobile 定義 返回按鈕 data-rel="back"

pla ole view student ajax ati source -i alt data-rel="back" 第一個頁面 主頁面 studentmaster.html 通過下面js腳本跳轉到詳情頁面 window.location.href="student

C#定義Button按鈕控件

pre span 用戶 gif mov 設置 color 繪制 tex C#自定義Button按鈕控件 在實際開發中經常可以遇到有的控件並不一定可以滿足需要,因此需要自定義開發,這裏做了一個簡單的按鈕控件,特意帖上來,如有不足之處請見諒! 按鈕素材: 這裏截圖

後臺文章編輯器的可視區域添加定義功能按鈕

nload rac IT 樣式 admin lte size gist != 有時候我們需要自定義一些樣式或者功能,要麽就是直接在Text區域直接寫html代碼, 還有一種方法就是直接將自定義一些樣式或者功能添加到後臺文章編輯器的 可視區域。具體實現方式如下: 首先在對應的

duilib中將xml封裝為控制元件簡單示例(簡單定義控制元件,封裝幾個基本控制元件合為1個定義控制元件)

使用duilib的時候,難免會有這樣的需求: 某一塊Container(Layout)以及裡面的佈局需要重複用,不想每次都複製貼上這麼多,要不然xml太大了; 通過繼承來自定義一個控制元件,比如CButtonUIEx之類的,想讓他像button一樣在xml中被識別; xml裡面的東西

Android原生繪圖進度條+簡單定義屬性程式碼生成器

零、前言 1.感覺切拼字串是個很有意思的事,好的拼接方式可以自動生成一些很實用的東西 2.本文自定義控制元件並不是很高大上的東西,目的在於計錄自定義控制元件的書寫規範與行文流程 3.建議大家自定義控制元件時自定義屬性有自己專屬字首,有利無害,何樂不為 4.本文是根據鴻洋在慕課網上的教程敲的:詳見,自己

HTML定義選取按鈕(input樣式的按鈕

自定義檔案上傳按鈕 谷歌瀏覽器下,預設的按鈕是這個樣子的: 火狐瀏覽器下是醬紫的: IE瀏覽器下是這個樣子的: 個人表示真的醜陋,無法接受! 修改 首先 <!DOCTYPE html> <html&g

定義選擇性別

html: <div class="label"> <label for="man" class="radio_label checked"> <input type="radio" name="sex" id="man" value

Spark ML定義選擇最優模型演算法深入剖析-Spark商業ML實戰

本套技術專欄是作者(秦凱新)平時工作的總結和昇華,通過從真實商業環境抽取案例進行總結和分享,並給出商業應用的調優建議和叢集環境容量規劃等內容,請持續關注本套部落格。版權宣告:禁止轉載,歡迎學習。QQ郵箱地址:[email protected],如有任何商業交流,可隨時聯絡。

[Xcode10 實際操作]三、檢視控制器-(7)UINavigationController定義導航按鈕

本文將演示設定導航按鈕的樣式,以及設定導航標題區域的樣式。 1 import UIKit 2 3 class FirstSubViewController: UIViewController { 4 5 override func viewDidLoad() { 6

微信小程式poster封面閃逝以及定義播放按鈕

小程式中poster封面閃消失,以及用圖片自定義播放按鈕,注意下面是以元件的形式來寫非頁面如下: wxml: <view > <video id='myvedio' bindended="endvedio" style="width: 100%;height=400px;

react-native定義返回按鈕 headerBackImage

class BackImage extends React.Component { //建立一個返回按鈕的元件 render() { return ( <Image source={require('../res/imgs/RightArrow.pn

使用VBA代碼實現簡單定義函數(1)

分享圖片 excel表格 style 實現 圖片 ima 我們 text inf 自定義函數VBA代碼1 有一份數據如下,要添加季度信息,我們用VBA實現自定義季度函數: 打開VBE編輯器,插入一個函數 代碼如下: 此時返回excel表格出現了我們自定義的函數如下:

android:ijkplayer播放器的整合及簡單定義播放器

關於ijkplayer 最近公司準備要開發的專案裡涉及到播放器的功能模組,於是對Android播放器框架進行了預研。目前ijkplayer框架是為大多數公司及開發者青睞的框架。 ijkplayer是一個基於FFmpeg的輕量級Android/iOS視訊播放器。F

Android學習—簡單定義View(一)

最近手上不忙所以回顧了一下自己今年來所接觸和學習的東西,突然覺得寫部落格真是一個很好的方式,希望自己 可以堅持下去。 自定義View的流程 建立自定義類繼承View,並重寫構造方法,構造方法總共有四種,我們暫時只需要繼承前兩種 public CircleVi