暑期第二周总结

在仿写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;

教训:

在写之前没有好好规划一下,把所有的文件 都放到了一起,可读性很差,以后把每一块的内容的文件放在一起。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值