Пользовательский UISlider - увеличение размера "горячей точки"
У меня есть пользовательский UISlider, который относительно жестко для людей с большим пальцем, чтобы захватить и скользить из-за размера "большого пальца". Есть ли способ увеличить размер области с возможностью клики или перетаскивания без изменения размера изображения?
Вот код для создания пользовательского слайдера, если это помогает:
[slider setMaximumTrackImage:[[UIImage imageNamed:@"max.png"]
resizableImageWithCapInsets:UIEdgeInsetsMake(0, 20, 0, 20)]
forState:UIControlStateNormal];
[slider setMinimumTrackImage:[[UIImage imageNamed:@"min.png"]
resizableImageWithCapInsets:UIEdgeInsetsMake(0, 20, 0, 20)]
forState:UIControlStateNormal];
[slider setThumbImage:[UIImage imageNamed:@"thumb.png"]
forState:UIControlStateNormal];
Ответы
Ответ 1
В итоге я подклассифицировал UISlider и переопределив этот метод:
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent*)event {
CGRect bounds = self.bounds;
bounds = CGRectInset(bounds, -10, -15);
return CGRectContainsPoint(bounds, point);
}
Это расширяет осязаемую область на 10 пикселей слева и справа и 15 пикселей сверху и снизу.
Ответ 2
Это решение работает с iOS 8:
class ExtUISlider: UISlider {
var thumbTouchSize : CGSize = CGSizeMake(50, 50)
override func pointInside(point: CGPoint, withEvent event: UIEvent?) -> Bool {
let bounds = CGRectInset(self.bounds, -thumbTouchSize.width, -thumbTouchSize.height);
return CGRectContainsPoint(bounds, point);
}
override func beginTrackingWithTouch(touch: UITouch, withEvent event: UIEvent) -> Bool {
let thumbPercent = (value - minimumValue) / (maximumValue - minimumValue)
let thumbSize = thumbImageForState(UIControlState.Normal)!.size.height
let thumbPos = CGFloat(thumbSize) + (CGFloat(thumbPercent) * (CGFloat(bounds.size.width) - (2 * CGFloat(thumbSize))))
let touchPoint = touch.locationInView(self)
return (touchPoint.x >= (thumbPos - thumbTouchSize.width) &&
touchPoint.x <= (thumbPos + thumbTouchSize.width))
}
}
Кредиты идут на этот пост: http://www.mpatric.com/2009-04-15-more-responsive-sliders-on-the-iphone
Ответ 3
Swift 3
Подкласс UISlider
с повышенной сенсорной областью
class CustomSlider: UISlider {
private var thumbTouchSize = CGSize(width: 40, height: 40)
override func point(inside point: CGPoint, with event: UIEvent?) -> Bool {
let increasedBounds = bounds.insetBy(dx: -thumbTouchSize.width, dy: -thumbTouchSize.height)
let containsPoint = increasedBounds.contains(point)
return containsPoint
}
override func beginTracking(_ touch: UITouch, with event: UIEvent?) -> Bool {
let percentage = CGFloat((value - minimumValue) / (maximumValue - minimumValue))
let thumbSizeHeight = thumbRect(forBounds: bounds, trackRect:trackRect(forBounds: bounds), value:0).size.height
let thumbPosition = thumbSizeHeight + (percentage * (bounds.size.width - (2 * thumbSizeHeight)))
let touchLocation = touch.location(in: self)
return touchLocation.x <= (thumbPosition + thumbTouchSize.width) && touchLocation.x >= (thumbPosition - thumbTouchSize.width)
}
}
Ответ 4
перейдите по этой ссылке
http://erfan-ali-31.blogspot.in/2011/10/more-sensitive-or-responsive-custom.html
его работа, протестированная в устройстве также
Ответ 5
Я закончил использовать это, и он работает очень хорошо для меня.
Отправленный этот ответ, чтобы он мог быть кому-то полезен.
import UIKit
class CustomSlider: UISlider {
/*
// Only override draw() if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
override func draw(_ rect: CGRect) {
// Drawing code
}
*/
// Increase slider height
override func trackRect(forBounds bounds: CGRect) -> CGRect {
let customBounds: CGRect = CGRect(origin: bounds.origin, size: CGSize(width: bounds.size.width, height: 5.0))
return customBounds
}
override func thumbRect(forBounds bounds: CGRect, trackRect rect: CGRect, value: Float) -> CGRect {
return super.thumbRect(
forBounds: bounds, trackRect: rect, value: value)
}
// Increase Thumb hot spot clickable area
override func point(inside point: CGPoint, with event: UIEvent?) -> Bool {
var bounds: CGRect = self.bounds
bounds = bounds.insetBy(dx: -10, dy: -10);
return bounds.contains(point);
}
override func awakeFromNib() {
// Configure Volume slider
let thumbImageNormal = UIImage.init(named:"thumb")
self.setThumbImage(thumbImageNormal, for: .normal)
super.awakeFromNib()
}
}
Ответ 6
Также вы можете просто увеличить размер изображения, что приведет к увеличению размера большого слайдера.
-
Если вам нужно оставить размер изображения не слишком большим, но отрегулируйте размер слайдера, просто добавьте прозрачное пространство вокруг содержимого изображения.
![введите описание изображения здесь]()
-
Если вы используете слайдер в UITableViewCell, проблема также в том, что дескриптор дескриптора tableview перед слайдером. Чтобы изменить это, используйте следующее решение:
fooobar.com/questions/262025/...
Я думаю, что не сложно перевести его код в Objective C.
Ответ 7
Измените размер рамки и измените выравнивание изображения на желаемую. Вы можете выполнить выравнивание по центру, слева, справа, сверху или снизу. Сделайте это так:
CGRect newFrame = sliderHandle.frame;
CGRectSetWidth(newFrame, 80);
CGRectSetHeight(newFrame, 80);
[sliderHandle setFrame:newFrame];
[sliderHandle setContentMode:UIViewContentModeCenter];
Таким образом, ваша трогательная рамка будет больше, а масштаб изображения останется неизменным.