06iOS 사진 윤 방 컨트롤 - version 0.1
물론 그림 순환 방송 컨트롤 이라는 것 은 정말 엉망 이 되 었 습 니 다. 여기 서 다시 한 번 쓰 는 이 유 는 세 가지 가 있 습 니 다. 하 나 는 현재 알려 진 그림 순환 방송 컨트롤 이 똑 같은 기능 점 (클 라 이언 트 와 유사 한 순환 방송) 을 반복 하고 있 기 때 문 입 니 다. 사실은 개발 자 들 은 그림 순환 방송 컨트롤 에 대해 아직도 많은 수 요 를 가지 고 있 습 니 다.둘째, 현재 저 는 비교적 좋 은 코드 를 보지 못 했 고 개발 자가 라운드 컨트롤 에 대한 복잡 한 수 요 를 바탕 으로 코드 도 복잡 해 질 것 입 니 다 (수천 줄 에 달 하 는 코드 실현).셋째, 제 가 학교 에서 조직 한 취미 팀 은 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 에 업로드 되 었 습 니 다. 사용 을 환영 합 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.