2014-12-24 1 views
3

저는 PageViewController에 여러 컨트롤러가 있으며 컨트롤러 하나에 몇 개의 슬라이더가 있습니다. 이제는 사용자가 정확히 슬라이더 원을 만져야한다는 문제가 있습니다. (올바른 표현, 엄지에 대해 확실하지 않습니다 - 움직이는 부분) 슬라이더에 반응하고 전체 PageViewController가 아닌 영역을 늘리고 싶습니다. 나는이 솔루션을 시도했지만 도움이되지 않습니다컨트롤러 내부에 UISlider가있는 UIPageViewController - 슬라이더의 히트 영역을 늘립니다.

  • thumbRectForBounds :

    - (CGRect)thumbRectForBounds:(CGRect)bounds trackRect:(CGRect)rect value:(float)value 
    { 
        return CGRectInset ([super thumbRectForBounds:bounds trackRect:rect value:value], 15, 15); 
    } 
    
  • 증가 그러나 hitTest 지역 :

    - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { 
        if (CGRectContainsPoint(CGRectInset(self.frame, 200, 200), point) || CGRectContainsPoint(CGRectInset(self.frame, 200, 200), point)) { 
         return self; 
        } 
        return [super hitTest:point withEvent:event]; 
    } 
    

내 사용자 정의 슬라이더에서 이러한 방법이 왜냐하면 저는 이것을 재사용하고 싶습니다. 마지막으로 발견 한 것과 아직 시도하지 않은 것은 제스처를 사용하고 PageViewController를 사용하지 않도록하는 슬라이더 위에 객체 레이어를 만드는 것입니다.하지만 어떻게해야할지 모르겠습니다. 좋은/최선의 해결책인지 확실하지 않습니다. 당신의 CustomSlider 클래스 재정의 thumbRectForBounds 방법에서

답변

2

나는 당신이 눈치 챘을 때 실제 슬라이더의 히트 영역을 늘리는 것이 쉽지 않기 때문에 UISlider 구성 요소의 큰 팬이 아닙니다. 더 나은 사용자 경험을 위해 팬 제스처를 사용하여 UISlider를 복제하는 것이 좋습니다 :

i. 슬라이더 이미지가있는 별도의 UIImageView를 사용하여 슬라이더 배경을 만듭니다. ii. 팬 제스처를 만듭니다.

UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePan:); 
[imageView addGestureRecognizer:pan]; 

iii. handlePan 방법을 구현 :

- (IBAction)handlePan:(UIPanGestureRecognizer *)recognizer { 

    //pan (slide) begins 
    CGPoint translation = [recognizer locationInView:self.view]; 
    translation.y = self.slideImage.center.y; 
    self.slideImage.center = translation; 

    if(recognizer.state == UIGestureRecognizerStateEnded) { 
     LTDebugLog(@"\n\n PAN, with spot: %f\n\n", self.slideImage.center.x); 
     //do something after user is done sliding 
    } 
} 

이 방법의 가장 큰 장점은 당신이 원하는대로 응답 UIImageView에이 같은 큰 만들 수 있습니다 당신이 훨씬 더 나은 사용자 경험을 것입니다.

또는 UISlider를 서브 클래스 화하고 히트 공간을 늘릴 수는 있지만, 필자의 경험에 따르면 혼합 된 결과가 나타납니다. 시스템의 사본을

[theSlider setThumbImage:[UIImage imageNamed:@"slider_thumb_with_margins"] forState:UIControlStateNormal]; 

이미지를 만들려면 수 :

희망이

1

: 당신은 필요에 따라

단순히 RECT 값을 반환 :

- (CGRect)thumbRectForBounds:(CGRect)bounds trackRect:(CGRect)rect value:(float)value 
{ 
    return CGRectMake (bounds.origin.x, bounds.origin.y, yourWidthValue, yourHeightValue); 
} 

변경 yourWidthValue 귀하의 요구 사항에 따라 yourHeightValue을. 그리고

는 아래와 같이 객체를 생성 사용하는 동안이 도움이

CustomSlider *slider = [[CustomSlider alloc] initWithFrame:CGRectMake(0, 0, 300, 20)]; 
[slider thumbRectForBounds: slider.bounds trackRect:slider.frame value:15.f]; // change values as per your requirements. 

희망.

+0

이것은 내가 처음 시도한 것입니다. CGRectInset이 더 잘 작동하기 때문에 방금 CGRectInset을 사용했습니다. 그러나 예제 값을 15보다 크게 설정하면 엄지 손가락이 누락됩니다. 그리고이 방법은 오버라이드 (override)되므로, 제어의 초기화 후에 도움이되지 않는다고 부르는 것이 좋습니다. 아무 것도 설정하지 않고 반환하는 CGRect를 사용하지 마십시오. –

1

큰 빈 여백이있는 사용자 정의 엄지 손가락 이미지를 만들고 다음과 같이 귀하의 슬라이더에이 부분을 설정하는 데 도움이 엄지 손가락 이미지는 UIKit 삽화 추출기 중 하나를 사용하여 검색합니다 (웹 검색 만 가능). Photoshop에서 축소판 이미지를 열고 캔버스 크기를 추가 할 여백의 두 배로 늘립니다.이미지 크기가 새 크기를 채우기 위해 이미지를 늘어 뜨리므로 이미지 크기가 아닌 캔버스 크기를 변경하십시오. 이렇게하면 히트 테스트 영역에 포함될 엄지 주위에 빈 공간이 생기지 만 모든 영역이 투명하므로 슬라이더 모양이 변경되지 않습니다.

관련 문제