在仿写share时,遇到了一些问题,现在写完了做一个个总结。
一、UITableView显示不全
首先遇到的这个问题就是有关于UITableView的,有时候我们的tableview视图并不能从屏幕的(0,0)开始,可能有导航栏等等的因素,所有就会导致UITableView显示不全,我这里是有两个解决方法。
方法一:
可以在设置UITableView的时候,将它的高度减去一个数值,使它显示完全,就像下面这个样子:
_tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height - 50) style:UITableViewStyleGrouped];
方法二:
可以在我们的最后一个cell的heightForFooter里把距离放大,这样也可以使我们的UITableView显示完全,不会出现显示到一半,拉不上去的情况。
二、无限轮播图
刚开始写这个的时候是在做第一周小项目仿写网易云界面的时候,这次是自己想的,写出了一个简易的轮播图,稍微有点小问题。
-(void) timeGo
{
_myTimer = [NSTimer timerWithTimeInterval:2 target:self selector:@selector(turnPage) userInfo:nil repeats:YES];
[[NSRunLoop mainRunLoop] addTimer:_myTimer forMode:NSDefaultRunLoopMode];
}
-(void) turnPage {
CGFloat current = self.scrollView.contentOffset.x;
if (current < 390 * 4) {
[_scrollView scrollRectToVisible:CGRectMake(current + 390, 0, 390, 225) animated:YES];
} else {
[_scrollView scrollRectToVisible:CGRectMake(0, 0, 390, 225) animated:NO];
}
}
这种方式就是加了一个定时器,然后每隔一段时间就会让scrollview的位移发生变化,然后在最后再加一个第一张图片,这样就可以造成一个假象,像是直接到最开头,然后再加一个判断是不是最后一张,如果是最后一张就切换到第一张。这样会造成一个第一张的图片的轮播时间为其他图片的两倍。
下面这种方式是我我在仿写share时,上网查到的并且自己改了一部分(网上的太复杂)。
具体思路:可以参考一下这篇文章的第一个方法。
@implementation HomeViewController
- (void)viewDidLoad {
_scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, 415, 230)];
_scrollView.contentSize = CGSizeMake(390 * 3, 225);
[_scrollView setContentOffset:CGPointMake(0, 0)];
_scrollView.userInteractionEnabled = YES;
_scrollView.pagingEnabled = YES;
_scrollView.delegate = self;
_scrollView.bounces = NO;
_scrollView.showsHorizontalScrollIndicator = NO;
_scrollView.contentOffset = CGPointMake(390, 0);
_imagesArray = [[NSMutableArray alloc] init];
for (int i = 0; i < 4; i ++) {
[_imagesArray addObject: [UIImage imageNamed:[[NSString alloc] initWithFormat:@"/Users/haoqianbiao/Desktop/test1/UI/share/素材/main_img%d.png",i+1]]];
}
self.index = 0;
_leftView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 415, 230)];
[_leftView setImage:[_imagesArray objectAtIndex:3]];
[_scrollView addSubview:_leftView];
_middleView = [[UIImageView alloc] initWithFrame:CGRectMake(415, 0, 415, 230)];
[_middleView setImage:[_imagesArray objectAtIndex:0]];
[_scrollView addSubview:_middleView];
_rightView = [[UIImageView alloc] initWithFrame:CGRectMake(2 * 415, 0, 415, 230)];
[_rightView setImage:[_imagesArray objectAtIndex:1]];
[_scrollView addSubview:_rightView];
_pageControl = [[UIPageControl alloc] initWithFrame:CGRectMake(390 / 2 - 40, 210, 40, 20)];
_pageControl.numberOfPages = 4;
_pageControl.currentPage = 0;
_pageControl.pageIndicatorTintColor = [UIColor grayColor];
_pageControl.currentPageIndicatorTintColor = [UIColor orangeColor];
[self timeRun];
}
-(void) timeRun
{
_timer = [NSTimer timerWithTimeInterval:10 target:self selector:@selector(slideImage) userInfo:nil repeats:YES];
[[NSRunLoop mainRunLoop] addTimer:_timer forMode:NSDefaultRunLoopMode];
}
-(void) scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
int direction = scrollView.contentOffset.x/390;
if (direction == 0) {
//向左
if (_index == 0) {
_index = 3;
}else{
_index--;
}
}else{
//向右
if (_index == 3) {
_index = 0;
}else{
_index++;
}
}
_pageControl.currentPage = _index;
NSArray *array = [NSArray arrayWithArray:[self getImageToShowByIndex:_index]];
[_leftView setImage: [array objectAtIndex:0]];
[_middleView setImage:[array objectAtIndex:1]];
[_rightView setImage:[array objectAtIndex:2]];
//将偏移值移回中间
scrollView.contentOffset = CGPointMake(415, 0);
}
-(NSMutableArray*) getImageToShowByIndex:(int) index {
NSMutableArray* imageArray = [[NSMutableArray alloc] init];
if (index == 0) {
[imageArray addObject:[_imagesArray objectAtIndex:3]];
[imageArray addObject:[_imagesArray objectAtIndex:index]];
[imageArray addObject:[_imagesArray objectAtIndex:index + 1]];
} else if (index == 3) {
[imageArray addObject:[_imagesArray objectAtIndex:index - 1]];
[imageArray addObject:[_imagesArray objectAtIndex:index]];
[imageArray addObject:[_imagesArray objectAtIndex:0]];
} else {
[imageArray addObject:[_imagesArray objectAtIndex:index - 1]];
[imageArray addObject:[_imagesArray objectAtIndex:index]];
[imageArray addObject:[_imagesArray objectAtIndex:index + 1]];
}
return imageArray;
}
-(void)slideImage{
//自动滚动一直往右滚
if (_index == 3) {
_index = 0;
}else{
_index++;
}
_pageControl.currentPage = _index;
NSArray *array = [NSArray arrayWithArray:[self getImageToShowByIndex:_index]];
[_leftView setImage: [array objectAtIndex:0]];
[_middleView setImage:[array objectAtIndex:1]];
[_rightView setImage:[array objectAtIndex:2]];
_scrollView.contentOffset = CGPointMake(415, 0);
}
但是这种方法我还有个问题没解决,就是点击下面的小点然后上面的大图片切换到指定位置。
三、获取父视图
有时候我们在UITableViewcell里面需要获得父视图的一些东西,所以就需要获取父视图。
- (UIViewController *)viewController{
for (UIView* next = [self superview]; next; next = next.superview) {
UIResponder *nextResponder = [next nextResponder];
if ([nextResponder isKindOfClass:[UIViewController class]]) {
return (UIViewController *)nextResponder;
}
}
return nil;
}
四、设置字体颜色和大小
[self.navigationController.navigationBar setTitleTextAttributes:@{NSFontAttributeName:[UIFont systemFontOfSize:20], NSForegroundColorAttributeName:[UIColor whiteColor]}];
五、导航栏右上角按钮样式
考核的时候突然想不起来,然后就一直试,最后也试出来了。
UIBarButtonItem* rightButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCamera target:nil action:nil];
self.navigationItem.rightBarButtonItem = rightButton;
教训:
在写之前没有好好规划一下,把所有的文件 都放到了一起,可读性很差,以后把每一块的内容的文件放在一起。