0818-ScrollView
-------
控件属性设置
@property (nonatomic,getter = isEnabled) BOOL enabled
enabled selected highlighted
控件内容的水平 垂直居中
contentVerticalAlignment contentHorizontalAlignment
btn removeTarget
------
控件代理为控制器 (用来和视图交互的 有的控件不能添加监听方法的时候用代理来完成对控件的监听等 或者纯粹是控件想完成某些事情)
(控件把事情给代理delegate 代理做完事情把 返回值交给控件)
步骤:
1、TextField控件 设置代理给ViewController (拖线或者代码设置)
2、控制器遵守 TextField控件定义的协议
3、控制器实现协议中定义的方法
#import "ViewController.h" @interface ViewController () <UITextFieldDelegate> @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. } - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { // NSLog(@"%@ %@",NSStringFromRange(range),string); return (range.location<6); return YES; } @end
------------
TextField限制用户输入长度
(代理为控制器)
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { // NSLog(@"%@ %@",NSStringFromRange(range),string); return (range.location<6); return YES; }
------------
TextField让代理控制器 接收return 让控制器执行模拟点击登录
1、勾选placeHolder 请输入用户名
2、登录框暗文 勾选secure
3、连线控制器成为代理 连线登录方法login
4、self.textfield22 becomeFistResponder
5、[self login];
6、勾选clear button appers while editing
-(BOOL)textFieldShouldReturn:(UITextField *)textField { if (textField == self.username) { [self.password becomeFirstResponder]; }else if(textField == self.password){ [self login]; [self.password resignFirstResponder]; } return YES; }
----------------
UIScrollView - 小黄人
方式1:
勾选自动布局的情况下 4寸屏幕的scrollView大小
1、代码创建scrollView 并添加UIImageView 并设置UIImageVeiw.image
3、UIImageView的image属性 宽高设置为892 632
3、self.scrollView.contentSize = CGSizeMake(892,632); //这个设定滚动区域 才能滚动
4 self.scrollView.contentInset = UIEdgeInsetsMake(20, 20, 20, 20);
4、[self.imageView sizeTofit] 根据子空间image大小决定自己大小 (相框根据相册来决定自己大小)
6、不显示滚动时候的滚动条 self.scrollView.showHorizontalScrollIndicator = NO; self.scrollView.showVerticalScrollIndicator = NO;
7、scrollView的内容大小版面移动 偏移位置 self.scrollView.contentOffSet = CGPointMake(100,100);
8、取消动画弹簧效果 self.scrollView.bounces = NO;(超出contentsize部分不会显示 动画弹簧了)
5、给scrollView添加上下约束为0 防止3.5寸屏幕拖到底部的时候需要再拖一点才能看到 图片下面的一部分
导致这个问题的原因是 因为scrollView没有添加约束的storyboard中scrollView高度 如果过大 超出了3.5寸屏幕一部分 所以导致该问题出现
#import "ViewController.h" @interface ViewController () @property (weak, nonatomic) IBOutlet UIScrollView *scrollView; @property (nonatomic,strong) UIImageView *imageView; @property (nonatomic,strong) UIImage *image; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // 创建视图 self.imageView.image = self.image; [self.imageView sizeToFit];//根据子空间的内容调整 imageView的尺寸 self.scrollView.contentSize = self.image.size; self.scrollView.contentInset = UIEdgeInsetsMake(20, 20, 20, 20); self.scrollView.showsHorizontalScrollIndicator = NO; self.scrollView.showsVerticalScrollIndicator = NO; self.scrollView.contentOffset = CGPointMake(100, 100); self.scrollView.bounces = NO; [self.scrollView addSubview:self.imageView]; UIButton *btn = [UIButton buttonWithType:UIButtonTypeContactAdd]; btn.center = self.view.center; [self.view addSubview:btn]; [btn addTarget:self action:@selector(click) forControlEvents:UIControlEventTouchUpInside]; } - (void)click { CGPoint p = self.scrollView.contentOffset; p.x +=20; p.y +=20; self.scrollView.contentOffset = p; } - (UIImage *)image { if (_image == nil) { _image = [UIImage imageNamed:@"minion"]; } return _image; } - (UIImageView *)imageView { if (_imageView == nil) { _imageView = [[UIImageView alloc] init]; } return _imageView; }
方式2 通过storyboard拖动 UIImageView到UIScrollView里面 需要取消自动布局
这个注意就可以了默认都不用管的 UIScrollView控件属性 ContentSize ScrollEnabled(默认YES) userInteractionEnabled(默认YES)
----------------
scrollView - 喜马拉雅(滚动界面布局)
具有穿透效果
1、拖控件 ,拖动navigation bar 和 tabbar的时候保持和scrollView在同一层次 并代码调整这2个控件的上下位置
2、navigation bar放在和scrollView同一层 (不能放到scrollView里了 否则就被一起随着拖动被拖走了)
3、重写scrollView属性set方法 -(void)setScrollView22:(UIScrollView *)scrollView{}
storyboard 做scrollView22连线 一定会被加载并执行了 -(void)setScrollView22:(UIScrollView *)scrollView{}方法 storyboard生成的xml文件被加载并将相关对象生成
在viewDidLoad方法前执行 所以有人喜欢直接在这里写程序代码 而不在viewDidLoad里
----------
scrollView 小黄人 放大缩小
scrollView添加代理来监听放大 控制器实现突破放大
1、scrollView添加代理控制器
2、控制器实现代理协议方法 @interface ViewController ()<UIScrollViewDelegate>
- (UIView *)viewForZoomInScrollView:(UIScrollView)scrollView
{
return self.imageView;
}
viewDidLoad里增加:
self.scrollView.maxiumZoomScale = 2.0;
self.scrollView.miniumZoomScale = 0.2;
还有放大开始 放大结束等协议方法 用的很少
3、按住option 鼠标箭头拖动放大缩小
id<UIScrollViewDelegate>这个协议指定任何对象 都可以当它的代理
--------------
倒计时 4寸屏设计界面
1、拖动空间navigation bar ,里放入一个bar button item ,小控件identifier属性设为stop
1、拖控件 toolbar 中可以放几个 bar button item 放到底部
2、设置控件的属性图标 identifier 为play pause 等
3、弹簧控件(Flexible bar button item)把2个item bar撑开
4、底部tab bar 下面约束为0 (防止3.5寸屏幕不显示tool bar)
5、NSTimer 时间添加到运行循环
#import "ViewController.h" @interface ViewController () @property (weak, nonatomic) IBOutlet UILabel *numberLabel; @property (nonatomic,strong) NSTimer *timer; @end @implementation ViewController - (IBAction)play { self.numberLabel.text = @"10"; self.timer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(updateNumber) userInfo:nil repeats:YES]; //添加到运行循环 [[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes]; } - (void)updateNumber{ int number = self.numberLabel.text.intValue; if (--number==0) { [self pause]; }else{ self.numberLabel.text = [NSString stringWithFormat:@"%d",number]; } } - (IBAction)pause { [self.timer invalidate]; } @end
消除滚动干扰定时器 采用NSRunLoopCommonModes
或者 NSTimer scheduledTimerWithTimeInterval
// self.timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(updateTimer:) userInfo:@"hello timer" repeats:YES];
[timer show];
- (void)updateTimer{}
NSDefaultRunLoopMode 当滚动出现的时候 timer失效
6、时间到了弹出提示 UIAlertView
7、UIAlertView代理实现 点击了哪个弹出按钮
CADisplayLink更加准确 每秒60此
-------------
scrollView - 图片轮播器
1、设定scrollView宽高为 300 130
2、CGSizeMake(_scrollView.bounds.size.width, 0); //高度不设置即可
4、_scrollView.contentSize = CGSizeMake(_scrollView.bounds.size.width * kImageCount, 0);
3、self.pageControl.currentPage = 0;//初始化控件
5、_scrollView.pagingEnabled = YES;// 拖一半办成一个图片效果
6、[self.scrollView setContentOffset:CGPointMake(x, 0) animated:YES];
7、
CGSize size = [_pageControl sizeForNumberOfPages:kImageCount]; //根据总页数得到尺寸
//设置frame
_pageControl.center = CGPointMake(self.view.center.x, 130); _pageControl.bounds = CGRectMake(0, 0, size.width, size.height);
8、完整代码:
#import "ViewController.h" #define kImageCount 5 @interface ViewController () <UIScrollViewDelegate> @property (nonatomic,strong)UIScrollView *scrollView; @property (nonatomic,strong)UIPageControl *pageControl; @property (nonatomic,strong)NSTimer *timer; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; for (int i= 0; i<kImageCount; i++) { UIImage *image = [UIImage imageNamed:[NSString stringWithFormat:@"img_%02d",i+1]]; UIImageView *imageView = [[UIImageView alloc] initWithFrame:self.scrollView.bounds]; imageView.image = image; [self.scrollView addSubview:imageView]; } //计算imageView的位置 [_scrollView.subviews enumerateObjectsUsingBlock:^(UIImageView *imageView, NSUInteger idx, BOOL *stop) { CGRect frame = imageView.frame; frame.origin.x = idx*frame.size.width; imageView.frame = frame; }]; //分页控件显示 self.pageControl.currentPage = 0; [self startTimer]; } - (void)startTimer { self.timer = [NSTimer timerWithTimeInterval:2.0f target:self selector:@selector(updateImageView) userInfo:nil repeats:YES]; [[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes]; } - (void)updateImageView { //当前的page int page = (self.pageControl.currentPage + 1) % kImageCount; self.pageControl.currentPage = page; [self pageChanged:self.pageControl]; } - (UIPageControl *)pageControl { if (_pageControl == nil) { _pageControl = [[UIPageControl alloc] init]; _pageControl.numberOfPages = kImageCount;//总页数 CGSize size = [_pageControl sizeForNumberOfPages:kImageCount]; //根据总页数得到尺寸 //设置frame _pageControl.center = CGPointMake(self.view.center.x, 130); _pageControl.bounds = CGRectMake(0, 0, size.width, size.height); //设置颜色 _pageControl.pageIndicatorTintColor = [UIColor yellowColor]; _pageControl.currentPageIndicatorTintColor = [UIColor blackColor]; [self.view addSubview:_pageControl]; //添加监听方法 [_pageControl addTarget:self action:@selector(pageChanged:) forControlEvents:UIControlEventValueChanged]; } return _pageControl; } //小点变 图像滚动 - (void)pageChanged:(UIPageControl *)pageControl { CGFloat x = pageControl.currentPage * self.scrollView.bounds.size.width; [self.scrollView setContentOffset:CGPointMake(x, 0) animated:YES]; } - (UIScrollView *)scrollView { if (_scrollView == nil) { // 初始化scrollView _scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(10, 20, 300, 130)]; _scrollView.backgroundColor = [UIColor redColor]; [self.view addSubview:_scrollView]; _scrollView.bounces = NO; _scrollView.showsHorizontalScrollIndicator = NO; _scrollView.showsVerticalScrollIndicator = NO; _scrollView.pagingEnabled = YES;// 拖一半办成一个图片效果 _scrollView.contentSize = CGSizeMake(_scrollView.bounds.size.width * kImageCount, 0); _scrollView.delegate = self; } return _scrollView; } //停下来就修改pageControl的小点位置 - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView { CGPoint point = scrollView.contentOffset; int page = point.x/scrollView.bounds.size.width; self.pageControl.currentPage = page;} -(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate { NSLog(@"%s",__func__); [self startTimer]; } -(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView { [self.timer invalidate]; } @end
----------------
NSStringFromCGRect NSStringFrom结构体类型 NSStringFromRange
结构体定义
typedef struct Abbb{
int a;
int b;
}ccc;
struct Abbb tt;
tt.b = 1;
------------------
其他不重要的