06iOS 사진 윤 방 컨트롤 - version 0.1

5259 단어
왜 다시 그림 순환 방송 컨트롤 을 써 야 합 니까?
물론 그림 순환 방송 컨트롤 이라는 것 은 정말 엉망 이 되 었 습 니 다. 여기 서 다시 한 번 쓰 는 이 유 는 세 가지 가 있 습 니 다. 하 나 는 현재 알려 진 그림 순환 방송 컨트롤 이 똑 같은 기능 점 (클 라 이언 트 와 유사 한 순환 방송) 을 반복 하고 있 기 때 문 입 니 다. 사실은 개발 자 들 은 그림 순환 방송 컨트롤 에 대해 아직도 많은 수 요 를 가지 고 있 습 니 다.둘째, 현재 저 는 비교적 좋 은 코드 를 보지 못 했 고 개발 자가 라운드 컨트롤 에 대한 복잡 한 수 요 를 바탕 으로 코드 도 복잡 해 질 것 입 니 다 (수천 줄 에 달 하 는 코드 실현).셋째, 제 가 학교 에서 조직 한 취미 팀 은 iOS, Android, Web (JS 기반) 세 플랫폼 의 코드 를 동시에 작성 하여 일치 하 는 특성 과 서 비 스 를 제공 하고 이 를 시작 할 계획 입 니 다.
version 0.1 이 실현 하 는 기능 과 제공 하 는 특성
입력: 사용자 가 컨트롤 을 제공 하 는 frame, 컨트롤 이 재생 할 images 출력: 그림 순환 방송 구성 요소 로 그림 을 정기 적 으로 전환 할 수 있 습 니 다.자세 한 내용 은 필요 한 문 서 를 보십시오.
version 0.1 구현 착수
실현 원 리 는 참조 하 시기 바 랍 니 다.
개인 속성 목록
@interface LZPPictureCarousel ()

@property (nonatomic, strong, nonnull) NSArray *images;

@property (nonatomic, strong, nonnull) UIScrollView *imageScrollView;
@property (nonatomic, strong, nonnull) NSArray *imageViewArray;
@property (nonatomic, strong, nonnull) UIPageControl *pageControl;

@property (nonatomic, strong, nullable) NSTimer *timer; // null when timer is invalidate

@end

images: 보 여 주 는 그림 으로 구 성 된 배열 image ScrollView: 스크롤 가능 한 영역 imageView Array: 코드 구현 중인 imageView 배열 pagecontroll: 페이지 표시 기 timer: 타이머, 정시 에 그림 을 전환 하 는 데 사용 합 니 다.
모든 개인 속성 에 getter 를 제공 합 니 다. getter 에 서 는 논리 초기 화 만 합 니 다. imageScrollView 를 예 로 들 면...
- (UIScrollView *)imageScrollView
{
    if (!_imageScrollView) {
        _imageScrollView = ({
            UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
            
            scrollView.backgroundColor = [UIColor lightGrayColor];
            scrollView.showsHorizontalScrollIndicator = NO;
            scrollView.showsVerticalScrollIndicator = NO;
            scrollView.bounces = NO;
            scrollView.pagingEnabled = YES;
            
            scrollView;
        });
    }
    
    return _imageScrollView;
}

인 스 턴 스 초기 화 논리
- (instancetype)initWithFrame:(CGRect)frame andImages:(nonnull NSArray *)images
{
    // security checking...
    if (images == nil || images.count <= 0) {
        return nil;
    }

    for (id obj in images) {
        if (![obj isMemberOfClass:[UIImage class]]) {
            return nil;
        }
    }
    
    // custom initializer
    self = [super initWithFrame:frame];
    
    if (self) {
        
        self.images = images;
        
        [self customInitialization];
        
    }
    
    return self;
}

- (void)customInitialization
{
    [self addSubview:self.imageScrollView];
    [self addImageViewToScrollView];
    [self addPageControl];
}

그림 전환 논리
디자인 원리 에 따라 타이머 가 작 동 할 때 scrollView 가 해 야 할 동작 은 간단 하 다. 바로 왼쪽으로 한 페이지 미 끄 러 지 는 것 이다.미끄럼 후 scrollView 의 오프셋 에 따라 pagecontroll 과 scrollView 의 오프셋 을 조정 합 니 다.
- (void)moveToNextPage
{
    CGFloat contentOffsetX = self.imageScrollView.contentOffset.x + self.imageScrollView.frame.size.width;
    [UIView animateWithDuration:0.5 animations:^{
        [self.imageScrollView setContentOffset:CGPointMake(contentOffsetX, 0)];
    } completion:^(BOOL finished) {
        [self adjustPageIndicatorAndContentOffset];
    }];
}

- (void)adjustPageIndicatorAndContentOffset
{
    NSInteger currentPage = floorf(self.imageScrollView.contentOffset.x / self.imageScrollView.frame.size.width + 0.5);
    
    if (currentPage == 0) {
        // the last page
        [self.imageScrollView setContentOffset:CGPointMake(self.imageScrollView.frame.size.width * self.images.count, 0)];
        self.pageControl.currentPage = self.images.count;
    } else if (currentPage == self.images.count + 1) {
        // the first page
        [self.imageScrollView setContentOffset:CGPointMake(self.imageScrollView.frame.size.width, 0)];
        self.pageControl.currentPage = 0;
    } else {
        self.pageControl.currentPage = currentPage - 1;
    }
}

그림 을 움직이다
타이머
- (void)willMoveToSuperview:(UIView *)newSuperview
{
    [self startPlaying];
}

- (void)startPlaying
{
    [self.imageScrollView setContentOffset:CGPointMake(self.imageScrollView.frame.size.width, 0)];
    [self.timer fire];
}

- (void)stopPlaying
{
    [self.timer invalidate];
    self.timer = nil;
}

성능 최적화
타이머 (그 에 따 른 애니메이션) 의 성능 소 모 를 고려 하여 컨트롤 이 제거 되 거나 숨겨 질 때 invalidate 타이머 가 필요 합 니 다.
- (void)removeFromSuperview
{
    [super removeFromSuperview];
    
    [self stopPlaying];
}

- (void)setHidden:(BOOL)hidden
{
    [super setHidden:hidden];
    
    if (hidden) {
        [self stopPlaying];
    } else {
        [self startPlaying];
    }
}

- (void)dealloc
{
    if (!_timer) {
        [_timer invalidate];
    }
}

노 봉 성
다른 글 에 서 는 세 개의 imageView 를 사용 하여 메모리 의 성능 을 최적화 하 는 문 제 를 제시 해 야 한다.이곳 은 0.1 버 전 으로 많은 수요 점 이 아직 실현 되 지 않 았 기 때문에 당분간 메모리 의 최 적 화 를 고려 하지 않 는 다.후속 버 전 은 메모리 최적화 에 적합 한 방안 을 채택 할 것 이다.만약 당신 이 메모리 의 최 적 화 를 어떻게 실현 하 는 지 미리 알 고 싶다 면, 당신 은 다른 작가 의 블 로 그 를 방문 할 수 있 습 니 다. 예 를 들 어 어떻게 하면 순환 광 고 를 신속하게 포장 하여 코드 를 더욱 우아 하 게 할 수 있 습 니까?
코드 와 데모 가 Github 에 업로드 되 었 습 니 다. 사용 을 환영 합 니 다.

좋은 웹페이지 즐겨찾기