UIWebView基本介绍
最后更新于:2022-04-01 06:59:30
~~~
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view.
UIWebView * webView = [[UIWebView alloc]initWithFrame:CGRectMake(0, 20, ScreenWidth, ScreenHeight-20)];
// 自动队页面进行缩放以适应屏幕
webView.scalesPageToFit = YES;
webView.userInteractionEnabled = YES;
webView.opaque = YES;
[self.view addSubview:webView];
NSURL * url = [NSURL URLWithString:@"http://www.youku.com"];
NSURLRequest * request = [NSURLRequest requestWithURL:url];
[webView loadRequest:request];
// NSString * myHT = @"优酷";
// [webView loadHTMLString:myHT baseURL:url];
/*
[webView goBack]; // 返回
[webView goForward]; // 前往
[webView reload];
[webView stopLoading];
*/
webView.delegate = self;
//移除滚动后的外边阴影
UIScrollView *scrollView = webView.scrollView;
for (int i = 0; i < scrollView.subviews.count ; i++) {
UIView *view = [scrollView.subviews objectAtIndex:i];
if ([view isKindOfClass:[UIImageView class]]) {
view.hidden = YES ;
}
}
}
#pragma mark - UIWebViewDelegate
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType{
/**
* typedef NS_ENUM(NSInteger, UIWebViewNavigationType) {
* UIWebViewNavigationTypeLinkClicked,
* UIWebViewNavigationTypeFormSubmitted,
* UIWebViewNavigationTypeBackForward,
* UIWebViewNavigationTypeReload,
* UIWebViewNavigationTypeFormResubmitted,
* UIWebViewNavigationTypeOther
};
*/
NSLOG_FUNCTION;
return YES;
}
// 开始加载
- (void)webViewDidStartLoad:(UIWebView *)webView{
NSLOG_FUNCTION;
}
// 完成加载
- (void)webViewDidFinishLoad:(UIWebView *)webView{
NSLOG_FUNCTION;
}
// 加载失败,弹出错误提示
- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error{
UIAlertView *alterview = [[UIAlertView alloc] initWithTitle:@"" message:[error localizedDescription]
delegate:nil cancelButtonTitle:nil otherButtonTitles:@"OK", nil];
[alterview show];
[alterview release];
NSLOG_FUNCTION;
}
~~~
UITabBarController详解(三)自定义UITabBarController
最后更新于:2022-04-01 06:59:28
@有的时候,我们不想用系统提供的UITabBarController,这个时候就需要自定义了,还能实现一定的动画效果,比如仿新浪的,切换标签,会有图片随着移动
@自定义的时候,一般是用UIImageView+UIButton实现
~~~
#pragma mark - 自定义TarBar
- (void)createCustomTarBar{
#pragma mark 初始化TarBar背景
UIImageView * tarbarBackground = [[UIImageView alloc]initWithFrame:CGRectMake(0, ScreenHeight-49, ScreenWidth, 49)];
tarbarBackground.image = [UIImage imageNamed:@"tarBarBackground"];
// 切记,不能漏了这句话,UIImageView会阻挡程序检测到点击在button上
tarbarBackground.userInteractionEnabled = YES;
[self.view addSubview:tarbarBackground];
[tarbarBackground release];
#pragma mark 初始化选中时的图片
_selectImageView = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"select"]];
_selectImageView.frame = CGRectMake(5, 4, 54, 42);
// 思考为什么,这里不需要开交互,点击button也能响应
//selectImageView.userInteractionEnabled = NO;
[tarbarBackground addSubview:_selectImageView];
[_selectImageView release];
#pragma mark 初始化tabBarItem----->UIButton
NSArray * defaultBackground = @[@"tabbar_home",@"tabbar_message_center",@"tabbar_profile",@"tabbar_discover",@"tabbar_more"];
for (int i = 0; i < 5; i++) {
// button与tarbarBackground 是上下的层级关系
UIButton * button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
button.frame = CGRectMake(10+64*i, 5, 44, 41);
button.tag = TAG + i;
[button setImage:[UIImage imageNamed:[defaultBackground objectAtIndex:i]] forState:UIControlStateNormal];
[button addTarget:self action:@selector(onClickChangeView:) forControlEvents:UIControlEventTouchUpInside];
[tarbarBackground addSubview:button];
}
}
- (void)onClickChangeView:(UIButton *)button{
self.selectedIndex = button.tag;
// block设定动画
[UIView animateWithDuration:0.5 animations:^{
_selectImageView.frame = CGRectMake(5 + button.tag * 64, 4, 54, 42);
}];
}
~~~
~~~
#pragma mark - 初始化ViewController
- (void)createTarBarViewController{
#pragma mark 第一个视图ViewController
HMT_AViewController * tabBarViewA = [[HMT_AViewController alloc] init];
// 设置A视图下----标签栏标题文字(可参照微信或者QQ体会)
//tabBarViewA.tabBarItem.title = @"微信";
// 设置A视图下----标签栏图片(因为自己没有图片,在这里随便设置了个名字)
//tabBarViewA.tabBarItem.image = [UIImage imageNamed:@"1.png"];
// 设置A视图下----标签栏信息提示(住:badgeValue是NSString类型 如下设置了3,就像QQ消息有3条未接受一样,给人一种提醒)
//tabBarViewA.tabBarItem.badgeValue = @"3";
UINavigationController * tabBarViewNA = [[UINavigationController alloc]initWithRootViewController:tabBarViewA];
// ios7弃用了----标签栏选中的时候显示一张图片,没选中的时候显示另一张图片
//[tabBarViewA.tabBarItem setFinishedSelectedImage:actionMenu.selectedIcon withFinishedUnselectedImage:actionMenu.icon];
// ios7的方法(自己没有图片,所以代码里面的图片都是一个随便取的名字,没有实用意义)
//tabBarViewA.tabBarItem.selectedImage = actionMenu.selectedIcon;
#pragma mark 第二个视图ViewController
// 第二个视图ViewController
HMT_BViewController * tabBarViewB = [[HMT_BViewController alloc] init];
// 设置B视图下----标签栏
// 用系统提供的标识(可以算等价于图标和文字)进行设置(参数:UITabBarSystemItem是个枚举值,想要什么形式,就去系统提供的API中找)
//tabBarViewB.tabBarItem = [[[UITabBarItem alloc]initWithTabBarSystemItem:UITabBarSystemItemSearch tag:1]autorelease];
// 设置B视图下----标签栏信息提示
//tabBarViewB.tabBarItem.badgeValue = @"GO";
#pragma mark 第三个视图ViewController
HMT_CViewController * tabBarViewC = [[HMT_CViewController alloc] init];
// ViewController -- NavigationController -- UITabBarController 3者想相结合
UINavigationController * tabBarViewNC = [[UINavigationController alloc]initWithRootViewController:tabBarViewC];
tabBarViewC.tabBarItem = [[[UITabBarItem alloc]initWithTabBarSystemItem:UITabBarSystemItemDownloads tag:2]autorelease];
// 设置B视图下----标签栏信息提示
//tabBarViewC.tabBarItem.badgeValue = @"new";
#pragma mark 第四个视图ViewController
HMT_DViewController * tabBarViewD = [[HMT_DViewController alloc] init];
//tabBarViewD.tabBarItem = [[[UITabBarItem alloc]initWithTabBarSystemItem:UITabBarSystemItemFavorites tag:3]autorelease];
// 设置B视图下----标签栏信息提示
//tabBarViewD.tabBarItem.badgeValue = @"99";
#pragma mark 第五个视图ViewController
HMT_EViewController * tabBarViewE = [[HMT_EViewController alloc] init];
//tabBarViewE.tabBarItem = [[[UITabBarItem alloc]initWithTabBarSystemItem:UITabBarSystemItemHistory tag:4]autorelease];
// 设置B视图下----标签栏信息提示
//tabBarViewE.tabBarItem.badgeValue = @"sky";
#pragma mark 第六个视图ViewController(系统默认能显示的最大视图个数是5个)
/* 如果你的viewControllers属性添加了多于五个的items,那tab bar controller将会自动插入一个特殊的view controller,
称为 More view controller,该 controller 将会负责管理多于的items,这个More view controller提供一个自定义的界面,
用table的方式呈现多余的view controller,并且view controller的数量是不限制的*/
HMT_FViewController * tabBarViewF = [[HMT_FViewController alloc] init];
//tabBarViewF.tabBarItem = [[[UITabBarItem alloc]initWithTabBarSystemItem:UITabBarSystemItemContacts tag:5]autorelease];
// 设置F视图下----标签栏信息提示
//tabBarViewF.tabBarItem.badgeValue = @"AG";
#pragma mark 设置TabBarController
// 创建TabBarController
//UITabBarController * tabBarController = [[UITabBarController alloc]init];
// TabBarController默认是放在最底部的,如果你想调整位置,可以进行下面2部操作(44是iPhone中TabBarController和UINavigationController标准高度)
//CGRect frame = CGRectMake(0, 20, 320, 44);
//tabBarController.tabBar.frame = frame;
// 每一个tab都必须有一个content view controller------->viewControllers属性,用来存入一个应用的TabBarController有多少个界面切换
self.viewControllers = [NSArray arrayWithObjects:tabBarViewNA,tabBarViewB,tabBarViewNC,tabBarViewD,tabBarViewE,nil];
// 设置着色
self.tabBar.tintColor = [UIColor greenColor];
// 设置选中图片时候
self.tabBar.selectedImageTintColor = [UIColor redColor];
// 设置背景图片(自己没有图片,不进行设置)
//tabBarController.tabBar.backgroundImage = [UIImage imageNamed:@"@@@@@"];
// 设置程序启动时默认的ViewController视图(设置为3,一共5个ViewController,进来时候显示的视图就是第4个-tabBarViewD,下标从0开始)
//self.selectedIndex = 0;
// 设置代理
self.delegate = self;
//UINavigationController *nav = tabBarController.moreNavigationController;
//[nav setNavigationBarHidden:YES animated:YES];
[tabBarViewA release];
[tabBarViewNA release];
[tabBarViewB release];
[tabBarViewC release];
[tabBarViewNC release];
[tabBarViewD release];
[tabBarViewE release];
[tabBarViewF release];
}
// 控制哪些ViewController的标签栏能被点击
- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController{
// 代表HMT_CViewController这个View无法显示,无法点击到它代表的标签栏
/*if ([viewController isKindOfClass:[HMT_CViewController class]]) {
return NO;
}*/
return YES;
}
// 选中哪个标签栏,一个监控作用吧
- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController{
NSLOG_FUNCTION;
}
// More view controller 将要开始编辑
- (void)tabBarController:(UITabBarController *)tabBarController willBeginCustomizingViewControllers:(NSArray *)viewControllers{
NSLOG_FUNCTION;
}
// More view controller 将要结束编辑
- (void)tabBarController:(UITabBarController *)tabBarController willEndCustomizingViewControllers:(NSArray *)viewControllers changed:(BOOL)changed{
NSLOG_FUNCTION;
}
// More view controller 编辑
- (void)tabBarController:(UITabBarController *)tabBarController didEndCustomizingViewControllers:(NSArray *)viewControllers changed:(BOOL)changed{
NSLOG_FUNCTION;
}
~~~
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-01-12_5694d753c8211.jpg)
UITextView
最后更新于:2022-04-01 06:59:26
~~~
1.创建并初始化
@property (nonatomic, strong) UITextView *textView;
// 创建
self.textView = [[UITextView alloc] initWithFrame:self.view.frame];
// 设置textview里面的字体颜色
self.textView.textColor = [UIColor blackColor];
// 设置字体名字和字体大小
self.textView.font = [UIFont fontWithName:@"Arial" size:18.0];
// 设置代理
self.textView.delegate = self;
// 设置它的背景颜色
self.textView.backgroundColor = [UIColor whiteColor];
self.textView.text = @“hehe”;
// 返回键的类型
self.textView.returnKeyType = UIReturnKeyDefault;
// 键盘类型
self.textView.keyboardType = UIKeyboardTypeDefault;
// 是否可以拖动
self.textView.scrollEnabled = YES;
2. UITextView退出键盘的几种方式
(1)如果你程序是有导航条的,可以在导航条上面加多一个Done的按钮,用来退出键盘,当然要先实现UITextViewDelegate。
- (void)textViewDidBeginEditing:(UITextView *)textView {
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(getOverEditing)];
}
- (void)textViewDidEndEditing:(UITextView *)textView {
self.navigationItem.rightBarButtonItem = nil;
}
- (void)getOverEditing{
[self.textView resignFirstResponder];
}
(2)如果你的textview里不用回车键,可以把回车键当做退出键盘的响应键。
#pragma mark - UITextView Delegate Methods
-(BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
{
if ([text isEqualToString:@"\n"]) {
[textView resignFirstResponder];
return NO;
}
return YES;
}
(3)还有你也可以自定义其他视图控件加载到键盘上用来退出,比如在弹出的键盘上面加一个view来放置退出键盘的Done按钮。
UIToolbar * topView = [[UIToolbar alloc]initWithFrame:CGRectMake(0, 0, 320, 30)];
UIBarButtonItem * cancelButton= [[UIBarButtonItem alloc]initWithTitle:@"Done" style:UIBarButtonItemStyleDone target:self action:@selector(dismissKeyBoard)];
NSArray * buttonsArray = @[cancelButton];
[topView setItems:buttonsArray];
[self.textView setInputAccessoryView:topView];
-(void)dismissKeyBoard
{
[tvTextView resignFirstResponder];
}
3.UITextView自定选择文字后的菜单
在ViewDidLoad中加入:
- (void)viewDidLoad
{
[super viewDidLoad];
self._textView = [[UITextView alloc] initWithFrame:CGRectMake(10, 100, 300, 200)];
[self.view addSubview:_textView];
UIMenuItem *menuItem = [[UIMenuItem alloc]initWithTitle:@“我是自定义的菜单" action:@selector(didClickCustomMenuAction)];
UIMenuController *menu = [UIMenuController sharedMenuController];
[menu setMenuItems:[NSArray arrayWithObject:menuItem]];
[menuItem release];
}
当然上面那个@selector里面的changeColor方法还是自己写吧,也就是说点击了我们自定义的菜单项后会触发的方法。
然后还得在代码里加上一个方法:
-(BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
if(action ==@selector(changeColor) || action == @selector(copy:))
{
if(_textView.selectedRange.length>0)
return YES;
}
return NO;
}
-(void)didClickCustomMenuAction
{
NSLog(@"%@“,__function__);
}
~~~
UIImagePickerController——–图片选取器
最后更新于:2022-04-01 06:59:24
@UIImagePickerController 类是获取选择图片和视频的用户接口。我们可以用这个controller选择我们所需要的图片和视频。对于这个类来说比较特殊,我们不能够任意定制,也不可以继承生成子类。
1.当前设备是否支持使用UIImagePickerController,需要调用
[UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera];
2.查看符合的媒体类型(图片或者视频,调用availableMediaTypesForSourceType: 方法判断。
3.sourceType(从哪选取媒体)
// 打开图片库根目录选择
UIImagePickerControllerSourceTypePhotoLibrary
// 使用相机选择
UIImagePickerControllerSourceTypeCamera
// 打开SavedPhoto目录选择
UIImagePickerControllerSourceTypeSavedPhotosAlbum
4.先创建一个UIImagePickerController(可以用模态推出相册或UIActionSheet推出)
~~~
@实现协议UIImagePickerControllerDelegate
_imagePickerC = [[UIImagePickerController alloc] init];
_imagePickerC.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
_imagePickerC.allowsEditing = YES;
_imagePickerC.delegate = self;
[self presentModalViewController: _imagePickerC animated: YES];
~~~
allowEditing 设置为YES,表示 允许用户编辑图片,否则,不允许用户编辑。
5.两个主要的委托方法
~~~
// 用户选中图片之后的回调
- (void)imagePickerController: (UIImagePickerController *)picker didFinishPickingMediaWithInfo: (NSDictionary *)info
{
if (picker == picker_camera_)
{
//如果是 来自照相机的image,那么先保存
UIImage* original_image = [info objectForKey:@"UIImagePickerControllerOriginalImage"];
}
// info dictionary keys
UIKIT_EXTERN NSString *const UIImagePickerControllerMediaType; // an NSString (UTI, i.e. kUTTypeImage)
UIKIT_EXTERN NSString *const UIImagePickerControllerOriginalImage; // a UIImage
UIKIT_EXTERN NSString *const UIImagePickerControllerEditedImage; // a UIImage
UIKIT_EXTERN NSString *const UIImagePickerControllerCropRect; // an NSValue (CGRect)
UIKIT_EXTERN NSString *const UIImagePickerControllerMediaURL; // an NSURL
UIKIT_EXTERN NSString *const UIImagePickerControllerReferenceURL NS_AVAILABLE_IOS(4_1); // an NSURL that references an asset in the AssetsLibrary framework
UIKIT_EXTERN NSString *const UIImagePickerControllerMediaMetadata NS_AVAILABLE_IOS(4_1); // an NSDictionary containing metadata from a captured photo
// 获得编辑过的图片
UIImage* image = [info objectForKey: @"UIImagePickerControllerEditedImage"];
// 把图片转成NSData类型的数据来保存文件(存入到沙盒中)
NSData *imageData;
// 判断图片是不是png格式的文件
if (UIImagePNGRepresentation(image)) {
// 返回为png图像。
imageData = UIImagePNGRepresentation(image);
}else {
// 返回为JPEG图像
imageData = UIImageJPEGRepresentation(image, 1.0);
}
// 路径拼接,写入-----
NSString * imageSavePath = [[[HMTMySqliteDataHandle shareInstance]saveImagesPath] stringByAppendingPathComponent:@"自定义.自定义"];
[imageData writeToFile:imageSavePath atomically:YES];
// 关闭相册界面
[self dismissModalViewControllerAnimated:YES];
[picker release];
}
// 用户选择取消
- (void) imagePickerControllerDidCancel: (UIImagePickerController *)picker
{
// 关闭相册界面
[self dismissModalViewControllerAnimated:YES];
[picker release];
}
~~~
@[ UIImagePickerController详解](http://blog.csdn.net/kingsley_cxz/article/details/9157093)
@ [UIImagePickerController](http://blog.csdn.net/rhljiayou/article/details/8003939) 任海丽(3G移动/开发)
@[iOS摄像头和相册-UIImagePickerController-浅析](http://blog.sina.com.cn/s/blog_7b9d64af0101cfd9.html)
UIStepper
最后更新于:2022-04-01 06:59:21
@在IOS5中增加了一个UIStepper的新控件,UIStepper可以连续增加或减少一个数值。控件的外观是两个水平并排的按钮构成,一个显示为“+”,一个显示为“-”。
该控件的一个有趣的特征是当用户按住“+”,“-”按钮时,根据按住的时间长度,空间值的数字也以不同的数字改变。按住的时间越长,数值改变的越快。可以为UIStepper设定一个数值范围,比如0-99\. 它的显示效果如下:
1\. 初始化控件
UIStepper *_stepper = [[[UIStepper alloc] initWithFrame:CGRectMake(120, 20, 0, 0)] autorelease];
// 响应事件
[_stepper addTarget:self action:@selector(updateValue:) forControlEvents:UIControlEventValueChanged];
//设置最大值和最小值
[_stepper setMinimumValue:0];
[_stepper setMaximumValue:100];
// 控制值是否在[minimumValue, maximumValue]区间内循环,默认NO。
[_stepper setWraps:YES];
// 控制是否持续触发UIControlEventValueChanged事件。默认为YES,即当按住时每次值改变都触发一 次UIControlEventValueChanged事件,否则只有在释放时触发UIControlEventValueChanged事件。
_stepper.continuous = YES;
// 每次递增或递减的值
[_stepper setStepValue:10];
// 控制是否在按住时自动持续递增或递减,默认YES;
_stepper.autorepeat = YES;
2\. 属性说明
value: 当前所表示的值,默认为0.0;
minimumValue: 最小可以表示的值,默认0.0;
maximumValue: 最大可以表示的值,默认100.0;
stepValue: 每次递增或递减的值,默认为1.0;
3.如何判断加("+")减("-")
(1)通过设置一个 *double** previousValue; **// *用来记录*Stepper.value*的上一次值
(2)在对想操作的对象进行操作后,将Stepper.value = 0
~~~
#pragma mark - 设置UIStepper
- (void)createUIStepper{
UIStepper * stepperButton = [[UIStepper alloc]initWithFrame:CGRectMake(225, 500, 30, 10)];
[stepperButton addTarget:self action:@selector(controlStepperValue:) forControlEvents:UIControlEventValueChanged];
stepperButton.maximumValue = 100.0;
stepperButton.minimumValue = 0.0;
stepperButton.value = INITUISTEPPERVALUE;
stepperButton.stepValue = 1.0;
stepperButton.continuous = YES;
stepperButton.wraps = NO;
stepperButton.autorepeat = YES;
[self.view addSubview:stepperButton];
[stepperButton release];
}
- (void)controlStepperValue:(UIStepper *)stepper{
if (_segment.selectedSegmentIndex == 0) {
if (stepper.value > previousValue) {
CGRect redRect = _redView.frame;
redRect.size.height += 5;
_redView.frame = redRect;
} else {
CGRect redRect = _redView.frame;
redRect.size.height -= 5;
_redView.frame = redRect;
}
previousValue = stepper.value;
}else{
if (stepper.value > previousValue) {
CGRect redRect = _greenView.frame;
redRect.size.height += 5;
_greenView.frame = redRect;
} else {
CGRect redRect = _greenView.frame;
redRect.size.height -= 5;
_greenView.frame = redRect;
}
previousValue = stepper.value;
}
}
~~~
UIActivityIndicatorView(活动指示器 ———> 网络卡后加载,画面,图像加载闪烁的圆圈)
最后更新于:2022-04-01 06:59:19
@派生自UIView,所以它是视图,也可以附着在视图上。
**一.创建**
// 因为UIActivityIndicatorView的大小是固定的,可以直接设置它.center
UIActivityIndicatorView* activityIndicatorView = [ [ UIActivityIndicatorView alloc ]
initWithFrame:CGRectMake(250.0,20.0,30.0,30.0)];
**二. 属性设置风格:**
activityIndicatorView.activityIndicatorViewStyle= UIActivityIndicatorViewStyleGray;
系统给你提供了3种风格:
UIActivityIndicatorViewStyleWhiteLarge 大型白色指示器
UIActivityIndicatorViewStyleWhite 标准尺寸白色指示器
UIActivityIndicatorViewStyleGray 灰色指示器,用于白色背景
如果希望指示器停止后自动隐藏,那么要设置hidesWhenStoped属性为YES。默认是YES。设置为NO停止后指示器仍会显示。
activityIndicatorView.hidesWhenStoped = NO;
**三.显示**
可以将它附着在任何视图上,比如表格单元、或者视图:
[ self.view addSubview:activityIndicatorView ];
**四.启动和停止(可以配合NSTimer使用,作为参数userInfo传进去)**
[ activityIndicatorView startAnimating ];//启动
[ activityIndicatorView stopAnimating ];//停止
@网络活动指示器
当你的应用程序使用网络时,应当在iPhone的状态条上放置一个网络指示器,警告用户正在使用网络。
这时你可以用UIApplication的一个名为networkActivityIndicatorVisible的属性。
通过设置这个可以启用或禁用网络指示器:UIApplication* app = [ UIApplication sharedApplication ];
app.networkActivityIndicatorVisible = YES;
UIPickerView(滚动选择控制器)
最后更新于:2022-04-01 06:59:17
1.UIPickerView的宽度和高度是固定的,纵向是320*216,横向是568*162
2.属性:
@property(nonatomic,readonly)NSInteger numberOfComponents; // 选择框的行数
@property(nonatomic,assign)idUIPickerViewDataSource> dataSource; (类似于UITableView)
@property(nonatomic,assign)idUIPickerViewDelegate>delegate; (类似于UITableView)
(BOOL)showsSelectionIndicator// 是否显示选择指示器 ,即是一个蓝色的条
~~~
pickerView = [[UIPickerView alloc] initWithFrame:CGRectMake(0, 0, 320, 216)];
// 指定Delegate
pickerView.delegate=self;
// 显示选中框
pickerView.showsSelectionIndicator=YES;
[self.view addSubview:pickerView];
~~~
以上可以在视图显示一个选取器,但是内容空白,pickerView.showsSelectionIndicator=YES;是这只当前选取器所选中的内容:
选取器上显示数据,必须依赖两个协议,UIPickerViewDelegate和UIPickerViewDataSource,把他们添加到ViewController.h文件中
~~~
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController<UIPickerViewDelegate,UIPickerViewDataSource>
{
UIPickerView *pickerView;
NSArray *pickerData;
}
@end
~~~
3.然后在.m文件的ViewDidLoad中初始化界面
~~~
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
pickerView = [[UIPickerView alloc] initWithFrame:CGRectMake(0, 0, 320, 216)];
// 指定Delegate
pickerView.delegate=self;
// 显示选中框
pickerView.showsSelectionIndicator=YES;
[self.view addSubview:pickerView];
NSArray *dataArray = [[NSArray alloc]initWithObjects:@"许嵩",@"周杰伦",@"梁静茹",@"许飞",@"凤凰传奇",@"阿杜",@"方大同",@"林俊杰",@"胡夏",@"邱永传", nil];
pickerData=dataArray;
// 添加按钮
CGRect frame = CGRectMake(120, 250, 80, 40);
UIButton *selectButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
selectButton.frame=frame;
[selectButton setTitle:@"SELECT" forState:UIControlStateNormal];
[selectButton addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:selectButton];
}
~~~
4.实现UIPickerView的代理方法,将数据显示在选取器上所需要几个方法
~~~
#pragma mark -
#pragma mark Picker Date Source Methods
//返回显示的列数
-(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
return 1;
}
//返回当前列显示的行数
-(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
return [pickerData count];
}
#pragma mark Picker Delegate Methods
//返回当前行的内容,此处是将数组中数值添加到滚动的那个显示栏上
-(NSString*)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
return [pickerData objectAtIndex:row];
}
~~~
前两个是数据源的代理方法,一个是返回列,有几个选取器就返回几,第二个是设置选取器有多少行,因为就这一个选取器,所以直接返回行数,即数组元素个数多少;第三个代理方法是将数组元素添加到了选取器上面显示;
说一下两个协议实例方法,参考[http://www.cnblogs.com/edsioon/](http://www.cnblogs.com/edsioon/)
UIPickerViewDelegate[中的实例方法](http://www.cnblogs.com/edsioon/archive/2012/03/27/2418914.html)
// 当用户选择某个row时
- (void) pickerView: (UIPickerView *)pickerView didSelectRow: (NSInteger)row inComponent: (NSInteger)component
// 当其在绘制row内容,需要row的高度时
- (CGFloat) pickerView:(UIPickerView *)pickerView rowHeightForComponent: (NSInteger) component
// 返回指定component.row显示的文本
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger) component
// 当picker view需要给指定的component.row指定view时,调用此函数.返回值为用作row内容的view
- (UIView *)pickerView: (UIPickerView *)pickerView view ForRow:(NSInteger) row forComponent:(NSInteger) component reusingView:(UIView *) view
// row的宽度
- (CGFloat)pickerView: (UIPickerView *)pickerView widthForComponent:(NSInteger) component
[UIPickerViewDataSource](http://www.cnblogs.com/edsioon/archive/2012/03/27/2418919.html)[中的实例方法](http://www.cnblogs.com/edsioon/archive/2012/03/27/2418919.html)
按照官方文档的说法,UIPickerViewDataSource这个协议仅有的功能就是提供picker view中component的个数和各个component中的row的个数,虽然名为datasource,但是它工作于MVC的C中
本协议仅有两个实例方法,均需要实现:
// 返回列数
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
// 返回每一列对应的行数
- (NSInteger) pickerView:(UIPickerView *) pickerView numberOfRowsInComponent:(NSInteger) component
5.关于按钮响应事件,关于按钮的形成和添加响应事件不再提,前面都有,
~~~
(void) buttonPressed:(id)sender
{
NSInteger row =[pickerView selectedRowInComponent:0];
NSString *selected = [pickerData objectAtIndex:row];
NSString *message = [[NSString alloc] initWithFormat:@"你选择的是:%@",selected];
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示"
message:message
delegate:self
cancelButtonTitle:@"OK"
otherButtonTitles: nil];
[alert show];
}
~~~
@UIPickerView还有其他实例方法
// 获取指定列的行数
- (NSInteger) numberOfRowsInComponent:(NSInteger)component
// 刷新所有的列
- (void) reloadAllComponents
// 刷新指定的列
- (void) reloadComponent: (NSInteger) component
- (CGSize) rowSizeForComponent: (NSInteger) component
// 获取某列选择的行数
- (NSInteger) selectedRowInComponent: (NSInteger) component
// 选择一行
- (void) selectRow: (NSInteger)row inComponent: (NSInteger)component animated: (BOOL)animated
- (UIView *) viewForRow: (NSInteger)row forComponent: (NSInteger)component
附上源代码: [http://download.csdn.net/detail/duxinfeng2010/4410909](http://download.csdn.net/detail/duxinfeng2010/4410909)
UILabel 的常见属性和方法:
最后更新于:2022-04-01 06:59:14
//创建UIlabel对象
UILabel* label = [[UILabel alloc] initWithFrame:self.view.bounds];
//设置显示文本
label.text = @"This is a UILabel Demo,";
//设置文本字体
label.font = [UIFont fontWithName:@"Arial" size:35];
//设置文本颜色
label.textColor = [UIColor yellowColor];
//设置文本水平显示位置
label.textAlignment = UITextAlignmentCenter;
//设置背景颜色
label.backgroundColor = [UIColor blueColor];
//设置单词折行方式
label.lineBreakMode = UILineBreakModeWordWrap;
//设置label是否可以显示多行,0则显示多行
label.numberOfLines = 0;
// 动态调整UILabel高度
[label sizeToFit];
//根据内容大小,动态设置UILabel的高度
CGSize size = [label.text sizeWithFont:label.font constrainedToSize:self.view.bounds.size lineBreakMode:label.lineBreakMode];
CGRect rect = label.frame;
rect.size.height = size.height;
label.frame = rect;
// 换行模式
typedef enum {
UILineBreakModeWordWrap = 0, // 以空格为边界,保留整个单词
UILineBreakModeCharacterWrap, // 保留整个字符
UILineBreakModeClip, // 到边界为止
UILineBreakModeHeadTruncation, // 省略开始,以……代替
UILineBreakModeTailTruncation, // 省略结尾,以……代替
UILineBreakModeMiddleTruncation, // 省略中间,以……代替,多行时作用于最后一行
} UILineBreakMode;
UILineBreakModeWordWrap = 0,
以单词为单位换行,以单位为单位截断。
UILineBreakModeCharacterWrap,
以字符为单位换行,以字符为单位截断。
UILineBreakModeClip,
以单词为单位换行。以字符为单位截断。
UILineBreakModeHeadTruncation,
以单词为单位换行。如果是单行,则开始部分有省略号。如果是多行,则中间有省略号,省略号后面有4个字符。
UILineBreakModeTailTruncation,
以单词为单位换行。无论是单行还是多行,都是末尾有省略号。
UILineBreakModeMiddleTruncation,
以单词为单位换行。无论是单行还是多行,都是中间有省略号,省略号后面只有2个字符。
UIAlertView用法
最后更新于:2022-04-01 06:59:12
1\. 最简单的用法
UIAlertView*alert = [[UIAlertView alloc]initWithTitle:@"提示"
message:@"这是一个简单的警告框!"
delegate:nil
cancelButtonTitle:@"确定"
otherButtonTitles:nil];
[alert show];
[alert release];
2\. 为UIAlertView添加多个按钮
UIAlertView*alert = [[UIAlertView alloc]initWithTitle:@"提示"
message:@"请选择一个按钮:"
delegate:nil
cancelButtonTitle:@"取消"
otherButtonTitles:@"按钮一", @"按钮二", @"按钮三",nil];
[alert show];
[alert release];
3\. 如何判断用户点击的按钮
UIAlertView有一个委托(代理)UIAlertViewDelegate ,继承该委托来实现点击事件
头文件:
@interface MyAlertViewViewController : UIViewController {
}
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex;
-(IBAction) buttonPressed;
@end
源文件:
-(IBAction) buttonPressed
{
UIAlertView*alert = [[UIAlertView alloc]initWithTitle:@"提示"
message:@"请选择一个按钮:"
delegate:self
cancelButtonTitle:@"取消"
otherButtonTitles:@"按钮一", @"按钮二", @"按钮三",nil];
[alert show];
[alert release];
}
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
NSString* msg = [[NSString alloc] initWithFormat:@"您按下的第%d个按钮!",buttonIndex];
UIAlertView* alert = [[UIAlertView alloc]initWithTitle:@"提示"
message:msg
delegate:nil
cancelButtonTitle:@"确定"
otherButtonTitles:nil];
[alert show];
[alert release];
[msg release];
}
点击“取消”,“按钮一”,“按钮二”,“按钮三”的索引buttonIndex分别是0,1,2,3
4. 手动的取消对话框
[alertdismissWithClickedButtonIndex:0 animated:YES];
5:为UIAlertView添加子视图
在为UIAlertView对象太添加子视图的过程中,有点是需要注意的地方,如果删除按钮,也就是取消UIAlerView视图中所有的按钮的时候,可能会导致整个显示结构失衡。按钮占用的空间不会消失,我们也可以理解为这些按钮没有真正的删除,仅仅是他不可见了而已。如果在UIAlertview对象中仅仅用来显示文本,那么,可以在消息的开头添加换行符(@"\n)有助于平衡按钮底部和顶部的空间。
下面的代码用来演示如何为UIAlertview对象添加子视图的方法。
UIAlertView*alert = [[UIAlertView alloc]initWithTitle:@"请等待"
message:nil
delegate:nil
cancelButtonTitle:nil
otherButtonTitles:nil];
[alert show];
UIActivityIndicatorView*activeView = [[UIActivityIndicatorView alloc]initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
activeView.center = CGPointMake(alert.bounds.size.width/2.0f, alert.bounds.size.height-40.0f);
[activeView startAnimating];
[alert addSubview:activeView];
[activeView release];
[alert release];
6\. UIAlertView默认情况下所有的text是居中对齐的。 那如果需要将文本向左对齐或者添加其他控件比如输入框时该怎么办呢? 不用担心, iPhone SDK还是很灵活的, 有很多delegate消息供调用程序使用。 所要做的就是在
- (void)willPresentAlertView:(UIAlertView *)alertView
中按照自己的需要修改或添加即可, 比如需要将消息文本左对齐,下面的代码即可实现:
-(void) willPresentAlertView:(UIAlertView *)alertView
{
for( UIView * view in alertView.subviews )
{
if( [view isKindOfClass:[UILabel class]] )
{
UILabel* label = (UILabel*) view;
label.textAlignment=UITextAlignmentLeft;
}
}
}
这段代码很简单, 就是在消息框即将弹出时,遍历所有消息框对象,将其文本对齐属性修改为 UITextAlignmentLeft即可。
添加其他部件也如出一辙, 如下代码添加两个UITextField:
-(void) willPresentAlertView:(UIAlertView *)alertView
{
CGRect frame = alertView.frame;
frame.origin.y -= 120;
frame.size.height += 80;
alertView.frame = frame;
for( UIView * viewin alertView.subviews )
{
if( ![viewisKindOfClass:[UILabelclass]] )
{
CGRect btnFrame = view.frame;
btnFrame.origin.y += 70;
view.frame = btnFrame;
}
}
UITextField* accoutName = [[UITextFieldalloc] init];
UITextField* accoutPassword = [[UITextFieldalloc] init];
accoutName.frame = CGRectMake( 10, frame.origin.y + 40,frame.size.width - 20, 30 );
accoutPassword.frame = CGRectMake( 10, frame.origin.y + 80,frame.size.width -20, 30 );
accoutName.placeholder = @"请输入账号";
accoutPassword.placeholder = @"请输入密码";
accoutPassword.secureTextEntry = YES;
[alertView addSubview:accoutPassword];
[alertView addSubview:accoutName];
[accoutName release];
[accoutPassword release];
}
显示将消息框固有的button和label移位, 不然添加的text field会将其遮盖住。 然后添加需要的部件到相应的位置即可。
对于UIActionSheet其实也是一样的, 在
- (void)willPresentActionSheet:(UIActionSheet *)actionSheet
中做同样的处理一样可以得到自己想要的界面。
UISwitch用法-以及-自定义UISwitch控件
最后更新于:2022-04-01 06:59:10
**@UISwitch用法**
**一、第一种创建UISwitch控件的方法,在代码中动态创建。**
1、打开Xcode 4.3.2, 新建项目Switch,选择Single View Application。
2、打开ViewController.m文件在viewDidLoad方法里添加代码:
~~~
(void)viewDidLoad
{
[super viewDidLoad];
UISwitch *switchButton = [[UISwitch alloc] initWithFrame:CGRectMake(50, 100, 20, 10)];
[switchButton setOn:YES];
[switchButton addTarget:self action:@selector(switchAction:) forControlEvents:UIControlEventValueChanged];
[self.view addSubview:switchButton];
// Do any additional setup after loading the view, typically from a nib.
}
~~~
[switchButton addTarget:selfaction:@selector(switchAction:)forControlEvents:UIControlEventValueChanged];
代码中selector中的switchAction:需要我们自己实现,就是按下时接收到的事件。
记得把switchButton加到当前view,调用[self.viewaddSubview:switchButton];
3、监听UISwitch按下事件
实现代码如下:
~~~
(void)switchAction:(id)sender
{
UISwitch *switchButton = (UISwitch*)sender;
BOOL isButtonOn = [switchButton isOn];
if (isButtonOn) {
showSwitchValue.text = @"是";
}else {
showSwitchValue.text = @"否";
}
}
~~~
showSwitchValue是我通过拖拽控件方法放到界面上的Label,方便显示效果
运行,效果:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-01-12_5694d7536f3cc.png)
**二、通过拖拽方法使用UISwitch**
1、往xib文件上拖拽一个UISwitch控件。
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-01-12_5694d75383edd.png)
2、按alt+command + return键开启Assistant Editor模式,选中UISwitch控件,按住Control键,往ViewController.h拖拽
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-01-12_5694d75395565.png)
3、选Action方式
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-01-12_5694d753a530c.png)
4、.m文件中实现switchAction 。刚才动态创建的时候也用到这个方法名称,可以先注释掉刚才的。
~~~
(IBAction)switchAction:(id)sender {
UISwitch *switchButton = (UISwitch*)sender;
BOOL isButtonOn = [switchButton isOn];
if (isButtonOn) {
showSwitchValue.text = @"是";
}else {
showSwitchValue.text = @"否";
}
}
~~~
@自定义UISwitch
1.使用类别扩展UISwitch。
如下:
下面是UISwitch.h文件:
~~~
#import
@interface UISwitch (tagged)
+ (UISwitch *) switchWithLeftText: (NSString *) tag1 andRight: (NSString *) tag2;
@property (nonatomic, readonly) UILabel *label1;
@property (nonatomic, readonly) UILabel *label2;
@end
UISwitch.m文件:
#import "UISwitch-Extended.h"
#define TAG_OFFSET 900
@implementation UISwitch (tagged)
- (void) spelunkAndTag: (UIView *) aView withCount:(int *) count
{
for (UIView *subview in [aView subviews])
{
if ([subview isKindOfClass:[UILabel class]])
{
*count += 1;
[subview setTag:(TAG_OFFSET + *count)];
}
else
[self spelunkAndTag:subview withCount:count];
}
}
- (UILabel *) label1
{
return (UILabel *) [self viewWithTag:TAG_OFFSET + 1];
}
- (UILabel *) label2
{
return (UILabel *) [self viewWithTag:TAG_OFFSET + 2];
}
+ (UISwitch *) switchWithLeftText: (NSString *) tag1 andRight: (NSString *) tag2
{
UISwitch *switchView = [[UISwitch alloc] initWithFrame:CGRectZero];
int labelCount = 0;
[switchView spelunkAndTag:switchView withCount:&labelCount];
if (labelCount == 2)
{
[switchView.label1 setText:tag1];
[switchView.label2 setText:tag2];
}
return [switchView autorelease];
}
@end
~~~
2.还有一种方法,这种方法比较简单,但比较难懂,我不甚理解。
UISwitch *isFooOrBar=[[UISwitch alloc] init];
((UILabel *)[[[[[[isFooOrBar subviews] lastObject] subviews] objectAtIndex:2] subviews]objectAtIndex:0]).text = @"Foo";
((UILabel *)[[[[[[isFooOrBar subviews] lastObject] subviews] objectAtIndex:2] subviews]objectAtIndex:1]).text = @"Bar";**
UIScrollView控件详解
最后更新于:2022-04-01 06:59:08
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-01-12_5694d75351447.jpg)
~~~
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view.
// 创建一个滚动视图
self.scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 64, 320, 568-64)];
// 设置代理
self.scrollView.delegate = self;
self.scrollView.backgroundColor = [UIColor redColor];
[self.view addSubview:_scrollView];
/**
* CGPoint contentOffSet 监控目前滚动的位置
* CGSize contentSize 滚动范围大小(主属性)
* UIEdgeInsets contentInset 视图在scrollView中的位置
* BOOL directionalLockEnabled 指定控件是否只能在一个方向上滚动
* BOOL bounces 控制控件遇到边框是否反弹
* BOOL alwaysBounceVertical 控制垂直方向遇到边框是否反弹
* BOOL alwaysBounceHorizontal 控制水平方向遇到边框是否反弹
* BOOL pagingEnabled 控制控件是否整页翻动
* BOOL scrollEnabled 控制控件是否能滚动
* BOOL showsHorizontalScrollIndicator 控制是否显示水平方向的滚动条
* BOOL showsVerticalScrollIndicator 控制是否显示垂直方向的滚动条
* UIEdgeInsets scrollIndicatorInsets 指定滚动条在scrollerView中的位置
* UIScrollViewIndicatorStyle indicatorStyle 设定滚动条的样式
* float decelerationRate 改变scrollerView的减速点位置
* BOOL tracking 监控当前目标是否正在被跟踪
* BOOL dragging 监控当前目标是否正在被拖拽
* BOOL decelerating 监控当前目标是否正在减速
* BOOL delaysContentTouches 控制视图是否延时调用开始滚动的方法
* BOOL canCancelContentTouches 控制控件是否接触取消touch的事件
* float minimumZoomScale 缩放的最小比例
* float maximumZoomScale 缩放的最大比例
* float zoomScale 设置变化比例
* BOOL bouncesZoom 控制缩放的时候是否会反弹
* BOOL zooming 判断控件的大小是否正在改变
* BOOL zoomBouncing 判断是否正在进行缩放反弹
* BOOL scrollsToTop 控制控件滚动到顶部
*/
// 提示用户,在界面创建的时候,水平滚动条或者垂直滚动条会出现一次闪现效果
[self.scrollView flashScrollIndicators];
// 偏移带动画效果
[self.scrollView setContentOffset:CGPointMake(320, 0) animated:YES];
}
#pragma mark UIScrollViewDelegate
// 只要滚动了就会触发
- (void)scrollViewDidScroll:(UIScrollView *)scrollView;
{
}
// 开始拖拽视图
// 当开始滚动视图时,执行该方法。一次有效滑动(开始滑动,滑动一小段距离,只要手指不松开,只算一次滑动),只执行一次。
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView;
{
}
// 滑动视图,当手指离开屏幕那一霎那,调用该方法。一次有效滑动,只执行一次。
// decelerate,指代,当我们手指离开那一瞬后,视图是否还将继续向前滚动(一段距离),经过测试,decelerate=YES
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate;
{
}
// 将开始降速时
- (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView;
{
}
// 滚动视图减速完成,滚动将停止时,调用该方法。一次有效滑动,只执行一次。
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView;
{
}
// 滚动动画停止时执行,代码改变时出发,也就是setContentOffset改变时
// 当滚动视图动画完成后,调用该方法,如果没有动画,那么该方法将不被调用
- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView;
{
}
// 设置放大缩小的视图,要是uiscrollview的subview , 返回将要缩放的UIView对象。要执行多次
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView;
{
return nil;
}
// 当将要开始缩放时,执行该方法。一次有效缩放,就只执行一次。
- (void)scrollViewWillBeginZooming:(UIScrollView *)scrollView withView:(UIView *)view
{
NSLog(@"scrollViewWillBeginZooming");
}
// 当缩放结束后,并且缩放大小回到minimumZoomScale与maximumZoomScale之间后(我们也许会超出缩放范围),调用该方法。
- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(double)scale;
{
}
// 如果你不是完全滚动到滚轴视图的顶部,你可以轻点状态栏,那个可视的滚轴视图会一直滚动到顶部,那是默认行为,你可以通过该方法返回NO来关闭它
- (BOOL)scrollViewShouldScrollToTop:(UIScrollView *)scrollView;
{
return YES;
}
// 已经滑动到顶部
- (void)scrollViewDidScrollToTop:(UIScrollView *)scrollView;
{
}
~~~
UINavigationController详解(四)iOS7新特性
最后更新于:2022-04-01 06:59:05
**@导航栏新不同**
1.控制器视图默认全屏显示,导航栏的不同设置会带来不一样的效果
2.导航栏的颜色设置为新增属性:barTintColor
3.导航栏的属性:tintColor用于设置控件颜色
4.导航栏背景图片不同的size会展示不同的效果
5.导航栏中设置控件的image对象都需要进行渲染设置.默认是渲染为模板,需要渲染为原图才能显示.默认是渲染为模板,需要渲染为原图才能显示
**@导航栏外观**
1.bar的样式 barStyle
2.bar的透明度 translucent
3.bar的颜色 barTintColor
4.bar上控件的颜色 tintColor
5.bar的背景图片 backgroundImage
**@导航栏布局**
1.iOS6和iOS7中,导航栏的布局都是(0,0,320,44)
2.iOS6中,导航栏的背景视图的布局是(0,0,320,44) 和导航栏的布局是一样的
3.iOS7中,导航栏的背景视图的布局是(0,-20,320,64),y轴定位到-20px,高度增加到64px,包含状态栏和导航栏
4.通过设置控制器的 edgesForExtendedLayout 为 UIRectEdgeNone,也可以将控制器视图从导航栏下显示(iOS7新增的属性)
**@导航栏内容(新增)**
1.返回按钮(Back)指示图像 UIImage *backIndicatorImage
self.navigationController.navigationBar setBackIndicatorImage:
2.返回按钮(Back)遮罩图像 UIImage *backIndicatorTransitionMaskImage
[self.navigationController.navigationBar setBackIndicatorTransitionMaskImage:
@UIBarButtonItem
1.初始化变化:
~ - (id)initWithBarButtonSystemItem:(UIBarButtonSystemItem)systemItem target:(id)target action:(SEL)action;
系统提供样式改变
~ - (id)initWithTitle:(NSString *)title style:(UIBarButtonItemStyle)style target:(id)target action:(SEL)action;
style设置为 UIBarButtonItemStylePlain(必须)
~ - (id)initWithImage:(UIImage *)image style:(UIBarButtonItemStyle)style target:(id)target action:(SEL)action;
图像需要进行渲染,因为默认渲染是成模板
- (UIImage *)imageWithRenderingMode:(UIImageRenderingMode)renderingMode NS_AVAILABLE_IOS(7_0);
typedef NS_ENUM(NSInteger, UIImageRenderingMode) {
UIImageRenderingModeAutomatic, // Use the default rendering mode for the context where the image is used
UIImageRenderingModeAlwaysOriginal, // 渲染为原始图片
UIImageRenderingModeAlwaysTemplate, // 渲染为模板
} NS_ENUM_AVAILABLE_IOS(7_0);
UINavigationController详解(三)UIToolBar
最后更新于:2022-04-01 06:59:03
@创建ToolBar
1\. 方法一:自己创建
UIToolbar *toolBar=[[UIToolbar alloc]initWithFrame:CGRectMake(0,568-49,320,49)];
toolBar.barStyle=UIBarStyleBlack; // 不限死,很多类型
[self.view addSubview:toolBar];
2\. 方法二:显示 navigationController 自带的ToolBar
//显示工具栏(没动画效果)
self.navigationController.toolbarHidden =NO;
//显示工具栏(动画效果推出)
[self.navigationController setToolbarHidden:NO animated:YES];
--------------------------------------------------------------------------------------------------------------------------------
self.navigationController.toolbar------->toolbar是 UINavigationController 的一个属性
@给ToolBar上加内容
UIBarButtonItem *addItem=[[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:nil];
UIBarButtonItem *saveItem=[[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemSave target:self action:nil];
UIBarButtonItem *editItem=[[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemEdit target:self action:nil];
NSArray *items=[NSArray arrayWithObjects:addItem,saveItem,editItem,nil];
[self setToolbarItems:items]; //向UIToolBar添加UIBarButtonItem
//为了使按钮与按钮之间有间距 (这2个也属于BarButtonSystemItem)
UIBarButtonSystemItemFlexibleSpace 表示系统给一个合适的宽度
UIBarButtonSystemItemFixedSpace 用户可以自己定义个宽度
// 设置toolBar的背景图片,ios5之后的方法
self.navigationController.toolbarsetBackgroundImage: forToolbarPosition: barMetrics:
UINavigationController详解(二)UINavigationBar(UIBarButtonItem)
最后更新于:2022-04-01 06:59:01
@UINavigationBar-----(是一个View)基本介绍
1.导航栏,和导航控制器一样,是一个容器用来显示提供的其他对象的内容
2.导航栏显示的内容,通过设置UINavigationItem展示,每个controller都有专属的navigationItem
3.导航栏的高度:
iPhone : 竖屏 44 横屏 32
iPad: 44
4.配置外观:背景图片,背景颜色,style等等
代码样例:
~~~
self.navigationController.navigationBar.barStyle = UIBarStyleBlack;
self.navigationController.navigationBar.translucent = NO;
self.navigationController.navigationBar.barTintColor = [UIColor orangeColor];
self.navigationController.navigationBar.tintColor = [UIColor redColor];
[self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"NavBar_64"] forBarMetrics:UIBarMetricsDefault];
~~~
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-01-12_5694d75302b81.jpg)
@UINavigationItem------是一个NSObject(主要按钮UIBarButtonItem)
1.提供navigationBar的显示内容.导航栏是唯一的,每个controller都要设置
2.常用属性:leftBarButtonItem(leftBarButtonItems 组合,用数组存),rightBarButtonItem,backBarButtonItem,title,titleView
3.UIBarButtonItem,navigationBar上显示的按钮,navigationItem上需要设置的,可以使用系统提供的
4.backBarButtonItem是上一级navigationItem控制的
5.*@property**(**nonatomic**,**copy**) **NSString** *prompt; **// Explanatory text to display above the navigation bar buttons.*
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-01-12_5694d7531d166.jpg)
@这里重点介绍下@
UIBarButtonItem 是一个 UIBarItem,是一种专门放在bar上的特殊button,UIBarItem是一个NSObject
// 系统自带的符号
1.UIBarButtonItem *leftButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAction target:self action:@selector(selectLeftAction:)];
UIBarButtonSystemItemAction的风格,这是系统自带的按钮风格,看下图,你不用一个个试验,你也知道想用那个item,如下图:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-01-12_5694d753325f5.png)
// 自定义文字---backBarButtonItem 右边"Back"按钮
2. self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc]initWithTitle:@"返回" style:UIBarButtonItemStyleDone target:nil action:nil];
// 设置所有UINavigationBar上文本的属性
NSDictionary *attributes =@{NSFontAttributeName: [UIFont fontWithName:@"Futura"size:18],
NSForegroundColorAttributeName: [UIColor redColor]};
[[UINavigationBar appearance]setTitleTextAttributes:attributes];
UINavigationController详解(一)
最后更新于:2022-04-01 06:58:59
@UINavigationControlle简介:
1.导航控制器,专门管理具有层级关系内容的导航
2.采用栈的方式管理所有controller,每个controller管理各自的视图
3.推出显示一个新的controller
4.提供返回上一级controller的默认button和方法
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-01-12_5694d75262976.jpg)
@UINavigationControlle结构:
1.它是UIViewController的子类,因此它也由view属性
2.它的view包含3个子视图:navigationBar contentView(不是属性) toolbar
3.导航控制器使用这些对象实现导航界面,我们负责提供这些对象,进行展示,参考下图(苹果官方):
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-01-12_5694d752881d0.jpg)
UINavigationController view层级
@UINavigationControlle的创建:
1.它以栈的方式管理所控制的视图,至少要有一个被管理的UIViewController作为rootViewController
2.导航界面的对象会被同时创建
3.设置delegate,监控导航堆栈的变化,即viewControllers,topController,visibleController等等
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-01-12_5694d752a57e0.jpg)
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-01-12_5694d752c201c.jpg)
代码示例:
~~~
HMTViewController * hmtView = [[HMTViewController alloc]init];
UINavigationController * rootNavigation = [[UINavigationController alloc]initWithRootViewController:hmtView];
NSLog(@"%@",rootNavigation);
self.window.rootViewController = rootNavigation;
~~~
@UINavigationControlle导航方法:
1.推出下一级controller(入栈):
pushViewController:animated:
2.返回上一级controller(出栈):
popViewControllerAnimated: // 返回上一级
popToRootViewControllerAnimated: // 返回根视图(中间无论多少个视图都全部被出栈,没了)
// *@property**(**nonatomic**,**copy**)**NSArray** *viewControllers;**// The current view controller stack.*
// 通过*[**self**.**navigationController**.**viewControllers **objectAtIndex**:**n**] 来选定指定视图*
popToViewController:animated: // 返回指定视图
3.导航控制器提供已有的控件实现返回上一级(即被根视图推出的View都自带一个返回
代码示例:
@这里必须要说一下self.navigationController
// If this view controller has been pushed onto a navigation controller, return it.
~~~
- (void)viewDidLoad
{
[super viewDidLoad];
UIButton *push = [UIButton buttonWithType:UIButtonTypeSystem];
push.frame =CGRectMake(100, 100, 200, 200);
[push setTitle:@"下一页" forState:UIControlStateNormal];
[push addTarget:self action:@selector(pushNextController) forControlEvents:(UIControlEventTouchUpInside)];
[self.view addSubview:push];
// Do any additional setup after loading the view.
}
- (void)pushNextController{
NSLog(@"%@",self.navigationController);
HMTNext2ViewController * hmtNext2 = [[HMTNext2ViewController alloc]init];
[self.navigationController pushViewController:hmtNext2 animated:YES];
}
~~~
UISearchDisplayController 的使用
最后更新于:2022-04-01 06:58:56
@借用一组图,来展示下UISearchDisplayController : 比如:搜索"万通",弹出一个tableView 显示出检索有这2个字的地点
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-01-12_5694d75245ffd.jpg)
@UISearchDisplayController(搜索显示控制器)详解:
1.继承于NSObject,它并不是一个视图控制器,只是一个类,一个工具类
2.提供一个searchBar和一个搜索结果tableView
3.searchBar需要我们自己创建,添加到指点视图,提供给UISearchDisplayController
4.搜索结果tableView由搜索控制器进行搜索后要显示结果的时候创建,我们要制定一个 UIViewController负责显示,并实现它的代理,指定delegate,dataSource(也就是,它会有2 个tableView,一个是需要显示结果的时候才建立-----对应上图第三个,一个是初始化的时 候就已经存在-----对应上图第一个,但都是由同一个UIViewController控制)
5.设置自身代理UISearchDisplayDelegate
@代码举例:(初始化)
~~~
// 1.创建一个UISearchBar,添加在tableView上面
UISearchBar * searchBar = [[UISearchBar alloc]initWithFrame:CGRectMake(0,0, 320, 80)];
searchBar.placeholder = @"国家名";
self.tableView.tableHeaderView = searchBar;
// 2.用创立的searchBar和UIViewController的view初始化出UISearchDisplayController
_searchDC = [[UISearchDisplayController alloc]initWithSearchBar:searchBar contentsController:self];
// 3.设置代理
_searchDC.searchResultsDelegate = self;
_searchDC.searchResultsDataSource = self;
_searchDC.delegate = self;
~~~
@代码举例:(如何区分2个tableView)
~~~
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
// searchResultsTableView属性,will return non-nil. create if requested
if([tableView isEqual:self.searchDC.searchResultsTableView]){
return 1;
};
// tableView == self.tableView
return 1;
}
~~~
@至于如何检索出想要的结果(图示3),执行下面的代理方法后,用数组self.searchResults跟往常基本的UITableView赋值步骤一样,只是多了区分哪个tableView
~~~
现在来实现当搜索文本改变时的回调函数。这个方法使用谓词进行比较,并讲匹配结果赋给searchResults数组:
- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope {
NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"SELF contains[cd] %@",searchText];
self.searchResults = [self.allItems filteredArrayUsingPredicate:resultPredicate];
}
//接下来是UISearchDisplayController的委托方法,负责响应搜索事件:
#pragma mark - UISearchDisplayController delegate methods
-(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString {
[self filterContentForSearchText:searchString scope:[[self.searchDisplayController.searchBar scopeButtonTitles] objectAtIndex:[self.searchDisplayController.searchBar selectedScopeButtonIndex]]];
return YES;
}
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchScope:(NSInteger)searchOption {
[self filterContentForSearchText:[self.searchDisplayController.searchBar text] scope:[[self.searchDisplayController.searchBar scopeButtonTitles] objectAtIndex:searchOption]];
return YES;
}
~~~
@这是网上总结出的3点不足,链接http://blog.sina.com.cn/s/blog_759d3e1201017zsi.html
~~~
3.不足之处
UISearchDisplayController从我使用过程中,感觉到有三点不足。
(1)使用UISearchDisplayController当键盘弹出来的时候,会默认把navagationBar给隐藏起来。如果不需要隐藏navagationBar,最好的处理方式就是重写UISearchDisplayController的-(void)setActive:(BOOL)visible animated:(BOOL)animated方法:
自定义一个类CustomSearchDisplayController,继承自UISearchDisplayController,然后在.m文件中重写该方法,并在该方法中主动显示navagationBar。
@implementation CustomDisplaySearchViewController
- (void)setActive:(BOOL)visible animated:(BOOL)animated {
[super setActive:visible animated:animated];
[self.searchContentsController.navigationController setNavigationBarHidden:NOanimated:NO];
}
@end
(2)UISearchDisplayController的tableView有一个标签,当没有匹配的结果时,默认会在tableView上显示一个“No Result”的标签。如果说想自定义这个标签,可以通过循环遍历出tableView上标签。
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller
shouldReloadTableForSearchString:(NSString *)searchString {
for (UIView* v in self.customDisplaySearch.searchResultsTableView.subviews) {
if ([v isKindOfClass: [UILabel class]] &&
[[(UILabel*)v text] isEqualToString:@"No Results"]) {
UILabel *label = (UILabel *)v;
label.text = @"没有结果";
break;
}
}
return YES;
}
(3)UISearchDisplayController的UISearchBar输入框当无输入时,SearchResultsTableView无法根据个人需求让表展示出来。我尝试过通过点击搜索栏delegate方法中去处理表展示问题,可是尝试失败了。
~~~
UISearchBar详解(二)数据刷选类:NSPredicate
最后更新于:2022-04-01 06:58:54
@假设: NSArray array = [[NSArray alloc]initWithObjects:@"luna",@"moon",@"",@"lion",@"coco", nil];
// 数据的处理主要发生在这个方法中
- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText{
// 方法一:([c]不区分大小写[d]不区分发音符号即没有重音符号[cd]既不区分大小写,也不区分发音符号。)
NSPredicate * predicate = [NSPredicate predicateWithFormat:@"SELF CONTAINS [cd] %@",searchText];
// 数组提供的快速遍历,返回的类型是NSArray
NSLog(@"%@",[ _array filteredArrayUsingPredicate:predicate]);
// 方法二:
for (int i = 0; i count]; i++) {
if ([predicate evaluateWithObject:[ _array objectAtIndex:i]]) {
NSLog(@"%@",[arrayobjectAtIndex:i]);
}
}
}
@详细解释请看下一章:(转载)[NSPredicate详解](http://blog.csdn.net/hmt20130412/article/details/21295079)
UISearchBar详解(一)基本属性
最后更新于:2022-04-01 06:58:52
@UISearchBar search = [[UISearchBar alloc]initWithFrame:CGRectMake(0,44,320,120)];
pragma mark -基本设置
//控件的样式 默认--0白色,1是黑色风格
/*
UIBarStyleDefault = 0,
UIBarStyleBlack = 1,
search.barStyle =UIBarStyleDefault;
/*
UISearchBarStyleDefault,
// currently UISearchBarStyleProminent
UISearchBarStyleProminent, // used my Mail, Messages and Contacts(provides no default background color or image but will display one if customized as such系统提供的颜色和图片无效,自定制有效)
UISearchBarStyleMinimal // used by Calendar, Notes and Music
*/
search.searchBarStyle =UISearchBarStyleDefault;
// 控件上面的显示的文字
search.text =@"HMT";
// 显示在顶部的单行文字,通常作为一个提示行
search.prompt =@"DOTA";
// 半透明的提示文字,输入搜索内容消失
search.placeholder =@"请输入要搜索的词语";
// bar的颜色(具有渐变效果)搜索栏闪动条和选择栏边框,取消按钮和选择栏被选中时候都会变成设置的颜色
search.tintColor = [UIColor redColor];
// 除搜索栏框框,就像贴了一张镂空了搜索栏的颜色贴图,不影响其他任何设置的颜色
search.barTintColor = [UIColor whiteColor];
// 指定控件是否会有透视效果
search.translucent =YES;
// 设置在什么的情况下自动大写
/*
UITextAutocapitalizationTypeNone, //除非自己点击大写,否则永不大写
UITextAutocapitalizationTypeWords, //以单词来区分,每个单词首字母大写
UITextAutocapitalizationTypeSentences, //以句子来区分
UITextAutocapitalizationTypeAllCharacters, //所有字母全部大写
*/
search.autocapitalizationType =UITextAutocapitalizationTypeNone;
// 对于文本对象自动校正风格(额,我也不知道有什么用)
/*
UITextAutocorrectionTypeDefault,
UITextAutocorrectionTypeNo,
UITextAutocorrectionTypeYes,
*/
search.autocorrectionType =UITextAutocorrectionTypeNo;
// 键盘的样式(具体可参考文章UITableView详解(一))
search.keyboardType =UIKeyboardTypeNumberPad;
#pragma mark - 设置搜索栏右边按钮图标(UISearchBarIcon)
// 是否在控件的右端显示一个书的按钮
search.showsBookmarkButton =YES;
// 是否显示cancel按钮(静态)
//search.showsCancelButton = YES;
// 是否显示cancel按钮(带有动画效果)
[search setShowsCancelButton:YES animated:YES];
// 是否在控件的右端显示搜索结果按钮(图形是一个圆里面放着一个向下的箭头)
search.showsSearchResultsButton =YES;
// 搜索结果按钮是否被选中
search.showsSearchResultsButton =YES;
// 设置控件的右端显示搜索结果按钮处 --- 可用图片替换掉
[search setImage:[UIImage imageNamed:@"qiyi.png"]forSearchBarIcon:UISearchBarIconResultsList state:UIControlStateNormal];
#pragma mark - 搜索栏下部选择栏
// 搜索栏下部的选择栏,数组里面的内容是按钮的标题
search.scopeButtonTitles = [NSArray arrayWithObjects:@"iOS",@"Android",@"iPhone",nil];
// 进入界面,搜索栏下部的默认选择栏按钮的索引(也就是第一出现在哪个选择栏)
search.selectedScopeButtonIndex =2;
// 控制搜索栏下部的选择栏是否显示出来(显示的话,就要修改search的frame,不显示的话80就够了)
search.showsScopeBar =YES;
pragma mark - 设置控件图片
// 设置控件背景图片
search.backgroundImage = [UIImage imageNamed:@"qiyi.png"];
// 设置搜索栏下部背景图片
search.scopeBarBackgroundImage = [UIImage imageNamed:@"qiyi.png"];
pragma mark - 协议UISearchBarDelegate
(不解释了,看名字,已经很明显了)
@编辑文本
// UISearchBar得到焦点并开始编辑时,执行该方法
- (BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar; // return NO to not become first responder
- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar{ // called when text starts editing
[searchBar setShowsCancelButton:YES animated:YES]; // 动画显示取消按钮
}
- (BOOL)searchBarShouldEndEditing:(UISearchBar *)searchBar; // return NO to not resign first responder
- (void)searchBarTextDidEndEditing:(UISearchBar *)searchBar; // called when text ends editing
- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText{ // called when text changes (including clear)
@ 当搜索内容变化时,执行该方法。很有用,可以实现时实搜索
}
- (BOOL)searchBar:(UISearchBar *)searchBar shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)textNS_AVAILABLE_IOS(3_0); // called before text changes
@按钮点击
- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar; // called when keyboard search button pressed
- (void)searchBarBookmarkButtonClicked:(UISearchBar *)searchBar; // called when bookmark button pressed
- (void)searchBarCancelButtonClicked:(UISearchBar *) searchBar{ // called when cancel button pressed
[searchBar setShowsCancelButton:NO animated:NO]; // 取消按钮回收
[searchBar resignFirstResponder]; // 取消第一响应值,键盘回收,搜索结束
}
- (void)searchBarResultsListButtonClicked:(UISearchBar *)searchBarNS_AVAILABLE_IOS(3_2);// called when search results button pressed
- (void)searchBar:(UISearchBar *)searchBar selectedScopeButtonIndexDidChange:(NSInteger)selectedScopeNS_AVAILABLE_IOS(3_0);
UITabBarController详解(二)UITabBarController的代理方法以及模态显示
最后更新于:2022-04-01 06:58:49
@首先要实现协议
~~~
//设置代理
tabBarController.delegate =self;
//UINavigationController nav tabBarController.moreNavigationController;
//[nav setNavigationBarHidden:YES animated:YES];
//控制哪些ViewController的标签栏能被点击
-(BOOL)tabBarController:(UITabBarController)tabBarControllershouldSelectViewController:(UIViewController)viewController{
//代表HMT_CViewController这个View无法显示,无法点击到它代表的标签栏
if([viewControllerisKindOfClass:[HMT_CViewControllerclass]]) {
returnNO;
}
returnYES;
}
// 选中哪个标签栏,一个监控作用吧
(void)tabBarController:(UITabBarController *)tabBarControllerdidS electViewController:(UIViewController*)viewController{
}
// More view controller将要开始编辑
(void)tabBarController:(UITabBarController)tabBarControllerwillBe ginCustomizingViewControllers:(NSArray)viewControllers{
}
// More view controller将要结束编辑
(void)tabBarController:(UITabBarController)tabBarControllerwillEn dCustomizingViewControllers:(NSArray)viewControllers changed:(BOOL)changed{
}
// More view controller编辑
(void)tabBarController:(UITabBarController)tabBarControllerdidEnd CustomizingViewControllers:(NSArray)viewControllers changed:(BOOL)changed{
}
#import "HMT-AViewController.h"
#import "HMTModalShowViewController.h"
@interfaceHMT_AViewController ()
@end
@implementation HMT_AViewController
(void)viewDidLoad
{
[superviewDidLoad];
self.view.backgroundColor = [UIColorredColor];
//创建一个按钮
UIButton button = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
button.frame =CGRectMake(100,100,100, 100);
[button addTarget:self action:@selector(modalShow)forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:button];
// Do any additional setup after loading the view.
}
(void)modalShow{
HMTModalShowViewController modalShowVC = [[HMTModalShowViewController alloc]init];
//模态视图控制器呈现出来时候的视觉效果
modalShowVC.modalTransitionStyle =UIModalTransitionStyleCrossDissolve;
/*
UIModalTransitionStyleCoverVertical = 0, //默认,由下往上
UIModalTransitionStyleFlipHorizontal,//水平转动效果
UIModalTransitionStyleCrossDissolve,//渐变效果
UIModalTransitionStylePartialCurl,//书页往上翻动效果
*/
//模态视图控制器呈现方式,默认全屏
modalShowVC.modalPresentationStyle =UIModalPresentationFullScreen;
/*
UIModalPresentationFullScreen = 0,
UIModalPresentationPageSheet,
UIModalPresentationFormSheet,
UIModalPresentationCurrentContext,
UIModalPresentationCustom,
UIModalPresentationNone = -1,
*/
UINavigationController * modalShowNC = [[UINavigationController alloc] initWithRootViewController:modalShowVC];
//推出模态视图控制器
[self presentViewController:modalShowNC animated:YES completion:^{
NSLog(@"hello world");
}];
}
#import "HMTModalShowViewController.h"
@interfaceHMTModalShowViewController ()
@end
@implementation HMTModalShowViewController
(void)viewDidLoad
{
[superviewDidLoad];
// Do any additional setup after loading the view.
self.view.backgroundColor = [UIColor yellowColor];
//利用UINavigationController来实现退出控制器
UIBarButtonItem * barButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(modalDismiss)];
self.navigationItem.leftBarButtonItem = barButton;
self.navigationItem.title =@"humingtao";
//创建一个按钮来实现退出控制器
/*UIButton button = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
button.frame = CGRectMake(100, 100, 100, 100);
[button addTarget:self action:@selector(modalDismiss) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:button];
*/
}
(void)modalDismiss{
//退出模态视图控制器
[self dismissViewControllerAnimated:YES completion:^{
NSLog(@"退出GoodBye");
}];
}
@end
~~~
UITabBarController详解(一)UITabBarController的介绍和设置(偷了点懒,直接用了ARC)
最后更新于:2022-04-01 06:58:47
@首先我们看一下它的view层级图:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-01-12_5694d75209b0b.jpg)
~~~
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.
self.window.backgroundColor = [UIColor whiteColor];
#pragma mark - 设置tabBarItem
#pragma mark 第一个视图ViewController
HMT_AViewController * tabBarViewA = [[HMT_AViewController alloc] init];
// 设置A视图下----标签栏标题文字(可参照微信或者QQ体会)
tabBarViewA.tabBarItem.title = @"微信";
// 设置A视图下----标签栏图片(因为自己没有图片,在这里随便设置了个名字)
//tabBarViewA.tabBarItem.image = [UIImage imageNamed:@"1.png"];
// 设置A视图下----标签栏信息提示(住:badgeValue是NSString类型 如下设置了3,就像QQ消息有3条未接受一样,给人一种提醒)
tabBarViewA.tabBarItem.badgeValue = @"3";
// ios7弃用了----标签栏选中的时候显示一张图片,没选中的时候显示另一张图片
//[tabBarViewA.tabBarItem setFinishedSelectedImage:actionMenu.selectedIcon withFinishedUnselectedImage:actionMenu.icon];
// ios7的方法(自己没有图片,所以代码里面的图片都是一个随便取的名字,没有实用意义)
//tabBarViewA.tabBarItem.selectedImage = actionMenu.selectedIcon;
#pragma mark 第二个视图ViewController
// 第二个视图ViewController
HMT_BViewController * tabBarViewB = [[HMT_BViewController alloc] init];
// 设置B视图下----标签栏
// 用系统提供的标识(可以算等价于图标和文字)进行设置(参数:UITabBarSystemItem是个枚举值,想要什么形式,就去系统提供的API中找)
tabBarViewB.tabBarItem = [[UITabBarItem alloc]initWithTabBarSystemItem:UITabBarSystemItemSearch tag:1];
// 设置B视图下----标签栏信息提示
tabBarViewB.tabBarItem.badgeValue = @"GO";
#pragma mark 第三个视图ViewController
HMT_CViewController * tabBarViewC = [[HMT_CViewController alloc] init];
tabBarViewC.tabBarItem = [[UITabBarItem alloc]initWithTabBarSystemItem:UITabBarSystemItemDownloads tag:2];
// 设置B视图下----标签栏信息提示
tabBarViewC.tabBarItem.badgeValue = @"new";
#pragma mark 第四个视图ViewController
HMT_DViewController * tabBarViewD = [[HMT_DViewController alloc] init];
tabBarViewD.tabBarItem = [[UITabBarItem alloc]initWithTabBarSystemItem:UITabBarSystemItemFavorites tag:3];
// 设置B视图下----标签栏信息提示
tabBarViewD.tabBarItem.badgeValue = @"99";
#pragma mark 第五个视图ViewController
HMT_EViewController * tabBarViewE = [[HMT_EViewController alloc] init];
tabBarViewE.tabBarItem = [[UITabBarItem alloc]initWithTabBarSystemItem:UITabBarSystemItemHistory tag:4];
// 设置B视图下----标签栏信息提示
tabBarViewE.tabBarItem.badgeValue = @"sky";
#pragma mark 第六个视图ViewController(系统默认能显示的最大视图个数是5个)
/* 如果你的viewControllers属性添加了多于五个的items,那tab bar controller将会自动插入一个特殊的view controller,
称为 More view controller,该 controller 将会负责管理多于的items,这个More view controller提供一个自定义的界面,
用table的方式呈现多余的view controller,并且view controller的数量是不限制的*/
HMT_FViewController * tabBarViewF = [[HMT_FViewController alloc] init];
tabBarViewF.tabBarItem = [[UITabBarItem alloc]initWithTabBarSystemItem:UITabBarSystemItemContacts tag:5];
// 设置F视图下----标签栏信息提示
tabBarViewF.tabBarItem.badgeValue = @"AG";
#pragma mark - 设置TabBarController
// 创建TabBarController
UITabBarController * tabBarController = [[UITabBarController alloc]init];
// TabBarController默认是放在最底部的,如果你想调整位置,可以进行下面2部操作(44是iPhone中TabBarController和UINavigationController标准高度)
//CGRect frame = CGRectMake(0, 20, 320, 44);
//tabBarController.tabBar.frame = frame;
// 每一个tab都必须有一个content view controller------->viewControllers属性,用来存入一个应用的TabBarController有多少个界面切换
tabBarController.viewControllers = [NSArray arrayWithObjects:tabBarViewA,tabBarViewB,tabBarViewC,tabBarViewD,tabBarViewE,tabBarViewF, nil];
// 设置着色
tabBarController.tabBar.tintColor = [UIColor greenColor];
// 设置选中图片时候
tabBarController.tabBar.selectedImageTintColor = [UIColor brownColor];
// 设置背景图片(自己没有图片,不进行设置)
//tabBarController.tabBar.backgroundImage = [UIImage imageNamed:@"@@@@@"];
// 设置程序启动时默认的ViewController视图(设置为3,一共5个ViewController,进来时候显示的视图就是第4个-tabBarViewD,下标从0开始)
tabBarController.selectedIndex = 3;
self.window.rootViewController = tabBarController;
[self.window makeKeyAndVisible];
return YES;
}
~~~
@最后效果如下图:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-01-12_5694d7522d20e.jpg)