iphone - objective - uiscrollview zoom example



UIScrollView-스크롤 막대 표시 (6)

ScrollBar는 iOS와 같은 기능을하지만 색상과 너비를 혼란스럽게 할 수 있습니다.

-(void)persistantScrollBar
{
    [persistantScrollBar removeFromSuperview];
    [self.collectionView setNeedsLayout];
    [self.collectionView layoutIfNeeded];

    if (self.collectionView.contentSize.height > self.collectionView.frame.size.height + 10)
    {
        persistantScrollBar = [[UIView alloc] initWithFrame:(CGRectMake(self.view.frame.size.width - 10, self.collectionView.frame.origin.y, 5, (self.collectionView.frame.size.height /self.collectionView.contentSize.height) * self.collectionView.frame.size.height))];
        persistantScrollBar.backgroundColor = [UIColor colorWithRed:207/255.f green:207/255.f blue:207/255.f alpha:0.5f];
        persistantScrollBar.layer.cornerRadius = persistantScrollBar.frame.size.width/2;
        persistantScrollBar.layer.zPosition = 0;
        [self.view addSubview:persistantScrollBar];
    }
}

-(void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    CGRect rect = persistantScrollBar.frame;
    rect.origin.y =  scrollView.frame.origin.y + (scrollView.contentOffset.y *(self.collectionView.frame.size.height/self.collectionView.contentSize.height));
    rect.size.height = (self.collectionView.frame.size.height /self.collectionView.contentSize.height) * self.collectionView.frame.size.height;
    if ( scrollView.contentOffset.y <= 0 )
    {
        rect.origin.y = scrollView.frame.origin.y;
        rect.size.height = rect.size.height + (scrollView.contentOffset.y);
    }
    else if (scrollView.contentOffset.y + scrollView.frame.size.height >= scrollView.contentSize.height)
    {
        rect.size.height = rect.size.height - ((scrollView.contentOffset.y + scrollView.frame.size.height) - scrollView.contentSize.height);
        rect.origin.y =  (self.collectionView.frame.origin.y + self.collectionView.frame.size.height - 5) - rect.size.height;
    }

    persistantScrollBar.frame = rect;
}

아마도 단순한 것일 수도 있습니다!

누구든지 UIScrollView의 스크롤 막대를 지속적으로 표시하는 방법을 알고 있습니까?

사용자가 스크롤 할 때 표시되므로 스크롤보기의 위치를 ​​볼 수 있습니다.

스크롤이 가능하다는 것이 사용자에게 즉각적으로 알려지지 않았기 때문에 지속적으로 보여주고 싶습니다.

모든 조언을 높이 평가 될 것입니다.


Answer #1

iOS는 API를 제공하지 않습니다. 그러나 실제로 이것을 원하면 데모와 마찬가지로 사용자 정의 표시기를 추가하여 스크롤보기와 레이아웃을 직접 만들 수 있습니다.

- (void)layoutSubviews
{
    [super layoutSubviews];

    if (self.showsVerticalScrollIndicatorAlways) {
        scroll_indicator_position(self, k_scroll_indicator_vertical);
    }

    if (self.showsHorizontalScrollIndicatorAlways) {
        scroll_indicator_position(self, k_scroll_indicator_horizontal);
    }
}

링크는 https://github.com/flexih/MazeScrollView


Answer #2

내가 아는 한, 이것은 불가능합니다. 스크롤 표시기를 표시하는 것을 제어하는 ​​유일한 API 호출은 showsVerticalScrollIndicator 이고 표시기 만 표시하는 것을 비활성화 할 수 있습니다.

뷰가 표시 될 때 flashScrollIndicators 를 사용하여 사용자가 스크롤 뷰에서 어디에 있는지 알 수 있습니다.


Answer #3

아니요, 항상 보여줄 수는 없지만 일시적으로 깜박일 수는 있습니다.

[myScrollView flashScrollIndicators];

그것들은 스크롤 막대가 아니라 스크롤 표시기입니다. 스크롤하는 데 사용할 수 없습니다.


Answer #4

첫 번째 하위 뷰가 스크롤 뷰인 경우 최신 SDK에서 HTML 페이지가 프레임보다 긴 경우 스크롤 막대가 표시되지 않으며 HTML 콘텐츠가 프레임과 정렬되거나 공백이있는 경우 프레임 아래쪽에는 스크롤이 필요없고 선 아래에 아무것도없는 것처럼 보입니다. 이 경우, 당신은 반드시 델리게이트의 스크롤 막대를 플래쉬해야한다고 생각합니다.

- (void)webViewDidFinishLoad:(UIWebView *)webView; 

메서드를 사용하여 '상자 외부'에 더 많은 내용이 있음을 사용자에게 알립니다.

NSArray *subViews = [[NSArray alloc] initWithArray:[webView subviews]] ;
UIScrollView *webScroller = (UIScrollView *)[subViews objectAtIndex:0] ;    

HTML의 경우 수평 내용이 자동으로 감싸기 때문에 웹 서버 높이를 확인하십시오.

        if (webScroller.contentSize.height > webView.frame.size.height) {
            [webScroller flashScrollIndicators];
        }

플래시가 너무 짧아서보기가로드되는 동안 간과 될 수 있습니다. 이 문제를 해결하기 위해 일반 UIView commitAnimations를 통해 콘텐츠를 약간 흔들 리거나 바운스하거나 스크롤하거나 크기를 조정할 수 있습니다.


Answer #5

항상 스크롤 표시기에 대한 내 솔루션

#define noDisableVerticalScrollTag 836913
#define noDisableHorizontalScrollTag 836914

@implementation UIImageView (ForScrollView)

- (void) setAlpha:(float)alpha {

if (self.superview.tag == noDisableVerticalScrollTag) {
    if (alpha == 0 && self.autoresizingMask == UIViewAutoresizingFlexibleLeftMargin) {
        if (self.frame.size.width < 10 && self.frame.size.height > self.frame.size.width) {
            UIScrollView *sc = (UIScrollView*)self.superview;
            if (sc.frame.size.height < sc.contentSize.height) {
                return;
            }
        }
    }
}

if (self.superview.tag == noDisableHorizontalScrollTag) {
    if (alpha == 0 && self.autoresizingMask == UIViewAutoresizingFlexibleTopMargin) {
        if (self.frame.size.height < 10 && self.frame.size.height < self.frame.size.width) {
            UIScrollView *sc = (UIScrollView*)self.superview;
            if (sc.frame.size.width < sc.contentSize.width) {
                return;
            }
        }
    }
}

[super setAlpha:alpha];
}
@end

업데이트 :이 솔루션은 64 비트에서 몇 가지 문제를 일으 킵니다. 자세한 내용은 here





scrollbar