カスタム UISlider を作成しようとしていますが、サム イメージの非表示の「クリック領域」を増やしたいですか? 以下のコードは、親指の「クリック領域」が変更されていないことを除いて、うまく機能します。私が間違っていなければ、標準の親指領域は 20 ピクセル程度の大きさだと思いますか?
私の状況は次のとおりです。スライダーはうまく機能し、見栄えは良いですが、「非表示のクリック領域」を親指に使用している画像と同じくらい大きくする必要があります。以下のコードを使用して 35px に拡大したいとします。どのような手順を実行する必要がありますか?
- (void)create_Custom_UISlider
{
CGRect frame = CGRectMake(20.0, 320.0, 280, 0.0);
customSlider = [[UISlider alloc] initWithFrame:frame];
[customSlider addTarget:self action:@selector(sliderAction:) forControlEvents:UIControlEventValueChanged];
// in case the parent view draws with a custom color or gradient, use a transparent color
customSlider.backgroundColor = [UIColor clearColor];
UIImage *stetchLeftTrack = [[UIImage imageNamed:@"blueslider.png"]
stretchableImageWithLeftCapWidth: 10.0 topCapHeight:0.0];
UIImage *stetchRightTrack = [[UIImage imageNamed:@"blueslider.png"]
stretchableImageWithLeftCapWidth: 260.0 topCapHeight:0.0];
// UIImage *thumbImg = [[UIImage imageNamed:@"slider_button00.png"]
// stretchableImageWithLeftCapWidth: 100.0 topCapHeight:100.0];
[customSlider setThumbImage: [UIImage imageNamed:@"slider_button.png"] forState:UIControlStateNormal];
[customSlider setMinimumTrackImage:stetchLeftTrack forState:UIControlStateNormal];
[customSlider setMaximumTrackImage:stetchRightTrack forState:UIControlStateNormal];
// [customSlider thumbRectForBounds: thumb tackRect: frame value: customSlider.value];
customSlider.minimumValue = 0.0;
customSlider.maximumValue = 1.0;
customSlider.continuous = NO;
customSlider.value = 0.00;
}
このコードの問題は、UISlider をサブクラス化していないことです。次に、コードを次のように変更しました(サブクラス化しました)が、適切に機能させるために必要なコードのタイプがわかりません。
次のように表示されます: http://tinypic.com/view.php?pic=347dufa&s=5。最初の画像は、サブクラス化されていない場合のケース番号 1 を表し、「非表示のクリック領域」が意図したとおりに機能しないのに対し、画像番号 2 は、サブクラス化されている場合のケース番号 2 (以下のコード) を表します。私は今疑問に思っています A)、私はこのように正しい方向にコーディングしていますか? B) このメソッドに一体何を入れようか
私の方法では:
- (CGRect)thumbRectForBounds:(CGRect)bounds trackRect:(CGRect)rect value:(float)value { CGRectInset ([super thumbRectForBounds:bounds trackRect:rect value:value], -10 , -10); }
親指を正しい場所に置き、より大きな(隠れたクリック領域)で再びスライドさせるため。
main.h
#import "MyUISlider.h"
@interface main : MLUIViewController <UITableViewDelegate, UITableViewDataSource, UISearchBarDelegate, UIActionSheetDelegate, UIAlertViewDelegate, MFMailComposeViewControllerDelegate, UIGestureRecognizerDelegate, MLSearchTaskDelegate, MLDeactivateDelegate, MLReceiptDelegate>
{
..........
}
- (void)create_Custom_UISlider;
main.m
- (void)viewDidLoad
{
[self create_Custom_UISlider];
[self.view addSubview: customSlider];
}
- (void)create_Custom_UISlider
{
CGRect frame = CGRectMake(20.0, 320.0, 280, 0.0);
customSlider = [[MyUISlider alloc] initWithFrame:frame];
[customSlider addTarget:self action:@selector(sliderAction:) forControlEvents:UIControlEventValueChanged];
// in case the parent view draws with a custom color or gradient, use a transparent color
customSlider.backgroundColor = [UIColor clearColor];
UIImage *stetchLeftTrack = [[UIImage imageNamed:@"blue_slider08.png"]
stretchableImageWithLeftCapWidth: 10.0 topCapHeight:0.0];
UIImage *stetchRightTrack = [[UIImage imageNamed:@"blue_slider08.png"]
stretchableImageWithLeftCapWidth: 260.0 topCapHeight:0.0];
[customSlider setThumbImage: [UIImage imageNamed:@"slider_button00"] forState:UIControlStateNormal];
[customSlider setMinimumTrackImage:stetchLeftTrack forState:UIControlStateNormal];
[customSlider setMaximumTrackImage:stetchRightTrack forState:UIControlStateNormal];
customSlider.minimumValue = 0.0;
customSlider.maximumValue = 1.0;
customSlider.continuous = NO;
customSlider.value = 0.00;
}
EDIT(以下のコードでサブクラス化しようとしています)
MyUISlider.h
#import <UIKit/UIKit.h>
@interface MyUISlider : UISlider {
}
@end
MyUISlider.m
#import "MyUISlider.h"
@implementation MyUISlider
- (CGRect)thumbRectForBounds:(CGRect)bounds trackRect:(CGRect)rect value:(float)value
{
CGRectInset ([super thumbRectForBounds:bounds trackRect:rect value:value], -10 , -10);
}
@end