QuickDialogは簡単に設定画面を作成することができます。ですが、用意されている要素以外使いたい場合があります。
今回は、範囲を設定できるNMRangeSliderをQuickDialogに組み込みます。
近いコントロールであるQFloatElementを参考にして、QLabelElementを継承してQRangeElementを定義します。
QRangeElement.h
#import <Foundation/Foundation.h>
@class NMRangeSlider;
@interface QRangeElement : QLabelElement
@property(nonatomic, readonly) NMRangeSlider *slider;
- (QRangeElement *)initWithTitle:(NSString *)title lowerValue:(float)lowerValue upperValue:(float)upperValue min:(float)min max:(float)max;
@end
QRangeElement.m
#import "QRangeElement.h"
#import "NMRangeSlider.h"
@interface QRangeElement()
@property (nonatomic) float sliderLowerValue;
@property (nonatomic) float sliderUpperValue;
@property (nonatomic) float sliderMinimumValue;
@property (nonatomic) float sliderMaximumValue;
@end
@implementation QRangeElement {
}
- (QRangeElement *)initWithTitle:(NSString *)title lowerValue:(float)lowerValue upperValue:(float)upperValue min:(float)min max:(float)max {
self = [super initWithTitle:title Value:nil] ;
if (self) {
self.enabled = YES;
self.sliderUpperValue = upperValue;
self.sliderLowerValue = lowerValue;
self.sliderMinimumValue = min;
self.sliderMaximumValue = max;
}
return self;
}
- (CGFloat)calculateSliderWidth:(QuickDialogTableView *)view cell:(UITableViewCell *)cell {
CGFloat width = view.contentSize.width;
if (_title==nil){
width -= 95;
}else{
width -= [cell.textLabel.text sizeWithFont:[UIFont boldSystemFontOfSize:17]].width + 105;
}
return width;
}
- (void)valueChanged:(UISlider *)slider {
if (self.onValueChanged!=nil)
self.onValueChanged(self);
}
- (UITableViewCell *)getCellForTableView:(QuickDialogTableView *)tableView controller:(QuickDialogController *)controller {
UITableViewCell *cell = [super getCellForTableView:tableView controller:controller];
_slider = [[NMRangeSlider alloc] initWithFrame:CGRectMake(0, 0, [self calculateSliderWidth:tableView cell:cell], 20)];
self.slider.minimumValue = self.sliderMinimumValue;
self.slider.maximumValue = self.sliderMaximumValue;
self.slider.lowerValue = self.sliderLowerValue;
self.slider.upperValue = self.sliderUpperValue;
[self.slider addTarget:self action:@selector(valueChanged:) forControlEvents:UIControlEventValueChanged];
cell.accessoryView = self.slider;
return cell;
}
@end
getCellForTableViewでUIを組み込んだCellを返せば、QuickDialogに組み込むことができます。