最近做项目,需求中要求用户名或密码输错时,输入框要抖动(类似Mac登录密码错误的抖动效果)。现将代码分享出来:
@interface UITextField (YHShakeUITextField)
- (void) shake;
@end
#import "YH-TextField.h"
#import <QuartzCore/QuartzCore.h>
@implementation UITextField (YHShakeUITextField)
//self.superView
- (void) shake {
CAKeyframeAnimation *keyAn = [CAKeyframeAnimation animationWithKeyPath:@"position"];
[keyAn setDuration:0.5f];
NSArray *array = [[NSArray alloc] initWithObjects:
[NSValue valueWithCGPoint:CGPointMake(self.center.x, self.center.y)],
[NSValue valueWithCGPoint:CGPointMake(self.center.x-5, self.center.y)],
[NSValue valueWithCGPoint:CGPointMake(self.center.x+5, self.center.y)],
[NSValue valueWithCGPoint:CGPointMake(self.center.x, self.center.y)],
[NSValue valueWithCGPoint:CGPointMake(self.center.x-5, self.center.y)],
[NSValue valueWithCGPoint:CGPointMake(self.center.x+5, self.center.y)],
[NSValue valueWithCGPoint:CGPointMake(self.center.x, self.center.y)],
[NSValue valueWithCGPoint:CGPointMake(self.center.x-5, self.center.y)],
[NSValue valueWithCGPoint:CGPointMake(self.center.x+5, self.center.y)],
[NSValue valueWithCGPoint:CGPointMake(self.center.x, self.center.y)],
nil];
[keyAn setValues:array];
[array release];
NSArray *times = [[NSArray alloc] initWithObjects:
[NSNumber numberWithFloat:0.1f],
[NSNumber numberWithFloat:0.2f],
[NSNumber numberWithFloat:0.3f],
[NSNumber numberWithFloat:0.4f],
[NSNumber numberWithFloat:0.5f],
[NSNumber numberWithFloat:0.6f],
[NSNumber numberWithFloat:0.7f],
[NSNumber numberWithFloat:0.8f],
[NSNumber numberWithFloat:0.9f],
[NSNumber numberWithFloat:1.0f],
nil];
[keyAn setKeyTimes:times];
[times release];
[self.layer addAnimation:keyAn forKey:@"TextAnim"];
}
@end
在登录的类里调用如下:
-(void)isloginbuttonClick
{
if ([userTextField.text length] == 0)
{
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"watch out"
message:@"please input user"
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil,nil];
[alertView show];
[alertView release];
[userTextField shake];
}
else if ([passwordTextField.text length] == 0)
{
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"watch out"
message:@"please input password"
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil, nil];
[alertView show];
[alertView release];
[passwordTextField shake];
}
else
{
SecondViewController *secondViewController = [[SecondViewController alloc] init];
[self.navigationController pushViewController:secondViewController animated:YES];
}
}
Objective-C语言关键词,与@synthesize配对使用。
功能:让编译器自动编写一个与数据成员同名的方法声明来省去读写方法的声明。
说白了,就是java中的getter setter方法。
声明property的语法为:
assign 通常用于基本类型,如int,bool,char等。
copy 通常用于NSString,NSNumber,NSArray等不变的类型。
retain 一般的NSObject 都用这个。
下面解释一下NSString类型的变量的setter方法为什么要用copy.直接上代码:
NSString类型变量的值是不会发生变化的,但变量的内存地址是会发生变化的。copy的用法是复制内容,并且新分配一块内存地址。而retain则是将输入参数的内存地址复制一份,赋给成员变量。所以copy和retain的区别在于,如果传入的参数是NSMutableString类型的话,这个参数一旦发生变化,成员变量的内容也会发生变化;而用copy,则不会发生这种情况(因为两者的内存地址完全不同)。如果传入的参数是NSString,则用copy和retain的效果完全一样,没什么分别。所以NSString、NSArray等不可变的类型建议用copy。
以上代码来自cocoachina
http://www.cocoachina.com/bbs/read.php?tid=107184&toread=1
继上次说用权重之后,发现了新的问题就是当横屏的时候textview和edittext的差距会隔的较远,这样就不好看了。于是又换了一种新的想法,把textview和edittext的父类换成RelativeLayout,这样就不用权重,在textview的width为wrap,edittext的width为fill,统一设置edittext距离左边的距离。