`
jsntghf
  • 浏览: 2527658 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

自定义UIScrollView

    博客分类:
  • iOS
阅读更多

本文实现的自定义UIScrollView可以上下拉动,下拉显示前一条记录,上拉显示后一条记录,这里并未给出具体的实现代码,本文中的代码只是使用示例,具体的实现请参考附件。

 

DetailViewController.h

 

#import "VerticalSwipeScrollView.h"

@interface DetailViewController : UIViewController <VerticalSwipeScrollViewDelegate, UIScrollViewDelegate> {
  IBOutlet UIView* headerView;
  IBOutlet UIImageView* headerImageView;
  IBOutlet UILabel* headerLabel;

  IBOutlet UIView* footerView;
  IBOutlet UIImageView* footerImageView;
  IBOutlet UILabel* footerLabel;
  
  VerticalSwipeScrollView* verticalSwipeScrollView;
  NSArray* appData;
  NSUInteger startIndex;
  UIWebView* previousPage;
  UIWebView* nextPage;
}

@property (nonatomic, retain) IBOutlet UIView* headerView;
@property (nonatomic, retain) IBOutlet UIImageView* headerImageView;
@property (nonatomic, retain) IBOutlet UILabel* headerLabel;
@property (nonatomic, retain) IBOutlet UIView* footerView;
@property (nonatomic, retain) IBOutlet UIImageView* footerImageView;
@property (nonatomic, retain) IBOutlet UILabel* footerLabel;
@property (nonatomic, retain) VerticalSwipeScrollView* verticalSwipeScrollView;
@property (nonatomic, retain) NSArray* appData;
@property (nonatomic) NSUInteger startIndex;
@property (nonatomic, retain) UIWebView* previousPage;
@property (nonatomic, retain) UIWebView* nextPage;

@end
  

DetailViewController.m

 

#import "DetailViewController.h"

CGFloat DegreesToRadians(CGFloat degrees) {return degrees * M_PI / 180;};
CGFloat RadiansToDegrees(CGFloat radians) {return radians * 180/M_PI;};

@interface DetailViewController (PrivateMethods)
- (void)hideGradientBackground:(UIView *)theView;
- (UIWebView *)createWebViewForIndex:(NSUInteger)index;
@end

@implementation DetailViewController

@synthesize headerView, headerImageView, headerLabel;
@synthesize footerView, footerImageView, footerLabel;
@synthesize verticalSwipeScrollView, appData, startIndex;
@synthesize previousPage, nextPage;

- (void)viewDidLoad {
    headerImageView.transform = CGAffineTransformMakeRotation(DegreesToRadians(180));
}

- (void)willAppearIn:(UINavigationController *)navigationController {
    self.verticalSwipeScrollView = [[[VerticalSwipeScrollView alloc] initWithFrame:self.view.frame headerView:headerView footerView:footerView startingAt:startIndex delegate:self] autorelease];
    [self.view addSubview:verticalSwipeScrollView];
}

- (void) rotateImageView:(UIImageView *)imageView angle:(CGFloat)angle {
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:0.2];
    imageView.transform = CGAffineTransformMakeRotation(DegreesToRadians(angle));
    [UIView commitAnimations];
}

# pragma mark VerticalSwipeScrollViewDelegate

- (void) headerLoadedInScrollView:(VerticalSwipeScrollView *)scrollView {
    [self rotateImageView:headerImageView angle:0];
}

- (void) headerUnloadedInScrollView:(VerticalSwipeScrollView *)scrollView {
    [self rotateImageView:headerImageView angle:180];
}

- (void) footerLoadedInScrollView:(VerticalSwipeScrollView *)scrollView {
    [self rotateImageView:footerImageView angle:180];
}

- (void) footerUnloadedInScrollView:(VerticalSwipeScrollView *)scrollView {
    [self rotateImageView:footerImageView angle:0];
}

- (UIView *) viewForScrollView:(VerticalSwipeScrollView *)scrollView atPage:(NSUInteger)page {
    UIWebView* webView = nil;
    
    if (page < scrollView.currentPageIndex)
        webView = [[previousPage retain] autorelease];
    else if (page > scrollView.currentPageIndex)
        webView = [[nextPage retain] autorelease];
    
    if (!webView)
        webView = [self createWebViewForIndex:page];
    
    self.previousPage = page > 0 ? [self createWebViewForIndex:page-1] : nil;
    self.nextPage = (page == (appData.count-1)) ? nil : [self createWebViewForIndex:page+1];
    
    self.navigationItem.title = [[[appData objectAtIndex:page] objectForKey:@"im:name"] objectForKey:@"label"];
    if (page > 0)
        headerLabel.text = [[[appData objectAtIndex:page-1] objectForKey:@"im:name"] objectForKey:@"label"];
    if (page != appData.count-1)
        footerLabel.text = [[[appData objectAtIndex:page+1] objectForKey:@"im:name"] objectForKey:@"label"];
    
    return webView;
}

- (NSUInteger) pageCount {
    return appData.count;
}

- (UIWebView *) createWebViewForIndex:(NSUInteger)index {
    UIWebView* webView = [[[UIWebView alloc] initWithFrame:self.view.frame] autorelease];
    webView.opaque = NO;
    [webView setBackgroundColor:[UIColor clearColor]];
    [self hideGradientBackground:webView];
    
    NSString* htmlFile = [[[NSBundle mainBundle] bundlePath] stringByAppendingString:@"/DetailView.html"];
    NSString* htmlString = [NSString stringWithContentsOfFile:htmlFile encoding:NSUTF8StringEncoding error:nil];
    htmlString = [htmlString stringByReplacingOccurrencesOfString:@"<!-- title -->" withString:[[[appData objectAtIndex:index] objectForKey:@"im:name"] objectForKey:@"label"]];
    htmlString = [htmlString stringByReplacingOccurrencesOfString:@"<!-- icon -->" withString:[[[[appData objectAtIndex:index] objectForKey:@"im:image"] objectAtIndex:0] objectForKey:@"label"]];
    htmlString = [htmlString stringByReplacingOccurrencesOfString:@"<!-- content -->" withString:[[[appData objectAtIndex:index] objectForKey:@"summary"] objectForKey:@"label"]];
    [webView loadHTMLString:htmlString baseURL:nil];
    
    return webView;
}

- (void) hideGradientBackground:(UIView *)theView {
    for (UIView *subview in theView.subviews) {
        if ([subview isKindOfClass:[UIImageView class]])
            subview.hidden = YES;
        
        [self hideGradientBackground:subview];
    }
}

- (void)viewDidUnload {
    self.headerView = nil;
    self.headerImageView = nil;
    self.headerLabel = nil;
    
    self.footerView = nil;
    self.footerImageView = nil;
    self.footerLabel = nil;
}

- (void)dealloc {
    [headerView release];
    [headerImageView release];
    [headerLabel release];
    
    [footerView release];
    [footerImageView release];
    [footerLabel release];
    
    [verticalSwipeScrollView release];
    [appData release];
    [previousPage release];
    [nextPage release];
    
    [super dealloc];
}

@end
分享到:
评论

相关推荐

    MMScrollPresenter, 用于分页UIViews的iOS自定义UIScrollView控件.zip

    MMScrollPresenter, 用于分页UIViews的iOS自定义UIScrollView控件 MMScrollPresenter 描述MMScrollPresenter是用于iOS开发的控件,它接受MMScrollPages的array 并显示在你的UIScrollView中。我最初是在命运应用中的...

    iOS自定义UIScrollView的滚动条实例代码

    iOS自定义UIScrollView的滚动条实例代码 iOS开发中,UIScrollView是一个非常常用的控件,经常用来实现滚动列表、图片浏览等功能。默认情况下,UIScrollView具有一个滚动条,但是这个滚动条的样式和行为可能不能满足...

    TRSDialScrollView:使用自定义 UIScrollView 的 iOS 水平滚动拨盘

    TRSD拨号滚动视图 这是我用于我的一个应用程序的自定义 UIScrollView。 这是一个可定制的拨号控件,可满足您所有控件显示需求。 包括通过 UIAppearance 对所有主要属性进行自定义。去做仍然需要添加对 AutoLayout 的...

    BounceScrollView:自定义 UIScrollView 在用户尝试滚动滚动视图超出其内容大小时的行为方式

    当用户尝试将 UIScrollView 滚动到滚动视图内容之外时,可以使用 Bounce Scroll View 自定义 UIScrollView 的外观 有两种选择 滚动限制 其中滚动视图将在内容大小 2 之外的所需偏移处停止。阻力比 其中滚动视图将...

    ios-UIScrollView分页滑动宽度自定义.zip

    本示例“ios-UIScrollView分页滑动宽度自定义.zip”专注于讲解如何自定义UIScrollView的分页滑动宽度,以实现更灵活、个性化的用户界面。这通常涉及到的内容包括UIScrollView的基本使用、pagingEnabled属性的设置...

    iOS 下类似UITableView的可循环列表利用UIScrollView制作

    综上所述,通过自定义UIScrollView,我们可以实现一个类似UITableView的无限循环列表。这种方式虽然比直接使用UITableView更复杂,但在某些场景下,如轮播图、无限滚动列表等,它能提供更大的灵活性和定制化空间。在...

    ios-UIScrollView.zip

    这通常是通过自定义UIScrollView的行为来实现的。开发者可能通过监听滑动手势的细节,比如滑动速度和方向,判断是否达到页面边缘。一旦到达边界,可以动态地添加或者显示预先设计好的箭头和文字视图。这些视图可能是...

    ios-十字形滑动.zip

    总的来说,这个“ios-十字形滑动”项目提供了一种简单的方法来实现微博个人主页那样的交互体验,通过自定义UIScrollView子类,避免了视图层次过深的问题,提高了代码的可读性和维护性。开发者可以通过研究这个项目,...

    CustomScrollIndicator, iOS自定义ScrollIView指示器.zip

    CustomScrollIndicator, iOS自定义ScrollIView指示器 iOS可以定制的ScrollIndicator 允许自定义UIScrollView滚动指示器,只有一个类别 enum-配置指示器位置typedef enum { JMOVerticalSc

    【iphone应用开发】Iphone应用开发之五: UIScrollView的详细讲解

    在实际项目中,我们经常需要自定义UIScrollView的行为,比如实现无限轮播的效果。这通常需要配合使用UICollectionView或者UIPageControl来完成。通过合理配置contentSize和contentOffset,我们可以让滚动视图在达到...

    自定义类实现图片的放大缩小,以及动态滑动

    本主题聚焦于如何利用自定义UIScrollView实现图片的放大缩小功能,并且支持动态滑动,使得用户在查看图片时可以自由浏览图片的各个部分。在iOS中,UIImageView通常用于显示静态图片,但若要实现缩放和滑动功能,我们...

    iOS自定义Scrollview滑动间距page

    要实现滑动间距小于屏幕宽度的效果,我们需要自定义UIScrollView的行为。我们可以通过重写`setContentOffset:animated:`方法来控制ScrollView的滑动位置。这个方法用于设置ScrollView的内容偏移量,即滚动到的位置。...

    IndicatorViewDemo.zip

    总的来说,"IndicatorViewDemo"是一个关于自定义UIScrollView指示器的实践案例,它涉及到iOS开发中的多个重要知识点,包括自定义视图、UIScrollView的使用、事件处理以及视图的布局和动画。对于想要提升iOS UI开发...

    IOS应用源码之效果不错的view视图滑动切换效果 .rar

    2. **自定义UIScrollView**: - 对于更复杂的需求,开发者可能选择自定义`UIScrollView`。通过设置`contentSize`属性来定义可滚动的区域大小,然后添加多个子视图(每个子视图代表一个页面)到`UIScrollView`上。 ...

    ios-酒店预订App.zip

    自定义UIScrollView实现全屏滑动显示不同控制器的LBPScrollSegmentView 封装网络访问类AFNetPackage,具备检查网络状态、JSON方式获取数据、xml方式获取数据、post、get、delete、文件下载、文件上传等功能 ...

    scrollView 滑动页面

    本篇将深入探讨如何实现"scrollView滑动页面",特别是自定义UIScrollView以满足特定需求。 首先,我们要了解UIScrollView的基本使用。在Storyboard中,我们可以直接添加UIScrollView,并将其约束设置为充满父视图。...

    ios-仿咕咚运动列表切换环形滚动特效.zip

    在咕咚运动App的案例中,开发者可能通过自定义UIScrollView来实现环形滚动的视觉效果,这需要对UIScrollView的contentSize、contentOffset、decelerationRate等属性有深入理解,并且需要处理好内容的循环显示。...

    ios-仿淘宝页面 图片和文字同步滑动,但速度不同 效果.zip

    然后,为了实现不同的滑动速度,你需要自定义UIScrollView的滚动行为。这可以通过重写UIScrollView的代理方法,如`- (void)scrollViewDidScroll:(UIScrollView *)scrollView`来实现。在这个方法中,你可以根据当前的...

Global site tag (gtag.js) - Google Analytics