最近总结的工作中遇到的小问题在这里共享 ,希望对大家能有帮助
1.横屏的一个应用在修改个人资料过程从相册取图片或者拍照的过程中,横纵屏切换引起再次进入程序时应用变纵屏的bug
--------------主页面控制器中点击进入个人资料页面的地方:----------------------
- (
void
)changepersonIcon{
UIActionSheet*actionSheet = [[UIActionSheetalloc]
initWithTitle
:
@"
选择封面图片
"
delegate
:
self
cancelButtonTitle
:
@"
取消
"
destructiveButtonTitle
:
nil
otherButtonTitles:@"
相机
"
,
@"
相册
"
,
nil
];
actionSheet.
actionSheetStyle
=
UIActionSheetStyleDefault
;
[actionSheet
showInView
:
self
.
view
];
}
-(
void
) actionSheet:(
UIActionSheet
*)actionSheet clickedButtonAtIndex:(
NSInteger
)buttonIndex{
if
( buttonIndex ==
0
) {
NSLog
(
@"
相机
"
);
[selfsetShuping];
//设置纵屏
[
self
selectCamera
];
}
else
if
( buttonIndex ==
1
){
NSLog(@"
照片
"
);
[selfsetShuping];//设置纵屏
[
self
selectPhotos
];
}
else
{
NSLog
(
@"
取消了啊啊
"
);
}
}
//设置纵屏去记录 把屏幕状态存储下来,在视图将要出现的时候移除记录的状态
-(
void
) setShuping{
[
self
saveValue
:
@"hengping"
WithKey
:
@"hengping"
];}
-(
void
) saveValue:(
NSObject
*) value WithKey:(
NSString
*) key {
NSUserDefaults
* def = [
NSUserDefaults
standardUserDefaults
];
[def
setObject
:value
forKey
:key];
[def
synchronize
];
}
//
从相机中选
-(
void
)selectCamera{
if
([
UIImagePickerController
isSourceTypeAvailable
:
UIImagePickerControllerSourceTypeCamera
]) {
UIImagePickerController
*image = [[
UIImagePickerController
alloc
]
init
];
image.
delegate
=
self
;
image.
allowsEditing
=
YES
;
image.
sourceType
=
UIImagePickerControllerSourceTypeCamera
;
[
self
dismissViewControllerAnimated
:
YES
completion
:
nil
];
[
self
presentViewController
:image
animated
:
YES
completion
:^{}];
}
else
{
NSLog
(
@"
请确定相机是否能正常打开
"
);
}
}
//
从相册中选择
-(
void
)selectPhotos{
if
([
DkUIImagePickerController
isSourceTypeAvailable
:
UIImagePickerControllerSourceTypePhotoLibrary
]) {
UIImagePickerControllerSourceType
sourceType =
UIImagePickerControllerSourceTypePhotoLibrary
;
sourceType =
UIImagePickerControllerSourceTypeSavedPhotosAlbum
;
//
保存的相片
DkUIImagePickerController
*picker = [[
DkUIImagePickerController
alloc
]
init
];
picker.
delegate
=
self
;
picker.
allowsEditing
=
YES
;
//
是否允许编辑
picker.
sourceType
= sourceType;
[
self
dismissViewControllerAnimated
:
YES
completion
:^{
}];
[
self
presentViewController
:picker
animated
:
YES
completion
:
nil
];
}
else
{
}
}
-(
void
) pickerView:(
UIPickerView
*)pickerView didSelectRow:(
NSInteger
)row inComponent:(
NSInteger
)component{
NSLog
(
@"
选择了照片
"
);
}
-(
void
) imagePickerController:(
UIImagePickerController
*)picker didFinishPickingMediaWithInfo:(
NSDictionary
*)info{
UIImage
*img = info[
UIImagePickerControllerEditedImage
];
UIImage
*newImage = [
self
imageCompressForWidth
:img
targetWidth
:
ScreenWidth
];
self
.
informationView
.
PersonIconimage
= newImage;
[
self
.
informationView
refresh
];
[picker
dismissViewControllerAnimated
:
YES
completion
:
nil
];
self
.
informationView
.
PickBgView
.
hidden
=
YES
;
}
-(
void
) imagePickerControllerDidCancel:(
UIImagePickerController
*)picker{
[picker
dismissViewControllerAnimated
:
YES
completion
:^{
}];
NSLog
(
@"
取消
"
);
}
- (
void
)touchesEnded:(
NSSet
*)touches withEvent:(
UIEvent
*)event {
[
self
.
view
endEditing
:
YES
];
}
//在视图将要出现的时候移除存储的状态
-(
void
)viewWillAppear:(
BOOL
)animated{
NSUserDefaults
* def = [
NSUserDefaults
standardUserDefaults
];
[def
removeObjectForKey
:
@"hengping"
];
}
------------在自定义的相册控制器中:----------------
@interface
DkUIImagePickerController
()<
UIImagePickerControllerDelegate
>
@end
@implementation
DkUIImagePickerController
///
指定
UIImagePickerController
只支持横屏方向
- (
NSUInteger
)supportedInterfaceOrientations {
return
UIInterfaceOrientationMaskLandscape
;
}
//
设置状态栏的状态
-(
UIStatusBarStyle
) preferredStatusBarStyle{
return
UIStatusBarStyleLightContent
;
}
-(
BOOL
) shouldAutorotate{
return
YES
;
}
-(
NSUInteger
)application:(
UIApplication
*)application supportedInterfaceOrientationsForWindow:(
UIWindow
*)window
{
NSString
* strSubClass = [
NSString
stringWithUTF8String
:
object_getClassName
(window.
rootViewController
.
presentedViewController
)];
if
([
@"ImgTakeViewController"
isEqualToString
:strSubClass]) {
return
UIInterfaceOrientationMaskAll
;
}
return
[application
supportedInterfaceOrientationsForWindow
:window];
}
-(
BOOL
) prefersStatusBarHidden{
return
YES
;
}
-----------------------------------在appDelegate中---------------------------------
//窗口支持的屏幕方向
-(
UIInterfaceOrientationMask
) application:(
UIApplication
*)application supportedInterfaceOrientationsForWindow:(
UIWindow
*)window{
if ( ![selfloadInfoWithKey:@"hengping"] ) {
NSLog(@"
横着的
”
);//如果不是横屏的时候返回横屏
return
UIInterfaceOrientationMaskLandscape
;
}else{
NSLog(@"
所有方向
”
);//否则返回所有方向
return
UIInterfaceOrientationMaskAll
;
}
}
//存储的方向的key
-(
NSString
*) loadInfoWithKey:(
NSString
*) key {
NSUserDefaults
* def = [
NSUserDefaults
standardUserDefaults
];
return
[def
objectForKey
:key];
}
2.不同类型设备下的适配
/**
* 判断iPhone4
*/
#define IPHONE4 ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(640, 960), [[UIScreen mainScreen] currentMode].size) : NO)
/**
* 判断iPhone5
*/
#define IPHONE5 ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(640, 1136), [[UIScreen mainScreen] currentMode].size) : NO)
/**
* 判断iPhone6
*/
#define IPHONE6 ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(750, 1334), [[UIScreen mainScreen] currentMode].size) : NO)
/**
* 判断iPhone6+
*/
#define IPHONE6PLUS ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(1242, 2208), [[UIScreen mainScreen] currentMode].size) : NO)
3.iOS中UIWebView字体大小、字体颜色、背景色
在webView的delegate回调方法-webViewDidFinishLoad:(UIWebView*)webView中设置
//
用
webView
的代理方法设置
webView
的字体大小
颜色
页面背景色
- (
void
)webViewDidFinishLoad:(
UIWebView
*)webView{
//
字体大小
[webView
stringByEvaluatingJavaScriptFromString
:
@"document.getElementsByTagName('body')[0].style.webkitTextSizeAdjust= '70%'"
];
//
字体颜色
[webView
stringByEvaluatingJavaScriptFromString
:
@"document.getElementsByTagName('body')[0].style.webkitTextFillColor= 'white'"
];
//
页面背景色
[webView
stringByEvaluatingJavaScriptFromString
:
@"document.getElementsByTagName('body')[0].style.background='#2E2E2E'"
];
}
self.myWebView.delegate = self;
self.myWebView.opaque = NO;//不设置这个值 页面背景始终是白色
self.myWebView.backgroundColor = [UIColor clearColor];
self.myWebView.scalesPageToFit = NO; //禁止用户缩放页面
self.myWebView.dataDetectorTypes = UIDataDetectorTypePhoneNumber|UIDataDetectorTypeLink;
self.myWebView.scrollView.pagingEnabled = YES;
self.myWebView.scrollView.contentInset = UIEdgeInsetsMake(0, 0,0, 0);
self.myWebView.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;
[self.view addSubview:self.myWebView];
4.OC中检测对象类型的方法
Objective-C中如何检验对象类型?
需要检测对象是否是NSString或UIImageView类型。我怎样才能完成?有没有“isoftype”函数类型?
如果对象是myObject,并且想要检测它是否是NSString, 那么代码应该是这样
[myObject isKindOfClass:[NSString class]]
如果想检测 myObject是不是UIImageView,用如下代码:
[myObject isKindOfClass:[UIImageView class]]
这是NSObject的一个功能
想要更多信息,检查NSObject文档
这样使用:
BOOL test = [self isKindOfClass:[SomeClass class]];
你也许还可以尝试这个:
for(id element in myArray)
{
NSLog(@"=======================================");
NSLog(@"Is of type: %@", [element className]);
NSLog(@"Is of type NSString?: %@", ([[element className] isMemberOfClass:[NSString class]])? @"Yes" : @"No");
NSLog(@"Is a kind of NSString: %@", ([[element classForCoder] isSubclassOfClass:[NSString class]])? @"Yes" : @"No");
}
5.UUID和UDID的区别
UUID(Universally Unique IDentifier)是基于iOS设备上面某个单个的应用程序,只要用户没有完全删除应用程序,则这个UUID在用户使用该应用程序的时候一直保持不变。如果用户删除了这个应用程序,然后再重新安装,那么这个UUID已经发生了改变。通过调用[[UIDevice currentDevice] identifierForVendor];方法可以获取UUID。UUID不好的地方就是用户删除了你开发的程序以后,基本上你就不可能获取之前的数据了。
iOS中获取UUID的代码如下:
-(NSString*) uuid {
CFUUIDRef puuid = CFUUIDCreate( nil );
CFStringRef uuidString = CFUUIDCreateString( nil, puuid );
NSString * result = (NSString *)CFStringCreateCopy( NULL, uuidString);
CFRelease(puuid);
CFRelease(uuidString);
return [result autorelease];
}
UDID(Unique Device Identifier)是一串由40位16进制数组成的字符串,用以标识唯一的设备,现在想通过代码获取是不可能的了,如果你想看看你设备的UDID,可以通过iTunes来查看。苹果从iOS5开始就移除了通过代码访问UDID的权限,所以想知道用户设备的UDID,是不行的
ios5 sdk中的获取方法:
[UIDevice currentDevice] uniqueIdentifier]
uniqueIdentifier在UIDevice.h中的定义如下:
@property(nonatomic,readonly,retain) NSString *uniqueIdentifier __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_NA,__MAC_NA,__IPHONE_2_0,__IPHONE_5_0); // a string unique to each device based on various hardware info.
那么有没有另外的办法来获取用户设备的唯一标识符呢?答案是有的,当然这样的标识符不是苹果隐藏的UDID了,使用
OpenUDID开源代码,这个代码通过一些特殊的算法,创建了每一个设备的唯一标识符,你可以拿过来用来识别设备了。
6.解决应用在横屏情况下调用相册崩溃的问题
我们的项目是只支持横屏,在调用相册的时候,程序直接 crash 了,这是让我没有想到的,错误原因是
Supported orientations has no common orientation with the application, and [PUUIAlbumListViewController shouldAutorotate] is returning YES
在网上查阅到的解决办法大都是该 UIImagePickerViewController 添加一个类别,重写它的设备方向的方法
在项目里有运用到 单例类,就想说我是不是能给单例类一个标识,用来标识是否在调用相册,最后的结果是这样的
实验的结果自然是成功的,切回当前程序的时候,旋转屏幕,并没有发生 UI 离开位置的情况,但使用过程中,还有一个地方不是很好,就是调用相册的时候,相册显示是以竖屏的状态呈现的,用户在使用的时候要先旋转屏幕到竖屏,切回程序的时候又要旋转回横屏,使用起来不是很舒服,最后想到的解决办法是给 UIImagePickerController 指定支持的方向为 横屏方向
总结了一下,每次调用一个 视图控制器 的时候,都会调用指定支持屏幕的方法 - (UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window 同时在一个视图控制器显示的时候,会调用自己的 支持屏幕方向 supportedInterfaceOrientations 的方法,所以才能在 UIImagePickerController 显示的时候通过指定支持方向来改变 其在用户面前展现的方向。
7.屏幕旋转的一些方法
shouldAutorotateToInterfaceOrientation 不触发或者不执行的问题 及旋转过程中各方法的作用
要翻转的时候,首先响应的方法:
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
return YES则支持翻转,NO则不支持
紧接着
被调用。这个方法是发生在翻转开始之前。一般用来禁用某些控件或者停止某些正在进行的活动,比如停止视频播放。
-(
void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
这个方法发生在翻转的过程中,一般用来定制翻转后各个控件的位置、大小等。
-(
void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
可以用另外两个方法来代替:willAnimateFirstHalfOfRo
tationToInterfaceOrienta
tion:duration:
和
willAnimateSecondHalfOfR
otationFromInterfaceOrie
ntation:duration:
最后调用的是:
这个方
法发生在整个翻转完成之后。一般用来重新启用某些控件或者继续翻转之前被暂停的活动,比如继续视频播放。
- (
void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
8.PresentViewController切换界面
视图切换,没有NavigationController的情况下,一般会使用presentViewController来切换视图并携带切换时的动画,
其中切换方法如下:
– presentViewController:animated:completion: 弹出,出现一个新视图 可以带动画效果,完成后可以做相应的执行函数经常为nil
– dismissViewControllerAnimated:completion:退出一个新视图 可以带动画效果,完成后可以做相应的执行函数经常为nil
切换动画在压入一个新视图和弹出顶层视图均可以使用,下面只以压入视图为例。
presentModalViewController:animated:completion:
使用系统自带四种动画
简单的实现方式:
[page2Controller setModalTransitionStyle:UIModalTransitionStyleFlipHorizontal];
[self presentModalViewController:myNextViewController animated:YES completion:nil];
系统支持的四种动画:
typedef enum
{
UIModalTransitionStyleCoverVertical=0, //默认方式,竖向上推
UIModalTransitionStyleFlipHorizontal, //水平反转
UIModalTransitionStyleCrossDissolve,//隐出隐现
UIModalTransitionStylePartialCurl,//部分翻页效果
} UIModalTransitionStyle;
presentModalViewController:animated:completion: 不用自带的四种动画效果
实现全翻页效果:
CATransition *animation = [CATransition animation];
animation.duration = 1.0;
animation.timingFunction = UIViewAnimationCurveEaseInOut;
animation.type = @"pageCurl";
//animation.type = kCATransitionPush;
animation.subtype = kCATransitionFromLeft;
[self.view.window.layer addAnimation:animation forKey:nil];
[self presentModalViewController:myNextViewController animated:NO completion:nil];
常見的轉換類型(type):
kCATransitionFade //淡出
kCATransitionMoveIn //覆盖原图
kCATransitionPush //推出
kCATransitionReveal //底部显出来
SubType:
kCATransitionFromRight
kCATransitionFromLeft // 默认值
kCATransitionFromTop
kCATransitionFromBottom
设置其他动画类型的方法(type):
pageCurl 向上翻一页
pageUnCurl 向下翻一页
rippleEffect 滴水效果
suckEffect 收缩效果,如一块布被抽走
cube 立方体效果
oglFlip 上下翻转效果
9.如何在Label中显示图片
UIImage *image = [UIImage imageNamed:@"321.jpg"];
// 1> 生成文本附件
NSTextAttachment *textAttach = [[NSTextAttachment alloc] init];
textAttach.image = image;
// 2> 使用文本附件创建属性文本
NSAttributedString *strA = [NSAttributedString attributedStringWithAttachment:textAttach];
self.label.attributedText = strA;
所有人都知道label.Text 但应该不是全都知道label.attributedText
10. float小数四舍五入
- #import "ViewController.h"
-
- @interface ViewController ()
-
- @end
-
- @implementation ViewController
-
- - (void)viewDidLoad
- {
- [super viewDidLoad];
- NSLog(@"----%@---",[self decimalwithFormat:@"0.0000" floatV:0.334]);
- NSLog(@"----%@---",[self decimalwithFormat:@"0.0000" floatV:0.334569]);
- NSLog(@"----%@---",[self decimalwithFormat:@"0.0000" floatV:0.334519]);
- }
-
- - (void)didReceiveMemoryWarning
- {
- [super didReceiveMemoryWarning];
- // Dispose of any resources that can be recreated.
- }
-
- //格式话小数 四舍五入类型
- - (NSString *) decimalwithFormat:(NSString *)format floatV:(float)floatV
- {
- NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
-
- [numberFormatter setPositiveFormat:format];
-
- return [numberFormatter stringFromNumber:[NSNumber numberWithFloat:floatV]];
- }
- @end
- 最后控制台打印结果:
- 2014-03-19 15:44:45.262 TestNumberFormatter[3056:60b] ----0.3340---
- 2014-03-19 15:44:45.263 TestNumberFormatter[3056:60b] ----0.3346---
- 2014-03-19 15:44:45.263 TestNumberFormatter[3056:60b] ----0.3345---