ã³ã³ãããŒã«ã¯ãã¢ããªã±ãŒã·ã§ã³ã®æãéèŠãªã³ã³ããŒãã³ãã®1ã€ã§ãã å®éããããã¯ãŠãŒã¶ãŒãäœããã®æ¹æ³ã§ã¢ããªã±ãŒã·ã§ã³ããã®ããŒã¿ãšå¯Ÿè©±ã§ããããã«ããã°ã©ãã£ãã¯ã³ã³ããŒãã³ãã§ãã ãã®ã¬ãã¹ã³ã§ã¯ãã¢ããªã±ãŒã·ã§ã³ã§åŸã§äœ¿çšã§ããã«ã¹ã¿ã ã³ã³ãããŒã«ãäœæããŸãã
Appleã¯ãéçºè
ã«
UITextField
ã
UIButton
UISwitch
ãå«ãçŽ20ã®ç°ãªãUIã³ã³ããŒãã³ããæäŸã
UIButton
ã æšæºã³ã³ãããŒã«ã®ãã¹ãŠã®æ©èœã䜿çšããŠãããŸããŸãªã€ã³ã¿ãŒãã§ã€ã¹ãªãã·ã§ã³ãäœæã§ããŸãã å Žåã«ãã£ãŠã¯ãæšæºã³ã³ããŒãã³ãã§ã¯å®çŸã§ããªããã®ãå¿
èŠã«ãªãããšããããŸãã
äŸãæããŸãããã 販売äžã®äžåç£ã®ãªã¹ããã³ã³ãã€ã«ããã¢ããªã±ãŒã·ã§ã³ãéçºããŠãããšããŸãã ãŠãŒã¶ãŒã¯ãç¹å®ã®äŸ¡æ Œåž¯ã§æ€çŽ¢çµæã衚瀺ã§ããŸãã å¥ã®æ¹æ³ãšããŠã2ã€ã®
UISlider
ã䜿çšã§ããŸãã1ã€ã¯ã¹ã¯ãªãŒã³ã·ã§ããã«ç€ºãããã«ã1ã€ã¯æäœäŸ¡æ Œãèšå®ãããã1ã€ã¯æ倧å€ãèšå®ããŸãã
ãã®ãªãã·ã§ã³ã¯æ©èœããŸãããäŸ¡æ Œåž¯ã®æŠå¿µãããŸããã瀺ããŠããŸããã æå°å€ãšæ倧å€ãæ
åœãã2ã€ã®ã¹ã©ã€ããŒãåãã1ã€ã®ã¹ã©ã€ããŒã䜿çšããããšããå§ãããŸãã
ãã®ãããªèŠçŽ ã¯äœ¿çšããæ¹ãã¯ããã«äŸ¿å©ã§ãããŠãŒã¶ãŒã¯ãåºå®å€ã§ã¯ãªãå€ã®ç¯å²ãèšå®ããããšãããã«ç解ããŸãã æ®å¿µãªããããã®ãããªã¹ã©ã€ããŒã¯æšæºèŠçŽ ã®ã»ããã«ã¯å«ãŸããŠããŸããã ãã®æ©èœãå®è£
ããã«ã¯ãã«ã¹ã¿ã ã³ã³ãããŒã«ãéçºããå¿
èŠããããŸãã
ãã®ãããªã¹ã©ã€ããŒã
UIView
ãµãã¯ã©ã¹ã«ããããšãã§ããŸãã ãããŠãããç¹å®ã®ã¢ããªã±ãŒã·ã§ã³ã®ã³ã³ããã¹ãã§ããã®ãããªãœãªã¥ãŒã·ã§ã³ãããèªäœãæ£åœåããå Žåãä»ã®éçºã§ãããåå©çšããã«ã¯ãããããã®åªåãå¿
èŠã§ãã ãã®ã³ã³ããŒãã³ãããŠãããŒãµã«ã«ããŠãããããã¢ããªã±ãŒã·ã§ã³ã§äœ¿çšã§ããããã«ããããšããå§ãããŸãã ãããã«ã¹ã¿ã ã³ã³ãããŒã«ã®æå³ã§ãã
æ¢ã«è¿°ã¹ãããã«ãã«ã¹ã¿ã ã³ã³ããŒãã³ãã¯
UIKit Framework
ãäœæããã³ã³ãããŒã«ã§ããã
UIKit Framework
äžéšã§ã¯ãããŸããã æšæºã³ã³ããŒãã³ããšåæ§ã«ããããã¯å®å
šã«æ®éçã§ãããããããŒãºã«ã«ã¹ã¿ãã€ãºå¯èœã§ãªããã°ãªããŸããã æè¿ãéçºè
ã®ã³ââãã¥ããã£å
šäœã圢æãããã³ã³ããŒãã³ãããããªãã¯ãã¡ã€ã³ã«æ²èŒããŠããŸãã
ãã®ã¬ãã¹ã³ã§ã¯ãäžèšã®åé¡ã解決ããç¬èªã®
RangeSlider
ã³ã³ãããŒã«ãéçºããæ¹æ³ã瀺ããŸãã æ¢åã®ã³ã³ããŒãã³ãã®æ¡åŒµãAPIã®éçºãäœæç©ã®ãããªãã¯ã¢ã¯ã»ã¹ãªã©ã®åé¡ã圱é¿ãåããŸãã
çè«ã¯ååã ïŒ ã«ã¹ã¿ãã€ãºãéå§ããŸãããïŒ
éå§ãã
ãã®ã»ã¯ã·ã§ã³ã§ã¯ãã³ã³ããŒãã³ãã®åºæ¬æ§é ã®éçºã«å°å¿µããŸããããã¯ãç»é¢ã«ç°¡åãªã¹ã©ã€ããŒã衚瀺ããã®ã«ååã§ãã
Xcodeãèµ·åãã[
ãã¡ã€ã«]-> [æ°èŠ]-> [ãããžã§ã¯ã]ãéžæã
ãŸã ã 衚瀺ããããŠã£ã³ããŠã§ã
iOS-> Application-> Single View Applicationãéžæã ã
Nextãã¯ãªãã¯ããŸãã 次ã®ç»é¢ã§ããããžã§ã¯ã
åãšããŠ
CERangeSliderãšå
¥åããæ®ãã®ãã£ãŒã«ãã«å
¥åããŸãã
ãã®ãããžã§ã¯ãã§ã¯ã1ã€ã®ç»é¢ã§æäœãããããã¹ããŒãªãŒããŒãã¯äœ¿çšãããŸããã ã¯ã©ã¹ãã¬ãã£ãã¯ã¹ãšããŠä»ã®ãã®ã䜿çšã§ããŸããæãéèŠãªããšã¯ã察å¿ããå€æŽãã¢ããªã±ãŒã·ã§ã³ã³ãŒãã§çºçããããšãå¿ããªãã§ãã ããã
ãçµç¹åããã£ãŒã«ããš
ãäŒç€Ÿèå¥åããã£ãŒã«ãã«ç¬èªã®å€ãå
¥åã§ããŸãã å®äºãããã
ã次㞠ããã¯ãªãã¯ããŸãã ãããžã§ã¯ãã®ä¿åå Žæãéžæãã[
äœæ ]ãã¯ãªãã¯ã
ãŸã ã
ã«ã¹ã¿ã ã³ã³ãããŒã«ãäœæãããšãã«è¡ãå¿
èŠãããæåã®æ±ºå®ã¯ãç¶æ¿ãŸãã¯æ¡åŒµããæ¢åã®ã¯ã©ã¹ã§ãã ã¯ã©ã¹
UIView
ããšãéèŠã§ãã
Apple UIKit
ããŸããŸãªã³ã³ããŒãã³ããããèŠããšã
UILabel
ã
UIWebView
ãªã©ã®å€ãã®èŠçŽ ã
UIView
çŽæ¥ç¶æ¿ããŠããããšã
UILabel
ãŸãã ãã ãããã®å³ã«ç€ºãããã«ã
UIControl
ãç¶æ¿ããèŠçŽ ãååšããå¯èœæ§ããããŸãã
泚ïŒã€ã³ã¿ãŒãã§ã€ã¹èŠçŽ ã®è©³çŽ°ãªéå±€ã¯ã UIKit Framework Referenceã«ãããŸãã
UIControl
ã¯ã©ã¹ã¯ãåºæ¬çã«ã³ã³ããŒãã³ãã®å€æŽãéç¥ããæ¹æ³ã§ãã
Target-Actionãã³ãã¬ãŒããå®è£
ããŸãã
UIControl
ã¯ããªããžã§ã¯ãã®ç¶æ
ã®ç£èŠã«é¢é£ããããã€ãã®ããããã£
UIControl
ãããŸãã ãã®ãããªãã³ãã¬ãŒãã䜿çšããŠã³ã³ããŒãã³ããäœæããããã
UIControl
ãåªããåºçº
UIControl
ãšãªããŸãã
Project Navigator㧠CERangeSliderã°ã«ãŒããå³ã¯ãªãã¯ãã[
æ°èŠãã¡ã€ã«]ãéžæããŠãã
ã[ iOS]-> [Cocoa Touch]-> [Objective-C class ]ãéžæãã[
次㞠]ãã¯ãªãã¯ããŸãã ã¯ã©ã¹ã«
CERangeSliderãšããååãä»ãã
ããµãã¯ã©ã¹ããã£ãŒã«ãã«
UIControl ãšå
¥åã
ãŸã ã
ã次ãžãããã³ã
äœæããã¯ãªãã¯ããŠãã¯ã©ã¹ã®ä¿åå ŽæãéžæããŸãã
ã³ãŒãã®èšè¿°èªäœã¯æ¥œããããã»ã¹ã§ãããã»ãšãã©ã®å Žåãã¢ã€ãã ãç»é¢ã«ã©ã®ããã«è¡šç€ºããããã確èªããå¿
èŠããããŸãã ã³ãŒãã®èšè¿°ãéå§ããåã«ãã³ã³ããŒãã³ãã
View Controllerã«è¿œå ããŸãã
CEViewController.mãéãã次ã®è¡ã貌ãä»ããŸãã
#import "CERangeSlider.h"
次ã«ãåããã¡ã€ã«ã«å€æ°ãè¿œå ããŸãã
@implementation CEViewController { CERangeSlider* _rangeSlider; }
æšæºã®
viewDidLoad
次ã®ã³ãŒããããã¯ã«çœ®ãæããŸãã
- (void)viewDidLoad { [super viewDidLoad];
ãã®ã³ãŒãã¯ãå¿
èŠãªãã£ã¡ã³ã·ã§ã³ãæã€ã¯ã©ã¹ã®ãªããžã§ã¯ããäœæããç»é¢ã«è¿œå ããŸãã ã³ã³ããŒãã³ãã®èæ¯è²ã¯ãã¢ããªã±ãŒã·ã§ã³ã®ã¡ã€ã³ã®èæ¯ã§ç®ç«ã€ããã«èµ€ã«èšå®ãããŸãã è²ãæå®ããªãå Žåãã³ã³ããŒãã³ãã¯éæã®ãŸãŸã«ãªããæ¶ããå Žæãé·æéããºã«ããŸãã ïŒ]
ã¢ããªã±ãŒã·ã§ã³ããã«ãããŠå®è¡ããŸãã 次ã®ç»é¢ã衚瀺ãããŸãã
ãããžã§ã¯ãã«èŠèŠèŠçŽ ãè¿œå ããåã«ãã³ã³ããŒãã³ãã«ä¿åãããŠããããŸããŸãªæ
å ±ã远跡ããããã«ãããã€ãã®ããããã£ãäœæããå¿
èŠããããŸãã ããã¯ãå°æ¥ã®APIãäœæããããã®åºç€ãšããŠæ©èœããŸãã
泚ïŒã³ã³ããŒãã³ãAPIã¯ãä»ã®éçºè
ã«æäŸããäºå®ã®ã¡ãœãããšããããã£ãå®çŸ©ããŸãã èšäºã®åŸåã§ãAPIã®æ§é ã«ã€ããŠèªãããšã«ãªããŸããä»ã®ãšãããé£çµ¡ãåãåããŸãããïŒ
æšæºã³ã³ããŒãã³ãããããã£ãè¿œå ãã
CERangeSlider.hãéãã
@ interfaceãš
@end:
éã«æ¬¡ã®ããããã£ãè¿œå ããŸã
@end:
@property (nonatomic) float maximumValue; @property (nonatomic) float minimumValue; @property (nonatomic) float upperValue; @property (nonatomic) float lowerValue;
ãããã®4ã€ã®ããããã£ã¯ãã³ã³ããŒãã³ãã®ç¶æ
ïŒç¯å²ã®æ倧å€ãšæå°å€ãããã³çŸåšã®äžéãšäžéã®ãããå€ïŒãèšè¿°ããã®ã«ååã§ãã
é©åã«èšèšãããã³ã³ãããŒã«ã«ã¯æšæºèšå®ãå«ãŸããŠããå¿
èŠããããŸããããã§ãªããšãç»é¢ã«ã¬ã³ããªã³ã°ãããšãã«å°ãå¥åŠã«èŠããŸãã
CERangeSlider.mãéãã
Xcodeã«ãã£ãŠçæããã
initWithFrame:
ã¡ãœãããèŠã€ããŠã次ã®ã³ãŒãã«çœ®ãæããŸãã
- (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) {
次ã«ãã³ã³ããŒãã³ãã®ã€ã³ã¿ã©ã¯ãã£ãèŠçŽ ã§ããã¹ã©ã€ããŒãšããããé
眮ãããŠããããã°ã¬ã¹ããŒãæäœããŸãã
ç»åãš Coregraphics
ç»é¢ã«ã¢ã€ãã ã衚瀺ããæ¹æ³ã¯2ã€ãããŸãã
- ç»åã³ã³ããŒãã³ãã®äžéšãšããŠäœ¿çšãã
- ã¬ã€ã€ãŒãšCore Graphicsã®çµã¿åããã䜿çšããŸãã
åã¡ãœããã«ã¯é·æãšçæããããŸãã
- å°ãªããšãæç»ã§ããå Žåã¯ãç»åã䜿çšããã®ãæãç°¡åãªãªãã·ã§ã³ã§ãã ä»ã®éçºè
ããããã®ç»åãç¬èªã®ç»åã«çœ®ãæããããšãèš±å¯ããå Žåã¯ã
UIImage
ããããã£ãšããŠèšå®ã§ããŸãã - ã€ã¡ãŒãžã䜿çšãããšãã³ã³ããŒãã³ãã«ååãªæè»æ§ãæäŸãããŸãã ãµãŒãããŒãã£ã®éçºè
ã¯ãã¹ãŠã®ãã¯ã»ã«ã«è³ããŸã§ãã¹ãŠãå€æŽã§ããŸãããäžæ¹ã§ã¯ç¹å®ã®æç»ã¹ãã«ãå¿
èŠã§ãããŸããã³ãŒãã䜿çšããŠäœããå€æŽããããšã¯éåžžã«å°é£ã§ãã
ã¢ããªã±ãŒã·ã§ã³ã³ãŒãã¯ã
Core Graphicsã䜿çšããŠã³ã³ããŒãã³ãã衚瀺ãã責任ãããããã®çµæãããã°ã©ãã¯ããã«å€ãã®åŽåãå¿
èŠãšããŸãã ãããããã®æ¹æ³ã«ãããããæè»ãªAPIãæ§ç¯ã§ããŸãã
Core Graphicsã䜿çšãããšãã³ã³ããŒãã³ãã®ã»ãŒãã¹ãŠã®ããããã£ïŒè²ãåããæ²çïŒãããã³å®éã«ã¬ã³ããªã³ã°ãè¡ããã©ã¡ãŒã¿ãŒãèšå®ã§ããŸãã ãã®ã¢ãããŒãã«ãããéçºè
ã¯ã³ã³ãããŒã«ã䜿çšããŠãããŒãºã«ç°¡åã«é©åãããããšãã§ããŸãã
ãã®ã¬ãã¹ã³ã§ã¯ã2çªç®ã®ã¢ãããŒãã§ãã
Core Graphicsã䜿çšããŸãã
泚ïŒäžæè°ãªããšã«ãAppleã¯ã³ã³ããŒãã³ãã§ã°ã©ãã£ãã¯ãªãœãŒã¹ã䜿çšããããšã奜ã¿ãŸãã ã»ãšãã©ã®å Žåãããã¯åèŠçŽ ã®æšæºãµã€ãºãèšå®ããå®å
šãªã«ã¹ã¿ãã€ãºãèš±å¯ããŠããªãããã§ãã
Xcode㧠ããããžã§ã¯ãèšå®ãŠã£ã³ããŠã«ç§»åããŸãã 次ã«ãã
ãã«ããã§ãŒãºãã¿ããšã
ã©ã€ãã©ãªãšãã€ããªããªã³ã¯ãã»ã¯ã·ã§ã³ãéžæããŸãã ãªã¹ãã«
QuartzCore.frameworkãè¿œå ããŸãã ãã®ãã¬ãŒã ã¯ãŒã¯ã®ã¯ã©ã¹ãšã¡ãœããã¯ãã³ã³ããŒãã³ããæåã§ã¬ã³ããªã³ã°ããããã«äœ¿çšãããŸãã
ãã®ã¹ã¯ãªãŒã³ã·ã§ããã¯ãæ··ä¹±ããå Žåã«
QuartzCore.frameworkãèŠã€ããŠè¿œå ããæ¹æ³ã瀺ããŠããŸãã
CERangeSlider.mãéãã次ã®è¡ãè¿œå ããŸãã
#import <QuartzCore/QuartzCore.h>
@implementation
çŽåŸã«ãåããã¡ã€ã«ã«æ¬¡ã®å€æ°ãè¿œå ããŸãã
@implementation CERangeSlider { CALayer* _trackLayer; CALayer* _upperKnobLayer; CALayer* _lowerKnobLayer; float _knobWidth; float _useableTrackLength; }
ãããã®3ã€ã®ã¬ã€ã€ãŒ
_trackLayer
ã
_upperKnobLayer
ããã³
_lowerKnobLayer
ã¯ãã³ã³ããŒãã³ãã®ããŸããŸãªèŠçŽ ã衚瀺ããããã«äœ¿çšãããŸãã 2ã€ã®å€æ°
_knobWidth
ããã³
_useableTrackLength
ã¯ããããã®èŠçŽ ã®ãã©ã¡ãŒã¿ãŒãèšå®ããããã«äœ¿çšãããŸãã
initWithFrame:
èŠã€ããŠã次ã®ã³ãŒãã
if (self) { }
ãããã¯ã«è¿œå ããŸãã
_trackLayer = [CALayer layer]; _trackLayer.backgroundColor = [UIColor blueColor].CGColor; [self.layer addSublayer:_trackLayer]; _upperKnobLayer = [CALayer layer]; _upperKnobLayer.backgroundColor = [UIColor greenColor].CGColor; [self.layer addSublayer:_upperKnobLayer]; _lowerKnobLayer = [CALayer layer]; _lowerKnobLayer.backgroundColor = [UIColor greenColor].CGColor; [self.layer addSublayer:_lowerKnobLayer]; [self setLayerFrames];
ãã®ã³ãŒããããã¯ã¯3ã€ã®ã¬ã€ã€ãŒãäœæããããããã¡ã€ã³ã®ã¬ã€ã€ãŒã«åãšããŠè¿œå ããŸãã åããã¡ã€ã«ã«æ¬¡ã®ã¡ãœãããè¿œå ããŸãã
- (void) setLayerFrames { _trackLayer.frame = CGRectInset(self.bounds, 0, self.bounds.size.height / 3.5); [_trackLayer setNeedsDisplay]; _knobWidth = self.bounds.size.height; _useableTrackLength = self.bounds.size.width - _knobWidth; float upperKnobCentre = [self positionForValue:_upperValue]; _upperKnobLayer.frame = CGRectMake(upperKnobCentre - _knobWidth / 2, 0, _knobWidth, _knobWidth); float lowerKnobCentre = [self positionForValue:_lowerValue]; _lowerKnobLayer.frame = CGRectMake(lowerKnobCentre - _knobWidth / 2, 0, _knobWidth, _knobWidth); [_upperKnobLayer setNeedsDisplay]; [_lowerKnobLayer setNeedsDisplay]; } - (float) positionForValue:(float)value { return _useableTrackLength * (value - _minimumValue) / (_maximumValue - _minimumValue) + (_knobWidth / 2); }
setLayerFrames
ã¯ãã¹ã©ã€ããŒã®çŸåšã®å€ã«åºã¥ããŠãã¹ã©ã€ããŒãšé²è¡ç¶æ³ããŒã®äž¡æ¹ã®ãµã€ãºãèšå®ããŸãã
positionForValue
ã¯ãåçŽãªæ¯çã䜿çšããŠå€ãç»é¢ã®åº§æšã«ãã€ã³ãããã³ã³ããŒãã³ãã®æ倧å€ãšæå°å€ã®éã®è·é¢ãã¹ã±ãŒãªã³ã°ããŸãã
ã¢ããªã±ãŒã·ã§ã³ãã³ã³ãã€ã«ããŠå®è¡ããŸãã ã¹ã©ã€ããŒã圢ã«ãªãå§ããŸãïŒ æ¬¡ã®ããã«ãªããŸãã
ã³ã³ããŒãã³ãã¯ãã©ãŒã ãååŸããŸããããäœæ¥ã¯ãŸã å§ãŸã£ãã°ããã§ããçµå±ãåã³ã³ãããŒã«ã¯ãŠãŒã¶ãŒã«ãã©ãŒã ã管çããæ©èœãæäŸããå¿
èŠããããŸãã ããªãã®å ŽåããŠãŒã¶ãŒã¯åã¹ã©ã€ããŒãåãããŠãåžæã®ç¯å²ãèšå®ã§ããã¯ãã§ãã ãããã®å€æŽã远跡ããå€ã«åºã¥ããŠã³ã³ããŒãã³ãã®ããããã£ãšå€èŠ³ã®äž¡æ¹ãæŽæ°ããŸãã
ã€ã³ã¿ã©ã¯ãã£ãæ©èœã³ã³ããŒãã³ããè¿œå
ãŠãŒã¶ãŒãã³ã³ããŒãã³ããšããåãããã³ãŒãã¯ãã©ã®ã¹ã©ã€ããŒã移åãããã远跡ããããã«å¿ããŠå€èŠ³ãæŽæ°ããå¿
èŠããããŸãã ãããå®è£
ããã®ã«æé©ãªå Žæã¯ãã³ã³ããŒãã³ãã®ã¬ã€ã€ãŒã§ãã
æ°ãããã¡ã€ã«ã
CERangeSliderã°ã«ãŒãã«è¿œå ããŸãã
æ°èŠãã¡ã€ã«-> iOS- > Cocoa Touch- > Objective-Cã¯ã©ã¹ ã
CALayer
ãµãã¯ã©ã¹ã«ããŠ
CERangeSliderKnobLayerãšããååã
ä»ããŸãã
æ°ããäœæããã
CERangeSliderKnobLayer.hãéãããã®å
容ã次ã®ãã®ã«çœ®ãæããŸãã
#import <QuartzCore/QuartzCore.h> @class CERangeSlider; @interface CERangeSliderKnobLayer : CALayer @property BOOL highlighted; @property (weak) CERangeSlider* slider; @end
ãã®ã³ãŒãã¯2ã€ã®ããããã£ãè¿œå ããŸãã1ã€ã¯ã¹ã©ã€ããŒã匷調衚瀺ãããŠãããã©ããã瀺ãããã1ã€ã¯èŠªã¹ã©ã€ããŒã瀺ããŠããŸãã
CERangeSliderKnobLayer.mãéãã
ïŒimportãè¿œå ã
#import
ã
#import "CERangeSliderKnobLayer.h"
次ã«ã
@implementation
ãããã¯ã®
_upperKnobLayer
ããã³
_lowerKnobLayer
ã¿ã€ããå€æŽããŸãã
CERangeSliderKnobLayer* _upperKnobLayer; CERangeSliderKnobLayer* _lowerKnobLayer;
ãããã®ã¬ã€ã€ãŒã¯ãæ°ããäœæããã
CERangeSliderKnobLayerã¯ã©ã¹ã®ãªããžã§ã¯ãã«ãªããŸããã
åã
CERangeSlider.mã§
initWithFrame:
èŠã€ããåæåã³ãŒã
upperKnobLayer
ãš
lowerKnobLayer
ã次ã®ã³ãŒããããã¯ã«çœ®ãæããŸãã
_upperKnobLayer = [CERangeSliderKnobLayer layer]; _upperKnobLayer.slider = self; _upperKnobLayer.backgroundColor = [UIColor greenColor].CGColor; [self.layer addSublayer:_upperKnobLayer]; _lowerKnobLayer = [CERangeSliderKnobLayer layer]; _lowerKnobLayer.slider = self; _lowerKnobLayer.backgroundColor = [UIColor greenColor].CGColor; [self.layer addSublayer:_lowerKnobLayer];
ãã®ã³ãŒãã¯ãäœæããã¯ã©ã¹ã䜿çšããŠã¬ã€ã€ãŒãåæåãã
slider
ããããã£ã
self
èšå®ããŸãã ãããžã§ã¯ããå®è¡ãããã¹ãŠãã¹ã¯ãªãŒã³ã·ã§ãããšåãã«èŠããããšã確èªããŸãã
ã¬ã€ã€ãŒãé
眮ãããã®ã§ãã¹ã©ã€ããŒã移åããæ©èœãå®çŸããå¿
èŠããããŸãã
ã¯ãªãã¯ãã³ãã©ãŒãè¿œå ãã
CERangeSlider.mãéããå€æ°å®£èšãããã¯ã®äžã«æ¬¡ã®ã³ãŒããè¿œå ããŸãã
CGPoint _previousTouchPoint;
ãã®å€æ°ã¯ãã¯ãªãã¯åº§æšã远跡ããããã«äœ¿çšãããŸãã ã³ã³ããŒãã³ãã®ããŸããŸãªã¯ãªãã¯ã€ãã³ããšãªãªãŒã¹ã€ãã³ããã©ã®ããã«è¿œè·¡ããŸããïŒ
UIControl
ã¯ãã¯ãªãã¯ã远跡ããããã®ããã€ãã®ã¡ãœãããæäŸããŸãã UIControl
UIControl
ã¯ãããã®ã¡ãœããããªãŒããŒã©ã€ãããŠãç¬èªã®ããžãã¯ãå®è£
ã§ããŸãã ã³ã³ãããŒã«ã§
continueTrackingWithTouch
beginTrackingWithTouch
ã
continueTrackingWithTouch
ããã³
endTrackingWithTouch
3ã€ã®ã¡ãœããããªãŒããŒã©ã€ãããŸãã
CERangeSlider.mã«æ¬¡ã®ã¡ãœãããè¿œå ããŸãã
- (BOOL)beginTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event { _previousTouchPoint = [touch locationInView:self];
ãã®ã¡ãœããã¯ããŠãŒã¶ãŒãæåã«ã³ã³ããŒãã³ãã«è§Šãããšãã«åŒã³åºãããŸãã ã¯ãªãã¯ã€ãã³ããã³ã³ããŒãã³ã座æšç³»ã«å€æããŸãã 次ã«ãåã¹ã©ã€ããŒããã§ãã¯ããŠãã¯ãªãã¯ãããããã®ç¯å²å
ã«åãŸã£ãŠãããã©ãããå€æããŸãã ãã®çµæãã¡ãœããã¯çŸåšã®ã¯ãªãã¯ã远跡ãããã©ããã«ã€ããŠèŠªã¯ã©ã¹ã«éç¥ããŸãã
ã¹ã©ã€ããŒã®1ã€ã匷調衚瀺ãããŠããå Žåãã¯ãªãã¯ãã©ããã³ã°ãç¶è¡ãããŸãã
setNeedsDisplay
ã¡ãœãããåŒã³åºããšãã¬ã€ã€ãŒãæŽæ°ãããããšã確èªã§ã
setNeedsDisplay
ããããéèŠãªçç±ãç解ã§ããŸãã
ãã¡ãŒã¹ãã¯ãªãã¯ãã³ãã©ãŒãçšæã§ããã®ã§ããŠãŒã¶ãŒã®æãç»é¢äžãåãåããšãã«ã€ãã³ããåŠçããå¿
èŠããããŸãã
CERangeSlider.mã«æ¬¡ã®ã¡ãœãããè¿œå ããŸãã
#define BOUND(VALUE, UPPER, LOWER) MIN(MAX(VALUE, LOWER), UPPER) - (BOOL)continueTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event { CGPoint touchPoint = [touch locationInView:self]; // 1. determine by how much the user has dragged float delta = touchPoint.x - _previousTouchPoint.x; float valueDelta = (_maximumValue - _minimumValue) * delta / _useableTrackLength; _previousTouchPoint = touchPoint; // 2. update the values if (_lowerKnobLayer.highlighted) { _lowerValue += valueDelta; _lowerValue = BOUND(_lowerValue, _upperValue, _minimumValue); } if (_upperKnobLayer.highlighted) { _upperValue += valueDelta; _upperValue = BOUND(_upperValue, _maximumValue, _lowerValue); } // 3. Update the UI state [CATransaction begin]; [CATransaction setDisableActions:YES] ; [self setLayerFrames]; [CATransaction commit]; return YES; }
ãã®ã³ãŒããã³ã¡ã³ãããšã«åæããŠã¿ãŸãããã
- ãŸãã
delta
-æãåããããã¯ã»ã«æ°ãèšç®ããŸãã 次ã«ãã³ã³ããŒãã³ãã®æå°å€ãšæ倧å€ã«å¿ããŠããããå€æããŸãã - ããã§ã¯ããŠãŒã¶ãŒãã¹ã©ã€ããŒãåãããå Žæã«å¿ããŠãäžéãšäžéãå€æŽããŸãã
MIN/MAX
ããèªã¿ãããBOUND
ãã¯ãã䜿çšããŠããããšã«æ³šæããŠãã ããã - ãã®ã³ãŒããããã¯ã¯ã
disabledActions
ãã©ã°ãCATransaction
èšå®ãdisabledActions
ã ããã«ãããåã¬ã€ã€ãŒã®å¢çã®å€æŽãããã«é©çšãããã¢ãã¡ãŒã·ã§ã³åãããªãããšã確èªã§ããŸãã æåŸã«ã setLayerFrames
ã¡ãœãããsetLayerFrames
ãã¹ã©ã€ããŒãç®çã®å Žæã«ç§»åããŸãã
ã¹ã©ã€ããŒã®åããå®è£
ããŸããããããã§ãã³ã³ããŒãã³ããšã®å¯Ÿè©±ã®çµäºãåŠçããå¿
èŠããããŸãã
CERangeSlider.mã«æ¬¡ã®ã¡ãœãããè¿œå ããŸãã
- (void)endTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event { _lowerKnobLayer.highlighted = _upperKnobLayer.highlighted = NO; [_lowerKnobLayer setNeedsDisplay]; [_upperKnobLayer setNeedsDisplay]; }
ãã®ã³ãŒãã¯ãäž¡æ¹ã®ã¹ã©ã€ããŒãéã¢ã¯ãã£ãç¶æ
ã«æ»ããŸãã ãããžã§ã¯ããèµ·åããŠãæ°ããã¹ã©ã€ããŒã§å°ãéãã§ãã ããïŒ ã¹ã¯ãªãŒã³ã·ã§ãããšåãããã«èŠããã¯ãã§ãïŒ
ã³ã³ããŒãã³ãã®å¢çãè¶ããŠæãåãããã¡ãœããã®å®è¡ãäžæããã«å¢çã«æ»ãããšãã§ããããšã«æ°ä»ããããããŸããã ããã¯ãå°ããªç»é¢ãšäœç²ŸåºŠã®ã¹ã¿ã€ã©ã¹ãåããããã€ã¹ã®äœ¿ããããã®éåžžã«éèŠãªæ©èœã§ãïŒç解ã§ããªãå Žåã¯ãæã«ã€ããŠè©±ããŸãïŒã ïŒ]
å€æŽéç¥
ãããã£ãŠããŠãŒã¶ãŒãç¯å²ã®äžéãšäžéãèšå®ã§ããã€ã³ã¿ã©ã¯ãã£ããªã³ã³ãããŒã«ããããŸãã ããããã¢ããªã±ãŒã·ã§ã³ã§äœ¿çšã§ããããã«ããããã®å€æŽãæ®ãã®ã³ãŒãã«é¢é£ä»ããæ¹æ³ã¯ãããŸããïŒ
NSNotification ã
Key-Value-ObservingïŒKVOïŒ ãå§ä»»ãã³ãã¬ãŒããTarget-Actionãã³ãã¬ãŒããªã©ãå€æŽã®éç¥ã«äœ¿çšã§ããå€ãã®ç°ãªããªãã·ã§ã³ããããŸãã
UIKit
ã®ã³ã³ããŒãã³ããèŠããšã
NSNotificationãŸãã¯
KVOã䜿çšããŠããªãããšãããããŸã
UIKit
ãšã®äºææ§ã®ããã«ãããã2ã€ã®ãªãã·ã§ã³ãæŸæ£ããå¿
èŠããããŸãã
UIKit
ãä»ã®2ã€ã®ãã³ãã¬ãŒã-å§ä»»ãš
Target- UIKit
ãéåžžã«ãã䜿çšãã
UIKit
ã
äž¡æ¹ã®ãã¿ãŒã³ã®è©³çŽ°ãªåæãè¡ããŸãã
- å§ä»»ã䜿çšããŠãããŸããŸãªéç¥ã«äœ¿çšãããå€ãã®ã¡ãœãããå«ããããã³ã«ãäœæããŸãã ã³ã³ããŒãã³ãã«ã¯ãäžè¬ã«ããªã²ãŒããšåŒã°ããããã®ãããã³ã«ãå®è£
ããã¯ã©ã¹ãåãå
¥ããããããã£ããããŸãã å€å
žçãªäŸã¯ãUITableViewDelegateãããã³ã«ãæäŸããUITableViewã§ãã ã³ã³ãããŒã«ã«å«ããããšãã§ããããªã²ãŒããªããžã§ã¯ãã¯1ã€ã ãã§ãã å§ä»»ãããã¡ãœããã¯ä»»æã®æ°ã®ãã©ã¡ãŒã¿ãŒãåãå
¥ããããšãã§ãããããå¿
èŠãªã ãæ
å ±ãæž¡ãããšãã§ããŸãã
- Target-Actionãã³ãã¬ãŒãã¯ã
UIControl
åºæ¬ã¯ã©ã¹ã«ãã£ãŠå®è£
ãããŸãã ã³ã³ããŒãã³ãã®ç¶æ
ãå€åãããšã ã¿ãŒã²ããã«ã¢ã¯ã·ã§ã³ãéç¥ãããŸããã¢ã¯ã·ã§ã³ã¯ã UIControlEvents
åæå€ã®1ã€ã«ãã£ãŠèšè¿°ãããŸãã ãã¹ãŠã®ã¢ã¯ã·ã§ã³ãå¶åŸ¡ããããã«å€ãã®ç®æšãæäŸã§ããŸããç¬èªã®ã€ãã³ãïŒ UIControlEventApplicationReserver
ïŒãè¿œå ããããšã¯å¯èœã§ããããã®æ°ã¯4ã€ã«å¶éãããŠããŸãã ãããã®ã¢ã¯ã·ã§ã³ã¯ãã€ãã³ããšãšãã«æ
å ±ãéä¿¡ã§ããŸããã ãããã£ãŠããããã䜿çšããŠè¿œå ã®ããŒã¿ãéä¿¡ããããšã¯ã§ããŸããã
2ã€ã®ãã¿ãŒã³ã®äž»ãªéãã¯æ¬¡ã®ãšããã§ãã- Target-Actionãã³ãã¬ãŒãã¯ãã®å€æŽããããŒããã£ã¹ãããŸãããå§ä»»ã¯åäžã®ãªããžã§ã¯ãã«å¶éãããŸãã
- å§ä»»ã䜿çšãããšãã¯ããããã³ã«ãç¬ç«ããŠå®è£
ããŸããã€ãŸããéä¿¡ããç¹å®ã®æ
å ±ã決å®ã§ããŸããTarget-Actionã§ã¯ãè¿œå ã®ããŒã¿ã転éã§ããŸããã
ã³ã³ããŒãã³ãã«ã¯ãéç¥ãå¿
èŠãªå¯èœæ§ã®ããç¶æ
ãã€ãã³ããå€ããããŸããã圹å²ãæããã®ã¯ãã¹ã©ã€ããŒã®æ倧å€ãšæå°å€ã ãã§ãããã®ç¶æ³ã§ã¯ãTarget-Actionãã³ãã¬ãŒãã®äœ¿çšãæãæ£åœåãããŸãããããUIControl
ãã¬ãã¹ã³ã®æåã«ç¶æ¿ããçç±ã®1ã€ã§ããã¹ã©ã€ããŒã®èªã¿åãå€ã¯methodå
ã§æŽæ°ãããcontinueTrackingWithTouch:withEvent:
ãããããã§éç¥ã¡ã«ããºã ãå®è£
ããå¿
èŠããããŸããCERangeSlider.mãéããã¡ãœããcontinueTrackingWithTouch:withEvent
ãèŠã€ããŠãåã«æ¬¡ã®ã³ãŒããè¿œå ããŸãreturn YES
ã [self sendActionsForControlEvents:UIControlEventValueChanged];
å€æŽã®å¿
èŠãªç®æšãéç¥ããããã«å¿
èŠãªã®ã¯ããã ãã§ãããŸããããã¯äºæ³ãããç°¡åã§ããïŒCEViewController.mãéããã¡ãœããã®æåŸã«æ¬¡ã®ã³ãŒããè¿œå ããŸããviewDidLoad
[_rangeSlider addTarget:self action:@selector(slideValueChanged:) forControlEvents:UIControlEventValueChanged];
ãã®ã³ãŒãã¯ãslideValueChanged
ã¹ã©ã€ããŒãã€ãã³ããéä¿¡ãããã³ã«ã¡ãœãããå®è¡ãUIControlEventValueChanged
ãŸãã次ã®ã¡ãœãããCEViewController.mã«è¿œå ããŸãã - (void)slideValueChanged:(id)control { NSLog(@"Slider value changed: (%.2f,%.2f)", _rangeSlider.lowerValue, _rangeSlider.upperValue); }
ãã®ã¡ãœããã¯ããã¹ãŠãæ£åžžã«æ©èœããããšã®èšŒæ ãšããŠãã¹ã©ã€ããŒã®ãã¹ãŠã®å€ããã°ã«éä¿¡ããŸããã¢ããªã±ãŒã·ã§ã³ãèµ·åããã¹ã©ã€ããŒã®ã¹ã©ã€ããŒã移åããŸãã座æšã®å€ããã°ã«è¡šç€ºãããŸãïŒæããããã«ãŒããµã©ãã®ããã«èŠããã«ã©ãã«ãªã€ã³ã¿ãŒãã§ã€ã¹ã«æ¢ã«ããããããŠããŸããã³ã³ããŒãã³ãã«æ£ããå€èŠ³ãäžããæãæ¥ãŸããïŒCore Graphicsã䜿çšããŠã³ã³ããŒãã³ãã®å€èŠ³ãå€æŽãã
ãŸããã¹ã©ã€ããŒã移åããããã°ã¬ã¹ããŒã®å€èŠ³ãæŽæ°ããŸããããCERangeSliderã°ã«ãŒãã§ãCALayerã®ãµãã¯ã©ã¹ã§ããæ°ããCERangeSliderTrackLayerã¯ã©ã¹ãè¿œå ããŸããCERangeSliderTrackLayer.hãéãããã®å
容ã次ã®ãã®ã«çœ®ãæããŸãã #import <QuartzCore/QuartzCore.h> @class CERangeSlider; @interface CERangeSliderTrackLayer : CALayer @property (weak) CERangeSlider* slider; @end
ãã®ã³ãŒãã¯ãã¹ã©ã€ããŒã¬ã€ã€ãŒã«å¯ŸããŠè¡ã£ãããšã«åºã¥ããŠãã¹ã©ã€ããŒãžã®ãªã³ã¯ãè¿œå ããŸããCERangeSlider.mãéãã次ãè¿œå ããŸã#import
ã #import "CERangeSliderTrackLayer.h"
ããäžã®å€æ°ãèŠã€ãã_trackLayer
ãã®ã¿ã€ããäœæããã¯ã©ã¹ã«å€æŽããŸãã CERangeSliderTrackLayer* _trackLayer;
ã¡ãœããinitWithFrame:
ãèŠã€ããŠãã¬ã€ã€ãŒäœæã³ãŒããæŽæ°ããŸãã _trackLayer = [CERangeSliderTrackLayer layer]; _trackLayer.slider = self; [self.layer addSublayer:_trackLayer]; _upperKnobLayer = [CERangeSliderKnobLayer layer]; _upperKnobLayer.slider = self; [self.layer addSublayer:_upperKnobLayer]; _lowerKnobLayer = [CERangeSliderKnobLayer layer]; _lowerKnobLayer.slider = self; [self.layer addSublayer:_lowerKnobLayer];
ãã®ã³ãŒãã«ãããæ°ããã¹ããªããã䜿çšãããvyrviglaznyè²ãèæ¯ã«é©çšãããªããªãããšã確èªã§ããŸãã ïŒ]
ããå°ãããããšã¯æ®ã£ãŠããŸã-ã³ã³ããŒãã³ãããèµ€ãèæ¯ãåé€ããŸããCEViewController.mãéããã¡ãœããã§æ¬¡ã®ã³ãŒãè¡ãèŠã€ããŠviewDidLoad
æ¶å»ããŸãã _rangeSlider.backgroundColor = [UIColor redColor];
ã¢ããªã±ãŒã·ã§ã³ããã«ãããŠå®è¡ããŸã...äœãèŠããŸããïŒäœããªãïŒãããïŒ
ããªããå°ãã-ããã«ã€ããŠäœããããªã«çŽ æŽãããã§ããïŒããŒãã¯ãŒã¯ã®ææã¯ãã¹ãŠãªããªããŸããïŒå¿é
ããªãã§ãã ãã-䜿çšããã¬ã€ã€ãŒã«é©çšãããæããè²ãåé€ããã ãã§ããã³ã³ããŒãã³ãã¯ãŸã é
眮ãããŠããŸãããéæã«ãªããŸãããã»ãšãã©ã®éçºè
ã¯ãã³ã³ããŒãã³ããç¹å®ã®åã¢ããªã±ãŒã·ã§ã³ã®ã¹ã¿ã€ã«ã«ã«ã¹ã¿ãã€ãºã§ããããšã奜ããããã¹ã©ã€ããŒã®å€èŠ³ãæ
åœããããã€ãã®ããããã£ãè¿œå ããŸããCERangeSlider.hãéãã次ã®ã³ãŒããè¿œå ããŸãã @property (nonatomic) UIColor* trackColour; @property (nonatomic) UIColor* trackHighlightColour; @property (nonatomic) UIColor* knobColour; @property (nonatomic) float curvaceousness; - (float) positionForValue:(float)value;
ããŸããŸãªè²ã®ããããã£ã®ç®çã¯éåžžã«æçœã§ããã«é¢ããŠã¯curvaceousness
-å°ãåŸã§èª¿ã¹ãŠãã ããããããŠæåŸã«positionForValue:
ããã§ã«ãã®ã¡ãœãããå®è£
ããããšãã§ããŸããããããŸããŸãªã¬ã€ã€ãŒã§äœ¿çšã§ããããã«ãªããŸãããè²ã®ããããã£ã®åæå€ãè¿œå ããå¿
èŠããããŸããCERangeSlider.mãéãinitWithFrame:,
ãæ®ãã®å€æ°ã®åæåãæ
åœããã³ãŒããããã¯ã®äžã®ã¡ãœããã«æ¬¡ã®ã³ãŒããè¿œå ããŸãã _trackHighlightColour = [UIColor colorWithRed:0.0 green:0.45 blue:0.94 alpha:1.0]; _trackColour = [UIColor colorWithWhite:0.9 alpha:1.0]; _knobColour = [UIColor whiteColor]; _curvaceousness = 1.0; _maximumValue = 10.0; _minimumValue = 0.0;
CERangeSliderTrackLayer.mãéãã次ãè¿œå ããŸã#import
ã #import "CERangeSlider.h"
ãã®ã¬ã€ã€ãŒã«ã¯ãäž¡æ¹ã®ã¹ã©ã€ããŒãé
眮ãããŠããã¹ããªããã衚瀺ãããŸããçŸæç¹ã§ã¯ãCALayer
åè²ã®ã¿ã䜿çšã§ããããã«ããã¯ã©ã¹ãç¶æ¿ããŠããŸããã¹ããªãããæ£ããæç»ããã«ã¯ãã¡ãœãããå®è£
ãdrawInContext:
ãCoreGraphics APIã䜿çšããŠã¬ã³ããªã³ã°ããå¿
èŠããããŸãã泚ïŒCore Graphicsã®è©³çŽ°ã«ã€ããŠã¯ãã®ã¬ãã¹ã³ã®ç¯å²å€ã§ãããããCore Graphicsã®è©³çŽ°ã«ã€ããŠã¯ãCore Graphics 101ãã¥ãŒããªã¢ã«ã·ãªãŒãºã®ã³ãŒã¹ããå§ãããŸãã
次ã®ã¡ãœãããCERangeSliderTrackLayer.mã®äžã«è¿œå ããŸã@implementation
ã - (void)drawInContext:(CGContextRef)ctx {
ãã®ç»åã§ã¯ããã¹ãŠã®ã³ãŒããããã¯ãã³ã¡ã³ãã§åºåãããŠçµåãããŠããããšãããããŸããçªå·ä»ãã®ã»ã¯ã·ã§ã³ã¯çªå·ä»ãã®ã³ã¡ã³ãã«å¯Ÿå¿ããŠããŸãã- ã¹ããªããã®åœ¢ç¶ãæç»ãããåŸããã®èæ¯ãå¡ãã€ã¶ãããŸãã
- éžæããç¯å²ã匷調衚瀺ãããŸãã
- è¿œå ã®ç
§æãè¿œå ãããã¹ããªããã«ããªã¥ãŒã ãè¿œå ãããŸãã
- 圱ãæãããŸãã
- ã¹ããªããã®ããªã¥ãŒã ãšããžãæç»ãããŸãã
ãã¹ãŠã段éçã«å解ãããã®ã§ãCERangeSliderã®ããŸããŸãªããããã£ããã®å€èŠ³ã«ã©ã®ããã«åœ±é¿ãããã確èªã§ããŸããã¢ããªãèµ·åããŸãã
次ã®ããã«ãªããŸããå
¥åããããããã£ã®å€ãããããè©ŠããŠãã¹ã©ã€ããŒã®å€èŠ³ã«ã©ã®ããã«åœ±é¿ãããã確èªããŸãããŸã ããããã£ãäœãããŠããã®ãèå³ããããªãcurvaceousness
ãä»ããããè©Šãæã§ãïŒã¹ã©ã€ããŒãæç»ããã«ã¯ãåæ§ã®ã¢ãããŒãã䜿çšããŸããCERangeSliderKnobLayer.mãéãã次ãè¿œå ããŸã#import
ã #import "CERangeSlider.h"
次ã®ã¡ãœãããè¿œå ããŸãã - (void)drawInContext:(CGContextRef)ctx { CGRect knobFrame = CGRectInset(self.bounds, 2.0, 2.0); UIBezierPath *knobPath = [UIBezierPath bezierPathWithRoundedRect:knobFrame cornerRadius:knobFrame.size.height * self.slider.curvaceousness / 2.0];
ç¹°ãè¿ããŸããããã®ã¡ãœããã®çµæãåæããŸãã- ã¹ã©ã€ããŒã®åœ¢ç¶ã®æºåãã§ãããšããã«ãã¹ã©ã€ããŒã®èæ¯ãå¡ãã€ã¶ãããŸãã
- ããã«ãã¹ã©ã€ããŒã®å¢çç·ãæç»ãããŸãã
- 軜ãã°ã©ããŒã·ã§ã³ãè¿œå ãããŸãã
- ãããŠæåŸ-ã¹ã©ã€ããŒã匷調衚瀺ãããŠããå Žå-ã¹ã©ã€ããŒã移åãããŠããå Žåã¯ãã®ãŸãŸ-ç°è²ã«ãªããŸãã
ã¢ããªã±ãŒã·ã§ã³ãå床å®è¡ããŸããCoreGraphicsã䜿çšããŠã³ã³ããŒãã³ããã¬ã³ããªã³ã°ããããšã¯åªåãã䟡å€ãããããšãããããŸãããã®ãã¬ãŒã ã¯ãŒã¯ã䜿çšãããšãã°ã©ãã£ãã¯ãªãœãŒã¹ã䜿çšãããããã¯ããã«ã«ã¹ã¿ãã€ãºå¯èœã§æè»ãªã³ã³ãããŒã«ãäœæã§ããŸããã³ã³ããŒãã³ãããããã£ã®å€æŽã®åŠç
ããã§ãç§ãã¡ã¯äœãããªããã°ãªããŸãããïŒã³ã³ããŒãã³ãã¯ããªããã£ãããŒã«èŠããå€èŠ³ã¯å®å
šã«ã«ã¹ã¿ãã€ãºå¯èœã§ãTarget-Actionãã³ãã¬ãŒãããµããŒãããŠããŸããã¹ã©ã€ããŒã®ããããã£ã®1ã€ããç»é¢ã«æç»ãããåŸã«ã¢ããªã±ãŒã·ã§ã³ã³ãŒãã§å€æŽããããšã©ããªãããèããŠãã ãããããšãã°ãã¹ã©ã€ããŒã®å€ã®ç¯å²ãå€æŽããããã¹ã©ã€ããŒã®ãã€ã©ã€ããå€æŽãããã§ããŸããçŸæç¹ã§ã¯ããããã®æ©èœã®ãµããŒãã¯å®è£
ãããŠããŸããããããã³ãŒãã«è¿œå ããå¿
èŠããããŸããå€éšã§èšå®ãããŠããã³ã³ããŒãã³ãããããã£ãå€æããã«ã¯ãã»ãã¿ãŒã¡ãœãããèšè¿°ããå¿
èŠããããŸããæåã®æšæž¬ã¯æ¬¡ã®ã³ãŒãã§ããå¯èœæ§ãé«ãã§ãã - (void)setTrackColour:(UIColor *)trackColour { if (_trackColour != trackColour) { _trackColour = trackColour; [_trackLayer setNeedsDisplay]; } }
ããããã£ãå€æŽããããštrackColor
ããã®ã³ãŒããããã¯ã¯ãã¹ã©ã€ããŒããŒã¬ã€ã€ãŒã«æŽæ°ãå¿
èŠã§ããããšãéç¥ããŸããããããã¹ã©ã€ããŒAPIã8ã€ã®å€æ°ã䜿çšãããšããäºå®ãèãããšãåãã³ãŒããäœåºŠãæžãæããããšã¯æè¯ã®è§£æ±ºçã§ã¯ãããŸããããã¯ãã䜿çšããæ©äŒã®ããã§ãïŒCERangeSlider.mãéããinitWithFrameã¡ãœããã®äžã«æ¬¡ã®ã³ãŒããè¿œå ããŸãã #define GENERATE_SETTER(PROPERTY, TYPE, SETTER, UPDATER) \ - (void)SETTER:(TYPE)PROPERTY { \ if (_##PROPERTY != PROPERTY) { \ _##PROPERTY = PROPERTY; \ [self UPDATER]; \ } \ }
ãã®ã³ãŒããããã¯ã¯ã4ã€ã®ãã©ã¡ãŒã¿ãŒãåãåãããããã䜿çšããŠåæããããã£ãšãã®ã»ãã¿ãŒã¡ãœãããçæãããã¯ããå®çŸ©ããŸãããã®ã³ãŒãã®äžã«ãå¥ã®ãããã¯ãè¿œå ããŸãã GENERATE_SETTER(trackHighlightColour, UIColor*, setTrackHighlightColour, redrawLayers) GENERATE_SETTER(trackColour, UIColor*, setTrackColour, redrawLayers) GENERATE_SETTER(curvaceousness, float, setCurvaceousness, redrawLayers) GENERATE_SETTER(knobColour, UIColor*, setKnobColour, redrawLayers) GENERATE_SETTER(maximumValue, float, setMaximumValue, setLayerFrames) GENERATE_SETTER(minimumValue, float, setMinimumValue, setLayerFrames) GENERATE_SETTER(lowerValue, float, setLowerValue, setLayerFrames) GENERATE_SETTER(upperValue, float, setUpperValue, setLayerFrames) - (void) redrawLayers { [_upperKnobLayer setNeedsDisplay]; [_lowerKnobLayer setNeedsDisplay]; [_trackLayer setNeedsDisplay]; }
äžåºŠã«ãã¹ãŠã®å€æ°ã®ã»ãã¿ãŒã¡ãœãããçæããŸãããã®ã¡ãœããredrawLayers
ã¯ãã³ã³ããŒãã³ãã®å€èŠ³ã«é¢é£ä»ããããå€æ°ãããã³setLayerFrames
ããŒã¯ã¢ãããæ
åœããå€æ°ã«å¯ŸããŠåŒã³åºãããŸããã¹ã©ã€ããŒããã®ããããã£ã®å€æŽã«é©åã«å¿çããããã«å¿
èŠãªã®ã¯ããã ãã§ãããšã«ãããæ°ãããã¯ãããã¹ããããã¹ãŠãæ£åžžã«æ©èœããããšã確èªããããã«ãããã«ã³ãŒããè¿œå ããå¿
èŠããããŸããCEViewController.mãéããã¡ãœããã®æåŸã«æ¬¡ã®ã³ãŒããè¿œå ããŸãviewDidLoad
ã [self performSelector:@selector(updateState) withObject:nil afterDelay:1.0f];
ãã®è¡ã¯updateState
ã2çªç®ã®é
延åŸã«ã¡ãœãããåŒã³åºããŸãããã®ã¡ãœãããCEViewController.mã«è¿œå ããŸãã - (void)updateState { _rangeSlider.trackHighlightColour = [UIColor redColor]; _rangeSlider.curvaceousness = 0.0; }
ãã®ã¡ãœããã¯ãã¹ããªããã®è²ãéããèµ€ã«ãã¹ã©ã€ããŒã®åœ¢ç¶ãæ£æ¹åœ¢ã«å€æŽããŸãããããžã§ã¯ããå®è¡ããã¹ã©ã€ããŒã®åœ¢ç¶ãããããïŒæ³šïŒè¿œå ããã³ãŒãã¯ãã«ã¹ã¿ã ã³ã³ããŒãã³ãã®éçºã«ãããæãèå³æ·±ãïŒãããŠãã¡ãªã¿ã«ãéçºè
ã«ãã£ãŠå¿ããããã¡ãªïŒåŽé¢ã®1ã€ã§ãããã¹ããæ確ã«ç€ºããŠããŸãã
ã³ã³ãããŒã«ãéçºãããšãã¯ããã®ããããã£ã®ãã¹ãŠã®å¯èœãªå€ãšãã³ã³ããŒãã³ãã®å€èŠ³ã«å¯Ÿãããããã®åœ±é¿-ããªãã®è²¬ä»»ã確èªããŠãã ãããè¯ãæ¹æ³ã¯ãããã€ãã®ãã¿ã³ãšã¹ã©ã€ããŒãè¿œå ããããšã§ããåãã¿ã³ãšã¹ã©ã€ããŒã¯ãã³ã³ããŒãã³ãã®ããã€ãã®ããããã£ãæ
åœããŸãããã®æ¹æ³ã«ãããã³ãŒããå€æŽããããšã§æ°ãæ£ããããšãªãã³ã³ãããŒã«ããã¹ãã§ããŸãã
次ã¯ïŒ
ããã§ã¹ã©ã€ããŒã¯å®å
šã«æ©èœããããããã¢ããªã±ãŒã·ã§ã³ã§äœ¿çšã§ããããã«ãªããŸããïŒã«ã¹ã¿ã ã³ã³ããŒãã³ãã®äž»ãªå©ç¹ã®1ã€ã¯ãããŸããŸãªéçºè
ãããŸããŸãªã¢ããªã±ãŒã·ã§ã³ã§äœ¿çšã§ããããšã§ããããŠãã¹ã©ã€ããŒã®åæŒã®æºåã¯ã§ããŠããŸããïŒããã§ããªãã
ããã«ããã€ãã®ã¿ã¹ã¯ãå®äºããå¿
èŠããããŸãïŒããã¥ã¡ã³ãããã¹ãŠã®ããã°ã©ããŒã®ãæ°ã«å
¥ãã®åš¯æ¥œã ïŒ]ã³ãŒãã¯å®ç§ã§ãè¿œå ã®ããã¥ã¡ã³ãã¯å¿
èŠãªããšæããŸãããä»ã®éçºè
ã®æèŠã¯åçã«ç°ãªãå ŽåããããŸãããã¹ãŠã®ããã¥ã¡ã³ããä»ã®ã³ãŒãéçºè
ã«å
¬éããããšããå§ãããŸããå°ãªããšããããã¯å
¬éãããŠãããã¹ãŠã®ã¯ã©ã¹ãšãã®ããããã£ã®èª¬æã§ããããšãã°ãããªãã®CERangeSliderã¯ã以äžã®æžé¡ãå¿
èŠã§ã-ç®çå€æ°ã®èª¬æãmax
ãmin
ãupper
ãlower
ãä¿¡é Œæ§upperValue
ãã倧ããå€ãèšå®ãããšã©ããªããŸããmaximumValue
ïŒãã¡ãããããªãèªèº«ããããè¡ãããšã¯æ±ºããŠãããŸãã-ããã¯å°ãªããšãæãã§ããããããä»ã®èª°ããè©Šã¿ãããšãä¿èšŒããããšã¯ã§ããŸããïŒéçºè
ã®æããã®ã¬ãã«ã«é¢ä¿ãªããã³ã³ããŒãã³ããåžžã«é©åã«æ©èœããããšã確èªããå¿
èŠããããŸããAPIæ§é ãä¿¡é Œæ§ã«é¢ãã以åã®ãã€ã³ãã¯ãAPIã®æ§é ãšããããåºç¯ãªãããã¯ã«å¯æ¥ã«é¢é£ããŠããŸããæè»ã§çŽæçã§ä¿¡é Œæ§ã®é«ãæ§é ãäœæããããšã§ãã³ã³ããŒãã³ããåºã䜿çšãããæ®åããã®ã«åœ¹ç«ã¡ãŸããç§ã®äŒç€Ÿã§ããShinobiControlsã§ã¯ãAPIã®çŽ°éšã«ã€ããŠè°è«ããã®ã«äœæéãè²»ããããšãã§ããŸãïŒ APIã®æ§é ã¯éåžžã«æ·±ããããã¯ã§ããããã®ã¬ãã¹ã³ã®ç¯å²ãè¶
ããŠããŸãããã®ãããã¯ã«èå³ãããå Žåã¯ãMatt Gemmellã®25ã®APIèšèšã«ãŒã«ãèªãããšããå§ãããŸããã³ã³ããŒãã³ãã®é
åžãéå§ã§ããå Žæã¯ãããããããŸãã以äžã«ããã€ãã®ãªãã·ã§ã³ã瀺ããŸãã- GitHubã®ãGitHubã¯ãæã人æ°ã®ãããªãŒãã³ãœãŒã¹ã³ã³ããŒãã³ããã¹ãã£ã³ã°ãµã€ãã®1ã€ã«ãªããŸãããGitHubã«ã¯ãç¡æ°ã®ç°ãªãiOSã³ã³ãããŒã«ããããŸããGitHubã®ç¹ã«åªããŠããç¹ã¯ãã³ã³ããŒãã³ãã³ãŒãããã°ãã䟿å©ã«è¡šç€ºããä»ã®ãããžã§ã¯ãã§äœ¿çšããŠãããŸããŸãªã³ã¡ã³ããæ®ãããšãã§ããããšã§ãã
- CocoaPodsããŠãŒã¶ãŒãèªåã®ã³ã³ããŒãã³ãããããžã§ã¯ãã«ç°¡åã«è¿œå ã§ããããã«ããããã«ãiOSããã³OSXã®æ¡åŒµãããŒãžã£ãŒã§ããCocoaPodsã«ã³ã³ããŒãã³ããè¿œå ã§ããŸãã
- Cocoa Controls . , . GitHub, .
- Binpress . , . , â ? , , - API.
ã«ã¹ã¿ã ã³ã³ãããŒã«ã®éçºã«èå³ããããããããç¬èªã®ã³ã³ããŒãã³ããäœæãããšããã¢ã€ãã¢ã«è§Šçºãããããšãé¡ã£ãŠããŸãããããžã§ã¯ãã®ãœãŒã¹ã³ãŒãã¯ãéçºã®æ®µéã«å¯Ÿå¿ããã³ãããã®å±¥æŽãšãšãã«GitHubã§å
¬éãããŸããè¿·åã«ãªã£ãå Žåã§ããæåŸã«å®äºãã段éããç°¡åã«äœæ¥ãç¶ããããšãã§ããŸãïŒ ïŒ]
ãã®ãªã³ã¯ãããããžã§ã¯ãå
šäœãããŠã³ããŒãã§ããŸãã