首先看下效果圖 數組
最外層是一個uitableview,廣告欄是一個uiscrollview,以前作過相似的例子,是在構造cell的方法 iview
cellForRowAtIndexPath中判斷行數再添加uiscrollview,可是以爲代碼不夠整潔,總之是怎麼看怎麼不爽,因而決定嘗試用uitableview head來解決,既然要用到head,那確定就是要自定義一個view了 async
如下是view的h文件 ide
@interface AdvertHeaderView : UIView<UIScrollViewDelegate>{ ui
int TimeNum; atom
BOOL Tend; url
NSArray *imageArray; spa
} .net
@property (retain, nonatomic) UIScrollView *sv; code
@property (retain, nonatomic) UIPageControl *PageControl;
- (void)configAdvert:(NSArray *) imgArray;
-(void)configUserInterface;
如下是view的m文件
//
// AdvertHeaderView.m
// SUNCommonComponent
//
// Created by kobeli on 13-11-25.
// Copyright (c) 2013年 中山市新聯醫療科技有限公司. All rights reserved.
//
#import "AdvertHeaderView.h"
@implementation AdvertHeaderView
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
// Initialization code
imageArray =本身定義一個裝載圖片地址的數組
[self configUserInterface];
[self configAdvert:imageArray];
}
return self;
}
-(void)configAdvert:(NSArray *)imgArray
{
[self AdImg:imgArray];
[self setCurrentPage:_PageControl.currentPage];
}
-(void)configUserInterface{
_sv=[[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, 320, 144)];
_sv.delegate=self;
_sv.showsHorizontalScrollIndicator=NO;
_sv.showsVerticalScrollIndicator=NO;
_sv.pagingEnabled=YES;
[self addSubview:_sv ];
_PageControl=[[UIPageControl alloc]initWithFrame:CGRectMake(320/2-15, _sv.frame.size.height-23 , 30, 30)];
[self addSubview:_PageControl ];
}
-(void)AdImg:(NSArray*)arr{
[_sv setContentSize:CGSizeMake(320*[arr count], 144)];
_PageControl.numberOfPages=[arr count];
for ( int i=0; i<[arr count]; i++) {
NSString *url=[arr objectAtIndex:i];
UIButton *img=[[UIButton alloc]initWithFrame:CGRectMake(320*i, 0, 320, 144)];
// [img addTarget:self action:@selector(Action) forControlEvents:UIControlEventTouchUpInside];
[_sv addSubview:img];
//[img setImage:[UIImage imageNamed:@"jiazai_test@2x.png"] forState:UIControlStateNormal];
UIImageFromURL( [NSURL URLWithString:url], ^( UIImage * image )
{
[img setBackgroundImage:image forState:UIControlStateNormal];
}, ^(void){
});
}
}
void UIImageFromURL( NSURL * URL, void (^imageBlock)(UIImage * image), void (^errorBlock)(void) )
{
dispatch_async( dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0 ), ^(void)
{
NSData * data = [[NSData alloc] initWithContentsOfURL:URL] ;
UIImage * image = [[UIImage alloc] initWithData:data];
dispatch_async( dispatch_get_main_queue(), ^(void){
if( image != nil )
{
imageBlock( image );
} else {
errorBlock();
}
});
});
}
#pragma mark - 5秒換圖片
- (void) handleTimer: (NSTimer *) timer
{
if (TimeNum % 5 == 0 ) {
if (!Tend) {
_PageControl.currentPage++;
if (_PageControl.currentPage==_PageControl.numberOfPages-1) {
Tend=YES;
}
}else{
_PageControl.currentPage--;
if (_PageControl.currentPage==0) {
Tend=NO;
}
}
[UIView animateWithDuration:0.8 //速度0.7秒
animations:^{//修改座標
_sv.contentOffset = CGPointMake(_PageControl.currentPage*320,0);
}];
}
TimeNum ++;
}
#pragma mark - scrollView && page
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
NSLog(@"我滑動了");
_PageControl.currentPage=scrollView.contentOffset.x/320;
[self setCurrentPage:_PageControl.currentPage];
}
- (void) setCurrentPage:(NSInteger)secondPage {
for (NSUInteger subviewIndex = 0; subviewIndex < [_PageControl.subviews count]; subviewIndex++) {
UIImageView* subview = [_PageControl.subviews objectAtIndex:subviewIndex];
//這裏犯了一個小錯誤,若是不加類型判斷的話會報錯找不到setimage方法的錯,因此必定要
判斷是uiview仍是uiimageview
if ([subview isKindOfClass:[UIImageView class]]) {
CGSize size;
size.height = 12/2;
size.width = 12/2;
[subview setFrame:CGRectMake(subview.frame.origin.x, subview.frame.origin.y,
size.width,size.height)];
if (subviewIndex == secondPage)
[subview setImage:[UIImage imageNamed:@"a.png"]];
else
[subview setImage:[UIImage imageNamed:@"d.png"]];
}
}
}
能夠使用
//頭標籤高度設置
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
CGFloat f=144;
return f;
}
//頭標籤設置,返回自定義的uiview
-(UIView *) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
AdvertHeaderView *advertHeaderView=[[AdvertHeaderView alloc] initWithFrame:CGRectMake(0, 0, 320, 144)];
return advertHeaderView;
}
這種方法,廣告欄view會停留在頁面上,不會隨uitableview滾動若是要其隨其它cell滾動,能夠這樣設置
self.tableViewList.tableHeaderView=advertHeaderView;
這樣就大功告成,去試試吧