几个经常需要自定义的View总结

几个经常需要自定义的组件:UIScrollview、UItextView、UIButton

分类: Iphone应用开发 2011-12-28 15:13 136人阅读 评论(0) 收藏 举报

为了独立出组件的一些功能,如,为UIbutton切换背景图片,我们经常需要自定义一些组件,下面是我经常用到的,先总结出来,以后会慢慢更新:

-:UIScroview

srollview的事件经常与其子view事件冲突,截断子view事件的相应

//传递touch事件

- (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event

{

if(!self.dragging)

{

[[selfnextResponder]touchesBegan:toucheswithEvent:event];

}

[supertouchesBegan:touches withEvent:event];

// NSLog(@"MyScrollView touch Began");

}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event

{

if(!self.dragging)

{

[[selfnextResponder]touchesMoved:toucheswithEvent:event];

}

[supertouchesMoved:touches withEvent:event];

}

- (void)touchesEnded:(NSSet*)touches withEvent:(UIEvent*)event

{

if(!self.dragging)

{

[[selfnextResponder]touchesEnded:toucheswithEvent:event];

}

[supertouchesEnded:touches withEvent:event];

}

[plain] view plaincopy

    //父视图是否可以将消息传递给子视图,yes是将事件传递给子视图,则不滚动,no是不传递则继续滚动

    - (BOOL)touchesShouldBegin:(NSSet *)touches withEvent:(UIEvent *)event inContentView:(UIView *)view

    {

    if ([view isKindOfClass:[CustomUITextViewclass]])

    {

    return YES;

    }

    else

    {

    returnNO;

    }

    }

    //Yes是子视图取消继续接受touch消息(可以滚动),NO是子视图可以继续接受touch事件(不滚动)

    //默认的情况下当view不是一个UIControlo类的时候,值是yes,否则是no

    //调用情况是这样的一般是在发送tracking messages消息后会调用这个函数,来判断scroll是否滚动,还是接受子视图的touch事件

    - (BOOL)touchesShouldCancelInContentView:(UIView *)view

    {

    NSLog(@"用户点击的视图 %@",view);

    returnNO;

    }

    二:UITextView默认是没有边框的,可以给它加个凹下去的边框

    -(void) drawRect:(CGRect)rect {

    [self.layersetBackgroundColor: [[UIColorwhiteColor]CGColor]];

    [self.layersetBorderColor: [[UIColorgrayColor]CGColor]];

    [self.layersetBorderWidth:1.0];

    [self.layersetCornerRadius:8.0f];

    [self.layersetMasksToBounds:YES];

    UIGraphicsBeginImageContext(self.frame.size);

    CGContextRef currentContext =UIGraphicsGetCurrentContext();

    CGContextSetLineWidth(currentContext, 2.0);

    CGContextSetRGBStrokeColor(currentContext, 0.6,0.6,.6, 1.0);

    CGRect myRect = CGContextGetClipBoundingBox(currentContext);

    float myShadowColorValues[] = {0,0,0,1};

    CGColorSpaceRef myColorSpace =CGColorSpaceCreateDeviceRGB();

    CGColorRef colorRef = CGColorCreate(myColorSpace, myShadowColorValues);

    CGContextSetShadowWithColor(currentContext, CGSizeMake(-1,1),2, colorRef);

    CGContextStrokeRect(currentContext, myRect);

    UIImage *backgroundImage = (UIImage *)UIGraphicsGetImageFromCurrentImageContext();

    UIImageView *myImageView = [[UIImageViewalloc]initWithFrame:CGRectMake(0,0,self.frame.size.width,self.frame.size.height)];

    [myImageView setImage:backgroundImage];

    [selfaddSubview:myImageView];

    [myImageView release];

    UIGraphicsEndImageContext();

    }

    三:我们会想按下按钮时,切换button的图片背景,可以给UIbutton加个UIControllEvent事件的消息通知,当按钮被按下的时候,通知按钮所有者去切换图片

    - (id)initWithFrame:(CGRect)_frame  {

    if (self = [superinitWithFrame:_frame]) {

    [selfaddTarget:selfaction:@selector(touchDown:)forControlEvents:UIControlEventTouchDown];

    [selfaddTarget:selfaction:@selector(touchUpInside:)forControlEvents:UIControlEventTouchUpInside];

    //[selfaddTarget:selfaction:@selector(touchUpOutside:)forControlEvents:UIControlEventTouchUpOutside];

    }

    returnself;

    }

    - (void)touchDown:(id)sender {

    NSNotification *notification = [NSNotificationnotificationWithName:@"TouchDownButton"object:selfuserInfo:nil];

    [[NSNotificationCenterdefaultCenter]postNotification:notification];

    NSLog(@"%s",__FUNCTION__);

    }

    - (void)touchUpInside:(id)sender {

    //[self setBackgroundImage:@"next.png" forState:UIControlStateNormal];

    NSNotification *notification = [NSNotificationnotificationWithName:@"TouchUpButton"object:selfuserInfo:nil];

    [[NSNotificationCenterdefaultCenter]postNotification:notification];

    }

    使用方法

    在所有者类中定义这些自定义的组件,如定义

    CustomerButton *nextButton;

    监听消息

    [notification addObserver:self selector:@selector(touchDownNext) name:@"TouchDownButton" object:nil];

    [notification addObserver:self selector:@selector(touchUpNext) name:@"TouchUpButton" object:nil];

    监听到后需要执行的动作

    -(void)touchDownNext{

    UIImage *image = [UIImageimageNamed:@"next_pressed.png"];

    [nextButtonsetBackgroundImage:imageforState:UIControlStateHighlighted];

    }

    -(void)touchUpNext{

    UIImage *image = [UIImageimageNamed:@"next.png"];

    [nextButtonsetBackgroundImage:imageforState:UIControlStateNormal];

    }

    时间: 2024-08-09 13:41:06

    几个经常需要自定义的View总结的相关文章

    Android XML中引用自定义内部类view的四个why

    今天碰到了在XML中应用以内部类形式定义的自定义view,结果遇到了一些坑.虽然通过看了一些前辈写的文章解决了这个问题,但是我看到的几篇都没有完整说清楚why,于是决定做这个总结. 使用自定义内部类view的规则 本文主要是总结why,所以先把XML布局文件中引用内部类的自定义view的做法摆出来,有四点: 自定义的类必须是静态类: 使用view作为XML文件中的tag,注意,v是小写字母,小写字母v,小写字母v: 添加class属性,注意,没有带android:命名空间的,表明该自定义view

    Android中如何优雅地自定义一个View

    Android中自定义View的实现比较简单,无非就是继承父类,然后重载方法,即便如此,在实际编码中难免会遇到一些坑,我把自己遇到的一些问题和解决方法总结一下,希望对广大码友们有所帮助. 注意点① 用xml定义Layout时,Root element 最好使用merge 当我们需要继承一个布局比较复杂的ViewGroup(比较多的是LinearLayout.RelativeLayout)时,通常会用xml来写布局,然后在自定义的View类中inflate这个定义了layout的xml文件. 首先

    Android实现圆形、圆角和椭圆自定义图片View(使用BitmapShader图形渲染方法)

    一.概述 Android实现圆角矩形,圆形或者椭圆等图形,一般主要是个自定义View加上使用Xfermode实现的.实现圆角图片的方法其实不少,常见的就是利用Xfermode,Shader.本文直接继承ImageView,使用BitmapShader方法来实现圆形.圆角和椭圆的绘制,等大家看我本文的方法后,其他的类似形状也就都能举一反三来来画出来了. 二.效果图: 三.BitmapShader简介 BitmapShader是Shader的子类,可以通过Paint.setShader(Shader

    Android中layout.xml文件中加载自定义的View类

    <com.bn.summer.GGView3 android:layout_width="100dip" android:layout_height="114dip" android:layout_marginLeft="11dip" /> View类的实现: package com.bn.summer; import android.content.Context; import android.content.res.Resour

    Android中自定义视图View之---进阶篇(Canvas的使用)

    更多技术内容请移步:我的个人博客 一.前言 今天是周日,昨天刚刚写完了一篇关于如何搭建LNMP环境,让自己可以DIY有个性的个人主页: http://blog.csdn.net/jiangwei0910410003/article/details/50929955 那么今天,我们继续来看一篇关于Android中的UI篇,如何自定义视图View的进阶篇,关于前奏篇之前已经写过了,还没有了解的同学可以去看看:http://blog.csdn.net/jiangwei0910410003/articl

    自定义特效VIew第一弹之竖直TextView

    自定义特效VIew第一弹之竖直TextView 别的不说,先给出效果 再给出代码 <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent" > <com.example.empty.VerticalTextView android:layout_width="wrap_content" android:layout_

    一步一步实现Android自定义组合View

    Android自定义View之组合View Android自定义View之组合View 前序 设计图UI效果 实现思路 动手实现 继承LinearLayout实现外部轮廓 定义各种需要的属性 初始化View 添加一些必要的接口方法 自定义View完成 自定义View的引用 实现效果图 前序 最近在开发一款电商类B端APP,比较忙,现在最新版本要上线了.刚好年底才有时间停下来梳理一下自己写过的东西,顺便分享一些出来,抛砖引玉,还请大家不吝赐教. 设计图UI效果 我们这里要介绍的就是后面三块的UI效

    Android中自定义视图View之---前奏篇

    前言 好长时间没写blog了,心里感觉有点空荡荡的,今天有时间就来写一个关于自定义视图的的blog吧.关于这篇blog,网上已经有很多案例了,其实没什么难度的.但是我们在开发的过程中有时候会用到一些自定义的View以达到我们所需要的效果.其实网上的很多案例我们看完之后,发现这部分没什么难度的,我总结了两点: 1.准备纸和笔,计算坐标 2.在onDraw方法中开始画图,invalidate方法刷新,onTouchEvent方法监听触摸事件 对于绘图相关的知识,之前在弄JavaSE相关的知识的时候,

    自定义的view无法在layou视图中查看 ,How to use isInEditMode()

    自定义的view无法在layou视图中查看,可尝试如下编辑:及在构造函数中判断 isInEditMode的状态,返回false才进行初始化 public class GraphView extends View { public GraphView(Context context, AttributeSet attrs) { super(context, attrs); if(!isInEditMode()) init(context); } public GraphView(Context c

    Android中自定义视图View之---开发案例

    自定义视图View的案例 下面我们就是开始正式的进入自定义视图View了 在讲解正式内容之前,我们先来看一下基本知识 1.我们在自定义视图View的时候正确的步骤和方法 1).必须定义有Context/Attrbuite参数的构造方法,并且调用父类的方法 public LabelView(Context context, AttributeSet attrs) 不然会报错: 2).重写onMeasure方法 @Override protected void onMeasure(int width