Summary of years of iOS development experience (2)
1. Setting UILabel row spacing
NSMutableAttributedString* attrString = [[NSMutableAttributedString alloc] initWithString:label.text];
NSMutableParagraphStyle *style = [[NSMutableParagraphStyle alloc] init];
[style setLineSpacing:20];
[attrString addAttribute:NSParagraphStyleAttributeName value:style range:NSMakeRange(0, label.text.length)];
label.attributedText = attrString;
// Or using xib, look at the gif diagram
2. When using the - performSelector:withObject:withObject:afterDelay: method, you need to pass in a multi-parameter problem
// Method 1
// Put the parameters into an array/dictionary, pass them directly as a parameter, and parse the array/dictionary where the specific method is implemented.
NSArray * array =
[NSArray arrayWithObjects: @"first", @"second", nil];
[self performSelector:@selector(fooFirstInput:) withObject: array afterDelay:15.0];
// Method 2
// Using NSInvocation
SEL aSelector = NSSelectorFromString(@"doSoming:argument2:");
NSInteger argument1 = 10;
NSString *argument2 = @"argument2";
if([self respondsToSelector:aSelector]) {
NSInvocation *inv = [NSInvocation invocationWithMethodSignature:[self methodSignatureForSelector:aSelector]];
[inv setSelector:aSelector];
[inv setTarget:self];
[inv setArgument:&(argument1) atIndex:2];
[inv setArgument:&(argument2) atIndex:3];
[inv performSelector:@selector(invoke) withObject:nil afterDelay:15.0];
}
3. UILabel Displays Different Color Fonts
NSMutableAttributedString * string = [[NSMutableAttributedString alloc] initWithString:label.text];
[string addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:NSMakeRange(0,5)];
[string addAttribute:NSForegroundColorAttributeName value:[UIColor greenColor] range:NSMakeRange(5,6)];
[string addAttribute:NSForegroundColorAttributeName value:[UIColor blueColor] range:NSMakeRange(11,5)];
label.attributedText = string;
4. Compare two CGRect/CGSize/CGPoint
if (CGRectEqualToRect(rect1, rect2)) { // Two regions are equal
// do some
}
if (CGPointEqualToPoint(point1, point2)) { // Two points are equal
// do some
}
if (CGSizeEqualToSize(size1, size2)) { // Two size Equal
// do some
}
5. Compare how many hours the difference between the two NSDate s is
NSDate* date1 = someDate;
NSDate* date2 = someOtherDate;
NSTimeInterval distanceBetweenDates = [date1 timeIntervalSinceDate:date2];
double secondsInAnHour = 3600;
// Divided by 3600 is the number of minutes in which seconds are changed into hours, divided by 60 and the result is different.
NSInteger hoursBetweenDates = distanceBetweenDates / secondsInAnHour;
6. Increase the spacing between cell s
// Method 1: Each partition displays only one row of cell s with the partition header as the desired spacing (note that indexPath.section rather than indexPath. row is needed to extract values from the array of data sources)
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return yourArry.count;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return 1;
}
-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
return cellSpacingHeight;
}
// Second, add a slightly lower view to the cell's contentView, and put the original content on your view instead of contentView, which can forge a distance.
// Method 3: Customize cell and rewrite setFrame: Method
- (void)setFrame:(CGRect)frame
{
frame.size.height -= 20;
[super setFrame:frame];
}
7. Play successive pictures
// Now there are three pictures added: animate_1, animate_2 and animate_3.
// Method 1
imageView.animationImages = @[[UIImage imageNamed:@"animate_1"], [UIImage imageNamed:@"animate_2"], [UIImage imageNamed:@"animate_3"]];
imageView.animationDuration = 1.0;
// Method 2
imageView.image = [UIImage animatedImageNamed:@"animate_" duration:1.0];
// Explained in Method 2, this method loads animate_as the prefix, followed by 0-1024, that is, animate_0, animate_1 to animate_1024.
8. Loading gif pictures
Recommended use of this framework FLAnimatedImage
9. Prevent off-screen rendering from adding rounded corners to image
// image classification
- (UIImage *)circleImage
{
// NO stands for transparency
UIGraphicsBeginImageContextWithOptions(self.size, NO, 1);
// Get context
CGContextRef ctx = UIGraphicsGetCurrentContext();
// Add a circle
CGRect rect = CGRectMake(0, 0, self.size.width, self.size.height);
// Square to circle
CGContextAddEllipseInRect(ctx, rect);
// Tailoring
CGContextClip(ctx);
// Draw the picture on it.
[self drawInRect:rect];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}
10. View all fonts in the system
// print font
for (id familyName in [UIFont familyNames]) {
NSLog(@"%@", familyName);
for (id fontName in [UIFont fontNamesForFamilyName:familyName]) NSLog(@" %@", fontName);
}
// You can also visit this website at http://iosfonts.com./
11. Getting Random Numbers
NSInteger i = arc4random();
12. Get the decimal number of random numbers (between 0 and 1)
#define ARC4RANDOM_MAX 0x100000000
double val = ((double)arc4random() / ARC4RANDOM_MAX);
13. AVPlayer Video Play Completed Notification Monitor
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(videoPlayEnd)
name:AVPlayerItemDidPlayToEndTimeNotification
object:nil];
14. Judging whether two rect s intersect
if (CGRectIntersectsRect(rect1, rect2)) {
}
15. Determine whether a string is a number
NSCharacterSet *notDigits = [[NSCharacterSet decimalDigitCharacterSet] invertedSet];
if ([str rangeOfCharacterFromSet:notDigits].location == NSNotFound)
{
// It's numbers.
} else
{
// Not numbers
}
16. Save a view in pdf format
- (void)createPDFfromUIView:(UIView*)aView saveToDocumentsWithFileName:(NSString*)aFilename
{
NSMutableData *pdfData = [NSMutableData data];
UIGraphicsBeginPDFContextToData(pdfData, aView.bounds, nil);
UIGraphicsBeginPDFPage();
CGContextRef pdfContext = UIGraphicsGetCurrentContext();
[aView.layer renderInContext:pdfContext];
UIGraphicsEndPDFContext();
NSArray* documentDirectories = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES);
NSString* documentDirectory = [documentDirectories objectAtIndex:0];
NSString* documentDirectoryFilename = [documentDirectory stringByAppendingPathComponent:aFilename];
[pdfData writeToFile:documentDirectoryFilename atomically:YES];
NSLog(@"documentDirectoryFileName: %@",documentDirectoryFilename);
}
17. Let a view be in the parent view center
child.center = [parent convertPoint:parent.center fromView:parent.superview];
18. Get the previous controller under the current navigation controller
- (UIViewController *)backViewController
{
NSInteger myIndex = [self.navigationController.viewControllers indexOfObject:self];
if ( myIndex != 0 && myIndex != NSNotFound ) {
return [self.navigationController.viewControllers objectAtIndex:myIndex-1];
} else {
return nil;
}
}
19. Save UIImage locally
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *filePath = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"Image.png"];
[UIImagePNGRepresentation(image) writeToFile:filePath atomically:YES];
20. Add toolbars above the keyboard
UIToolbar *keyboardDoneButtonView = [[UIToolbar alloc] init];
[keyboardDoneButtonView sizeToFit];
UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithTitle:@"Done"
style:UIBarButtonItemStyleBordered target:self
action:@selector(doneClicked:)];
[keyboardDoneButtonView setItems:[NSArray arrayWithObjects:doneButton, nil]];
txtField.inputAccessoryView = keyboardDoneButtonView;
21. copy a view
Because UIView does not implement the copy protocol, it cannot find the copyWithZone method, which crashes when copying is used.
But we can do copy by archiving and then archiving, which is equivalent to a deep copy of the view. The code is as follows
id copyOfView =
[NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:originalView]];
22. Draw text on image and generate new images
UIFont *font = [UIFont boldSystemFontOfSize:12];
UIGraphicsBeginImageContext(image.size);
[image drawInRect:CGRectMake(0,0,image.size.width,image.size.height)];
CGRect rect = CGRectMake(point.x, point.y, image.size.width, image.size.height);
[[UIColor whiteColor] set];
[text drawInRect:CGRectIntegral(rect) withFont:font];
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
23. Determine whether a view is a subview of another view
// If myView is self.view itself, yes will also be returned.
BOOL isSubView = [myView isDescendantOfView:self.view];
24. Determine whether a string contains another string
// Method 1. This method is only applicable after iOS 8, if it is used before iOS 8.
if ([str containsString:otherStr]) NSLog(@"Contain");
// Method 2
NSRange range = [str rangeOfString:otherStr];
if (range.location != NSNotFound) NSLog(@"Contain");
25. UICollectionView automatically scrolls to a line
// Rewriting viewDidLayoutSubviews Method
-(void)viewDidLayoutSubviews {
[super viewDidLayoutSubviews];
[self.collectionView scrollToItemAtIndexPath:indexPath atScrollPosition:UICollectionViewScrollPositionCenteredVertically animated:NO];
}
26. Modify UIAlert Controller
// But it is said that this method will be rejected by App Store. )
UIAlertController *alertVC = [UIAlertController alertControllerWithTitle:@"" message:@"" preferredStyle:UIAlertControllerStyleActionSheet];
NSMutableAttributedString *hogan = [[NSMutableAttributedString alloc] initWithString:@"I'm a big text."];
[hogan addAttribute:NSFontAttributeName
value:[UIFont systemFontOfSize:30]
range:NSMakeRange(4, 1)];
[hogan addAttribute:NSForegroundColorAttributeName
value:[UIColor redColor]
range:NSMakeRange(4, 1)];
[alertVC setValue:hogan forKey:@"attributedTitle"];
UIAlertAction *button = [UIAlertAction actionWithTitle:@"Label text" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action){ }];
UIImage *accessoryImage = [UIImage imageNamed:@"1"];
[button setValue:accessoryImage forKey:@"image"];
[alertVC addAction:button];
[self presentViewController:alertVC animated:YES completion:nil];
27. Determine whether the cell of a row has been displayed
CGRect cellRect = [tableView rectForRowAtIndexPath:indexPath];
BOOL completelyVisible = CGRectContainsRect(tableView.bounds, cellRect);
28. Let the navigation controller pop back to the specified controller
NSMutableArray *allViewControllers = [NSMutableArray arrayWithArray:[self.navigationController viewControllers]];
for (UIViewController *aViewController in allViewControllers) {
if ([aViewController isKindOfClass:[RequiredViewController class]]) {
[self.navigationController popToViewController:aViewController animated:NO];
}
}
29. Modify the text on label by animation
// Method 1
CATransition *animation = [CATransition animation];
animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
animation.type = kCATransitionFade;
animation.duration = 0.75;
[self.label.layer addAnimation:animation forKey:@"kCATransitionFade"];
self.label.text = @"New";
// Method 2
[UIView transitionWithView:self.label
duration:0.25f
options:UIViewAnimationOptionTransitionCrossDissolve
animations:^{
self.label.text = @"Well done!";
} completion:nil];
// Method 3
[UIView animateWithDuration:1.0
animations:^{
self.label.alpha = 0.0f;
self.label.text = @"newText";
self.label.alpha = 1.0f;
}];
30. Determine whether a dictionary contains a key value
if ([dic objectForKey:@"yourKey"]) {
NSLog(@"There is this value.");
} else {
NSLog(@"There is no such value.");
}
31. Getting the orientation of the screen
UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation;
if(orientation == 0) //Default orientation
//default
else if(orientation == UIInterfaceOrientationPortrait)
//Vertical screen
else if(orientation == UIInterfaceOrientationLandscapeLeft)
// Left horizontal screen
else if(orientation == UIInterfaceOrientationLandscapeRight)
//Right horizontal screen
32. Setting the Transparency of UIImage
// Method 1. Adding UIImage Classification
- (UIImage *)imageByApplyingAlpha:(CGFloat) alpha {
UIGraphicsBeginImageContextWithOptions(self.size, NO, 0.0f);
CGContextRef ctx = UIGraphicsGetCurrentContext();
CGRect area = CGRectMake(0, 0, self.size.width, self.size.height);
CGContextScaleCTM(ctx, 1, -1);
CGContextTranslateCTM(ctx, 0, -area.size.height);
CGContextSetBlendMode(ctx, kCGBlendModeMultiply);
CGContextSetAlpha(ctx, alpha);
CGContextDrawImage(ctx, area, self.CGImage);
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;
}
// Method 2. If there is no need for exotic flowers, simply use UI Image View to set transparency.
UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageWithName:@"yourImage"]];
imageView.alpha = 0.5;
33,Attempt to mutate immutable object with insertString:atIndex:
This error is because when you call insertString:atIndex: method with a string, the calling object is not NSMutableString and should be converted to this type before calling it.
34. UIWebView Add Click Gesture Not Responsive
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(webViewClick)];
tap.delegate = self;
[_webView addGestureRecognizer:tap];
// Because webView itself has a single-click gesture, adding it will cause gesture conflicts and will not respond. Need to bind gesture agents and implement the following proxy method
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{
return YES;
}
35. Acquiring RAM Capacity of Mobile Phone
// Need to import #import <mach/mach.h>
mach_port_t host_port;
mach_msg_type_number_t host_size;
vm_size_t pagesize;
host_port = mach_host_self();
host_size = sizeof(vm_statistics_data_t) / sizeof(integer_t);
host_page_size(host_port, &pagesize);
vm_statistics_data_t vm_stat;
if (host_statistics(host_port, HOST_VM_INFO, (host_info_t)&vm_stat, &host_size) != KERN_SUCCESS) {
NSLog(@"Failed to fetch vm statistics");
}
/* Stats in bytes */
natural_t mem_used = (vm_stat.active_count +
vm_stat.inactive_count +
vm_stat.wire_count) * pagesize;
natural_t mem_free = vm_stat.free_count * pagesize;
natural_t mem_total = mem_used + mem_free;
NSLog(@"Already used: %u available: %u In total: %u", mem_used, mem_free, mem_total);
36. The actual distance between two points on a map
// Need to import # import < CoreLocation / CoreLocation. H >
CLLocation *locA = [[CLLocation alloc] initWithLatitude:34 longitude:113];
CLLocation *locB = [[CLLocation alloc] initWithLatitude:31.05 longitude:121.76];
// The unit calculated by CLLocation Distance is meters.
CLLocationDistance distance = [locA distanceFromLocation:locB];
37. Open a set interface in an application
// Open Settings - > Universal
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"prefs:root=General"]];
// Here's how to set up other interfaces
prefs:root=General&path=About
prefs:root=General&path=ACCESSIBILITY
prefs:root=AIRPLANE_MODE
prefs:root=General&path=AUTOLOCK
prefs:root=General&path=USAGE/CELLULAR_USAGE
prefs:root=Brightness
prefs:root=Bluetooth
prefs:root=General&path=DATE_AND_TIME
prefs:root=FACETIME
prefs:root=General
prefs:root=General&path=Keyboard
prefs:root=CASTLE
prefs:root=CASTLE&path=STORAGE_AND_BACKUP
prefs:root=General&path=INTERNATIONAL
prefs:root=LOCATION_SERVICES
prefs:root=ACCOUNT_SETTINGS
prefs:root=MUSIC
prefs:root=MUSIC&path=EQ
prefs:root=MUSIC&path=VolumeLimit
prefs:root=General&path=Network
prefs:root=NIKE_PLUS_IPOD
prefs:root=NOTES
prefs:root=NOTIFICATIONS_ID
prefs:root=Phone
prefs:root=Photos
prefs:root=General&path=ManagedConfigurationList
prefs:root=General&path=Reset
prefs:root=Sounds&path=Ringtone
prefs:root=Safari
prefs:root=General&path=Assistant
prefs:root=Sounds
prefs:root=General&path=SOFTWARE_UPDATE_LINK
prefs:root=STORE
prefs:root=TWITTER
prefs:root=FACEBOOK
prefs:root=General&path=USAGE prefs:root=VIDEO
prefs:root=General&path=Network/VPN
prefs:root=Wallpaper
prefs:root=WIFI
prefs:root=INTERNET_TETHERING
prefs:root=Phone&path=Blocked
prefs:root=DO_NOT_DISTURB
38. Display html text in UITextView
UITextView *textView = [[UITextView alloc] initWithFrame:CGRectMake(20, 30, 100, 199)];
textView.backgroundColor = [UIColor redColor];
[self.view addSubview:textView];
NSString *htmlString = @"<h1>Header</h1><h2>Subheader</h2><p>Some <em>text</em></p>![](http://blogs.babble.com/famecrawler/files/2010/11/mickey_mouse-1097.jpg)";
NSAttributedString *attributedString = [[NSAttributedString alloc] initWithData: [htmlString dataUsingEncoding:NSUnicodeStringEncoding] options: @{ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType } documentAttributes: nil error: nil];
textView.attributedText = attributedString;
39. Listen for scrollView to scroll to the top/bottom
-(void)scrollViewDidScroll: (UIScrollView*)scrollView
{
float scrollViewHeight = scrollView.frame.size.height;
float scrollContentSizeHeight = scrollView.contentSize.height;
float scrollOffset = scrollView.contentOffset.y;
if (scrollOffset == 0)
{
// Scroll to the top
}
else if (scrollOffset + scrollViewHeight == scrollContentSizeHeight)
{
// Scroll to the bottom
}
}
40. UISlider increments/decreases are fixed (if 5)
- (void)setupSlider
{
UISlider *slider = [[UISlider alloc] init];
[self.view addSubview:slider];
[slider addTarget:self action:@selector(sliderAction:) forControlEvents:UIControlEventValueChanged];
slider.maximumValue = 100;
slider.minimumValue = 0;
slider.frame = CGRectMake(200, 20, 100, 30);
}
- (void)sliderAction:(UISlider *)slider
{
[slider setValue:((int)((slider.value + 2.5) / 5) * 5) animated:NO];
}
41. Check all text in textField or textView (I'll take textView as an example here)
[self.textView setSelectedTextRange:[self.textView textRangeFromPosition:self.textView.beginningOfDocument toPosition:self.textView.endOfDocument]]
42. Delete a controller from the navigation controller
// Method 1. Know the navigation controller subscript where the controller is located
NSMutableArray *navigationArray = [[NSMutableArray alloc] initWithArray: self.navigationController.viewControllers];
[navigationArray removeObjectAtIndex: 2];
self.navigationController.viewControllers = navigationArray;
// Method 2. Know which controller it is.
NSArray* tempVCA = [self.navigationController viewControllers];
for(UIViewController *tempVC in tempVCA)
{
if([tempVC isKindOfClass:[urViewControllerClass class]])
{
[tempVC removeFromParentViewController];
}
}
43. Hide UITextView/UITextField cursor
textField.tintColor = [UIColor clearColor];
44. Disable the Enter key when there is no text in UITextView/UITextField
textField.enablesReturnKeyAutomatically = YES;
45. String Encoding (unsuccessful encoding url strings)
// We usually use this method to deal with stringByAdding PercentEscapes UsingEncoding, but this method does not want to deal with / and this special symbol, which needs to be dealt with in the following way.
@implementation NSString (NSString_Extended)
- (NSString *)urlencode {
NSMutableString *output = [NSMutableString string];
const unsigned char *source = (const unsigned char *)[self UTF8String];
int sourceLen = strlen((const char *)source);
for (int i = 0; i < sourceLen; ++i) {
const unsigned char thisChar = source[i];
if (thisChar == ' '){
[output appendString:@"+"];
} else if (thisChar == '.' || thisChar == '-' || thisChar == '_' || thisChar == '~' ||
(thisChar >= 'a' && thisChar <= 'z') ||
(thisChar >= 'A' && thisChar <= 'Z') ||
(thisChar >= '0' && thisChar <= '9')) {
[output appendFormat:@"%c", thisChar];
} else {
[output appendFormat:@"%%%02X", thisChar];
}
}
return output;
}
46. Compute the frame of a paragraph of text on UILabel
@implementation UILabel (TextRect)
- (CGRect)boundingRectForCharacterRange:(NSRange)range
{
NSTextStorage *textStorage = [[NSTextStorage alloc] initWithAttributedString:[self attributedText]];
NSLayoutManager *layoutManager = [[NSLayoutManager alloc] init];
[textStorage addLayoutManager:layoutManager];
NSTextContainer *textContainer = [[NSTextContainer alloc] initWithSize:[self bounds].size];
textContainer.lineFragmentPadding = 0;
[layoutManager addTextContainer:textContainer];
NSRange glyphRange;
[layoutManager characterRangeForGlyphRange:range actualGlyphRange:&glyphRange];
return [layoutManager boundingRectForGlyphRange:glyphRange inTextContainer:textContainer];
}
47. Getting Random UUID
NSString *result;
if([[[UIDevice currentDevice] systemVersion] floatValue] > 6.0)
{
result = [[NSUUID UUID] UUIDString];
}
else
{
CFUUIDRef uuidRef = CFUUIDCreate(NULL);
CFStringRef uuid = CFUUIDCreateString(NULL, uuidRef);
CFRelease(uuidRef);
result = (__bridge_transfer NSString *)uuid;
}
48. Imitating Apple Shake Animation
#define RADIANS(degrees) (((degrees) * M_PI) / 180.0)
- (void)startAnimate {
view.transform = CGAffineTransformRotate(CGAffineTransformIdentity, RADIANS(-5));
[UIView animateWithDuration:0.25 delay:0.0 options:(UIViewAnimationOptionAllowUserInteraction | UIViewAnimationOptionRepeat | UIViewAnimationOptionAutoreverse) animations:^ {
view.transform = CGAffineTransformRotate(CGAffineTransformIdentity, RADIANS(5));
} completion:nil];
}
- (void)stopAnimate {
[UIView animateWithDuration:0.25 delay:0.0 options:(UIViewAnimationOptionAllowUserInteraction | UIViewAnimationOptionBeginFromCurrentState | UIViewAnimationOptionCurveLinear) animations:^ {
view.transform = CGAffineTransformIdentity;
} completion:nil];
}
49. Modify the background color inside UISearBar
UITextField *textField = [_searchBar valueForKey:@"_searchField"];
textField.backgroundColor = [UIColor redColor];
50. UITextView scrolls to the top
// Method 1
[self.textView scrollRangeToVisible:NSMakeRange(0, 0)];
// Method 2
[self.textView setContentOffset:CGPointZero animated:YES];
51. Notification Monitoring APP Life Cycle
UI Application DidEnterBackgroundNotification Application Entering the Background
UI Application WillEnter ForegroundNotification application will enter the foreground
UI Application DidFinish Launching Notification Application Completes Startup
UI Application Did Finish Launching Notification Applications Change from Suspended to Active
UI Application WillResignActive Notification application hangs up (with a phone coming in or a lock screen)
The UI Application DidReceive Memory Warning Notification application receives a memory warning
UI Application DidReceive Memory Warning Notification application termination (background killing, cell phone shutdown, etc.)
UI Application Significant Time Change Notification when significant time changes (0 a.m., device time is modified, time zone changes, etc.)
UI Application WillChange StatusBar Orientation Notification Device Direction Will Change
UI Application DidChange StatusBar Orientation Notification Device Direction Change
UI Application WillChange StatusBarFrameNotification Device Status Bar frame will be changed
UI Application DidChange StatusBarFrameNotification Device Status Bar frame Change
The UI Application BackgroundRefreshStatusDidChangeNotification application changes in the status of downloaded content in the background
UI Application Protected Data WillBecomeUnavailable Locally Protected Files Locked and Unaccessible
UI Application Protected Data WillBecomeUnavailable Locally Protected Files Available
52. Types of Touch Events
UIControlEventTouchCancel cancels the event currently triggered by the control
Events pressed at UIControl Event TouchDown Point
UIControl Event TouchDownRepeat Repeated Touch Events
Events where the UIControl Event TouchDragEnter finger is dragged to the boundary of the control
UIControl Event TouchDragExit An event that a finger drags from a control to the outside world
Events dragged by the finger of UIControl Event TouchDragInside within the boundaries of the control
UIControlEventTouchDragOutside Events in which the finger is dragged outside the control boundary
Touch events with UIControl Event TouchUpInside finger under control
Touch events in UIControl Event Touch Up Outside finger beyond control
53. Increase margin around UITextField text
// Subclass UITextField to add insert attributes
@interface WZBTextField : UITextField
@property (nonatomic, assign) UIEdgeInsets insets;
@end
// Rewrite the following methods in. m file
- (CGRect)textRectForBounds:(CGRect)bounds {
CGRect paddedRect = UIEdgeInsetsInsetRect(bounds, self.insets);
if (self.rightViewMode == UITextFieldViewModeAlways || self.rightViewMode == UITextFieldViewModeUnlessEditing) {
return [self adjustRectWithWidthRightView:paddedRect];
}
return paddedRect;
}
- (CGRect)placeholderRectForBounds:(CGRect)bounds {
CGRect paddedRect = UIEdgeInsetsInsetRect(bounds, self.insets);
if (self.rightViewMode == UITextFieldViewModeAlways || self.rightViewMode == UITextFieldViewModeUnlessEditing) {
return [self adjustRectWithWidthRightView:paddedRect];
}
return paddedRect;
}
- (CGRect)editingRectForBounds:(CGRect)bounds {
CGRect paddedRect = UIEdgeInsetsInsetRect(bounds, self.insets);
if (self.rightViewMode == UITextFieldViewModeAlways || self.rightViewMode == UITextFieldViewModeWhileEditing) {
return [self adjustRectWithWidthRightView:paddedRect];
}
return paddedRect;
}
- (CGRect)adjustRectWithWidthRightView:(CGRect)bounds {
CGRect paddedRect = bounds;
paddedRect.size.width -= CGRectGetWidth(self.rightView.frame);
return paddedRect;
}
54. Monitor UISlider drag status
// Adding Events
[slider addTarget:self action:@selector(sliderValurChanged:forEvent:) forControlEvents:UIControlEventValueChanged];
// Implementation Method
- (void)sliderValurChanged:(UISlider*)slider forEvent:(UIEvent*)event {
UITouch *touchEvent = [[event allTouches] anyObject];
switch (touchEvent.phase) {
case UITouchPhaseBegan:
NSLog(@"startDrag");
break;
case UITouchPhaseMoved:
NSLog(@"Dragging");
break;
case UITouchPhaseEnded:
NSLog(@"End drag");
break;
default:
break;
}
}
55. Setting the cursor position of UITextField
// TextField to be set by textField, cursor position to be set by index
- (void)cursorLocation:(UITextField *)textField index:(NSInteger)index
{
NSRange range = NSMakeRange(index, 0);
UITextPosition *start = [textField positionFromPosition:[textField beginningOfDocument] offset:range.location];
UITextPosition *end = [textField positionFromPosition:start offset:range.length];
[textField setSelectedTextRange:[textField textRangeFromPosition:start toPosition:end]];
}
56. Remove the bottom black of webView
[webView setBackgroundColor:[UIColor clearColor]];
[webView setOpaque:NO];
for (UIView *v1 in [webView subviews])
{
if ([v1 isKindOfClass:[UIScrollView class]])
{
for (UIView *v2 in v1.subviews)
{
if ([v2 isKindOfClass:[UIImageView class]])
{
v2.hidden = YES;
}
}
}
}
57. Get the frame of collectionViewCell in the screen
UICollectionViewLayoutAttributes *attributes = [collectionView layoutAttributesForItemAtIndexPath:indexPath];
CGRect cellRect = attributes.frame;
CGRect cellFrameInSuperview = [collectionView convertRect:cellRect toView:[cv superview]];
58. Compare two UIImage s to see if they are equal
- (BOOL)image:(UIImage *)image1 isEqualTo:(UIImage *)image2
{
NSData *data1 = UIImagePNGRepresentation(image1);
NSData *data2 = UIImagePNGRepresentation(image2);
return [data1 isEqual:data2];
}
59. Solve the problem that touch button can't slide when UIScrollView has UIButton
// Subclass UIScrollView and rewrite the following methods
- (instancetype)initWithFrame:(CGRect)frame {
if (self = [super initWithFrame:frame]) {
self.delaysContentTouches = NO;
}
return self;
}
- (BOOL)touchesShouldCancelInContentView:(UIView *)view {
if ([view isKindOfClass:UIButton.class]) {
return YES;
}
return [super touchesShouldCancelInContentView:view];
}
60. Shadow effect added to text in UITextView
- (void)setTextLayer:(UITextView *)textView color:(UIColor *)color
{
CALayer *textLayer = ((CALayer *)[textView.layer.sublayers objectAtIndex:0]);
textLayer.shadowColor = color.CGColor;
textLayer.shadowOffset = CGSizeMake(0.0f, 1.0f);
textLayer.shadowOpacity = 1.0f;
textLayer.shadowRadius = 1.0f;
}
61. MD5 Encryption
+ (NSString *)md5:(NSString *)str
{
const char *concat_str = [str UTF8String];
unsigned char result[CC_MD5_DIGEST_LENGTH];
CC_MD5(concat_str, (unsigned int)strlen(concat_str), result);
NSMutableString *hash = [NSMutableString string];
for (int i =0; i <16; i++){
[hash appendFormat:@"%02X", result[i]];
}
return [hash uppercaseString];
}
62. base64 Encryption
@interface NSData (Base64)
/**
* @brief String base64 back to data
*/
+ (NSData *)dataWithBase64EncodedString:(NSString *)string
{
if (![string length]) return nil;
NSData *decoded = nil;
#if __MAC_OS_X_VERSION_MIN_REQUIRED < __MAC_10_9 || __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_7_0
if (![NSData instancesRespondToSelector:@selector(initWithBase64EncodedString:options:)])
{
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
decoded = [[self alloc] initWithBase64Encoding:[string stringByReplacingOccurrencesOfString:@"[^A-Za-z0-9+/=]" withString:@"" options:NSRegularExpressionSearch range:NSMakeRange(0, [string length])]];
#pragma clang diagnostic pop
}
else
#endif
{
decoded = [[self alloc] initWithBase64EncodedString:string options:NSDataBase64DecodingIgnoreUnknownCharacters];
}
return [decoded length]? decoded: nil;
}
/**
* @brief NSDataturnstring
* @param wrapWidth Line Break Length 76 64
*/
- (NSString *)base64EncodedStringWithWrapWidth:(NSUInteger)wrapWidth
{
if (![self length]) return nil;
NSString *encoded = nil;
#if __MAC_OS_X_VERSION_MIN_REQUIRED < __MAC_10_9 || __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_7_0
if (![NSData instancesRespondToSelector:@selector(base64EncodedStringWithOptions:)])
{
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
encoded = [self base64Encoding];
#pragma clang diagnostic pop
}
else
#endif
{
switch (wrapWidth)
{
case 64:
{
return [self base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];
}
case 76:
{
return [self base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength];
}
default:
{
encoded = [self base64EncodedStringWithOptions:(NSDataBase64EncodingOptions)0];
}
}
}
if (!wrapWidth || wrapWidth >= [encoded length])
{
return encoded;
}
wrapWidth = (wrapWidth / 4) * 4;
NSMutableString *result = [NSMutableString string];
for (NSUInteger i = 0; i < [encoded length]; i+= wrapWidth)
{
if (i + wrapWidth >= [encoded length])
{
[result appendString:[encoded substringFromIndex:i]];
break;
}
[result appendString:[encoded substringWithRange:NSMakeRange(i, wrapWidth)]];
[result appendString:@"\r\n"];
}
return result;
}
/**
* @brief NSDataturnstring Default line length64
*/
- (NSString *)base64EncodedString
{
return [self base64EncodedStringWithWrapWidth:0];
}
63. AES Encryption
#import <CommonCrypto/CommonCryptor.h>
@interface NSData (AES)
/**
* Encryption of data using AES
*/
- (NSData*)encryptedWithAESUsingKey:(NSString*)key andIV:(NSData*)iv {
NSData *keyData = [key dataUsingEncoding:NSUTF8StringEncoding];
size_t dataMoved;
NSMutableData *encryptedData = [NSMutableData dataWithLength:self.length + kCCBlockSizeAES128];
CCCryptorStatus status = CCCrypt(kCCEncrypt,kCCAlgorithmAES128,kCCOptionPKCS7Padding,keyData.bytes,keyData.length,iv.bytes,self.bytes,self.length,encryptedData.mutableBytes, encryptedData.length,&dataMoved);
if (status == kCCSuccess) {
encryptedData.length = dataMoved;
return encryptedData;
}
return nil;
}
/**
* @brief Decrypting Data by AES
*/
- (NSData*)decryptedWithAESUsingKey:(NSString*)key andIV:(NSData*)iv {
NSData *keyData = [key dataUsingEncoding:NSUTF8StringEncoding];
size_t dataMoved;
NSMutableData *decryptedData = [NSMutableData dataWithLength:self.length + kCCBlockSizeAES128];
CCCryptorStatus result = CCCrypt(kCCDecrypt,kCCAlgorithmAES128,kCCOptionPKCS7Padding,keyData.bytes,keyData.length,iv.bytes,self.bytes,self.length,decryptedData.mutableBytes, decryptedData.length,&dataMoved);
if (result == kCCSuccess) {
decryptedData.length = dataMoved;
return decryptedData;
}
return nil;
}
64. 3DES Encryption
#import <CommonCrypto/CommonCryptor.h>
@interface NSData (3DES)
/**
* Encryption of Data Using 3DES
*/
- (NSData*)encryptedWith3DESUsingKey:(NSString*)key andIV:(NSData*)iv {
NSData *keyData = [key dataUsingEncoding:NSUTF8StringEncoding];
size_t dataMoved;
NSMutableData *encryptedData = [NSMutableData dataWithLength:self.length + kCCBlockSize3DES];
CCCryptorStatus result = CCCrypt(kCCEncrypt,kCCAlgorithm3DES,kCCOptionPKCS7Padding,keyData.bytes,keyData.length,iv.bytes,self.bytes,self.length,encryptedData.mutableBytes,encryptedData.length,&dataMoved);
if (result == kCCSuccess) {
encryptedData.length = dataMoved;
return encryptedData;
}
return nil;
}
/**
* @brief Decrypting Data Using 3DES
*/
- (NSData*)decryptedWith3DESUsingKey:(NSString*)key andIV:(NSData*)iv {
NSData *keyData = [key dataUsingEncoding:NSUTF8StringEncoding];
size_t dataMoved;
NSMutableData *decryptedData = [NSMutableData dataWithLength:self.length + kCCBlockSize3DES];
CCCryptorStatus result = CCCrypt(kCCDecrypt,kCCAlgorithm3DES,kCCOptionPKCS7Padding,keyData.bytes,keyData.length,iv.bytes,self.bytes,self.length,decryptedData.mutableBytes,decryptedData.length,&dataMoved);
if (result == kCCSuccess) {
decryptedData.length = dataMoved;
return decryptedData;
}
return nil;
}
65. In the case of multiple network requests on a single page, the UI needs to be refreshed after listening to all network requests
dispatch_group_t group = dispatch_group_create();
dispatch_queue_t serialQueue = dispatch_queue_create("com.wzb.test.www", DISPATCH_QUEUE_SERIAL);
dispatch_group_enter(group);
dispatch_group_async(group, serialQueue, ^{
// Network Request I
[WebClick getDataSuccess:^(ResponseModel *model) {
dispatch_group_leave(group);
} failure:^(NSString *err) {
dispatch_group_leave(group);
}];
});
dispatch_group_enter(group);
dispatch_group_async(group, serialQueue, ^{
// Network Request II
[WebClick getDataSuccess:getBigTypeRM onSuccess:^(ResponseModel *model) {
dispatch_group_leave(group);
} failure:^(NSString *errorString) {
dispatch_group_leave(group);
}];
});
dispatch_group_enter(group);
dispatch_group_async(group, serialQueue, ^{
// Network Request III
[WebClick getDataSuccess:^{
dispatch_group_leave(group);
} failure:^(NSString *errorString) {
dispatch_group_leave(group);
}];
});
// All network requests come to this method when they are finished.
dispatch_group_notify(group, serialQueue, ^{
dispatch_async(dispatch_get_global_queue(0, 0), ^{
dispatch_async(dispatch_get_main_queue(), ^{
// Refresh UI
});
});
});
66. Solving openUrl Delay Problem
// Method 1
dispatch_async(dispatch_get_main_queue(), ^{
UIApplication *application = [UIApplication sharedApplication];
if ([application respondsToSelector:@selector(openURL:options:completionHandler:)]) {
[application openURL:URL options:@{}
completionHandler:nil];
} else {
[application openURL:URL];
}
});
// Method 2
[self performSelector:@selector(redirectToURL:) withObject:url afterDelay:0.1];
- (void) redirectToURL
{
UIApplication *application = [UIApplication sharedApplication];
if ([application respondsToSelector:@selector(openURL:options:completionHandler:)]) {
[application openURL:URL options:@{}
completionHandler:nil];
} else {
[application openURL:URL];
}
}
67. Flipping Painting by Page Jump
// modal approach
TestViewController *vc = [[TestViewController alloc] init];
vc.view.backgroundColor = [UIColor redColor];
vc.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
[self presentViewController:vc animated:YES completion:nil];
// push mode
TestViewController *vc = [[TestViewController alloc] init];
vc.view.backgroundColor = [UIColor redColor];
[UIView beginAnimations:@"View Flip" context:nil];
[UIView setAnimationDuration:0.80];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:self.navigationController.view cache:NO];
[self.navigationController pushViewController:vc animated:YES];
[UIView commitAnimations];
68. tableView implements infinite scrolling
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
CGFloat actualPosition = scrollView.contentOffset.y;
CGFloat contentHeight = scrollView.contentSize.height - scrollView.frame.size.height;
if (actualPosition >= contentHeight) {
[self.dataArr addObjectsFromArray:self.dataArr];
[self.tableView reloadData];
}
}
69. Code mode to adjust screen brightness
// The brightness attribute values are between 0 and 1, 0 represents the minimum brightness and 1 represents the maximum brightness.
[[UIScreen mainScreen] setBrightness:0.5];
70. Obtain current CUP usage
float cpu_usage()
{
kern_return_t kr;
task_info_data_t tinfo;
mach_msg_type_number_t task_info_count;
task_info_count = TASK_INFO_MAX;
kr = task_info(mach_task_self(), TASK_BASIC_INFO, (task_info_t)tinfo, &task_info_count);
if (kr != KERN_SUCCESS) {
return -1;
}
task_basic_info_t basic_info;
thread_array_t thread_list;
mach_msg_type_number_t thread_count;
thread_info_data_t thinfo;
mach_msg_type_number_t thread_info_count;
thread_basic_info_t basic_info_th;
uint32_t stat_thread = 0; // Mach threads
basic_info = (task_basic_info_t)tinfo;
// get threads in the task
kr = task_threads(mach_task_self(), &thread_list, &thread_count);
if (kr != KERN_SUCCESS) {
return -1;
}
if (thread_count > 0)
stat_thread += thread_count;
long tot_sec = 0;
long tot_usec = 0;
float tot_cpu = 0;
int j;
for (j = 0; j < (int)thread_count; j++)
{
thread_info_count = THREAD_INFO_MAX;
kr = thread_info(thread_list[j], THREAD_BASIC_INFO,
(thread_info_t)thinfo, &thread_info_count);
if (kr != KERN_SUCCESS) {
return -1;
}
basic_info_th = (thread_basic_info_t)thinfo;
if (!(basic_info_th->flags & TH_FLAGS_IDLE)) {
tot_sec = tot_sec + basic_info_th->user_time.seconds + basic_info_th->system_time.seconds;
tot_usec = tot_usec + basic_info_th->user_time.microseconds + basic_info_th->system_time.microseconds;
tot_cpu = tot_cpu + basic_info_th->cpu_usage / (float)TH_USAGE_SCALE * 100.0;
}
} // for each thread
kr = vm_deallocate(mach_task_self(), (vm_offset_t)thread_list, thread_count * sizeof(thread_t));
assert(kr == KERN_SUCCESS);
return tot_cpu;
}
71. Rounding up float data
CGFloat f = 4.65;
NSLog(@"%d", (int)f); // Print result 4
CGFloat f = 4.65;
NSLog(@"%d", (int)round(f)); // Print result 5
72. Delete the default UISearchBar system border
// Method 1
searchBar.searchBarStyle = UISearchBarStyleMinimal;
// Method 2
[searchBar setBackgroundImage:[[UIImage alloc]init]];
// Method 3
searchBar.barTintColor = [UIColor whiteColor];
73. Set rounded corners and shadows for UICollection ViewCell
cell.contentView.layer.cornerRadius = 2.0f;
cell.contentView.layer.borderWidth = 1.0f;
cell.contentView.layer.borderColor = [UIColor clearColor].CGColor;
cell.contentView.layer.masksToBounds = YES;
cell.layer.shadowColor = [UIColor lightGrayColor].CGColor;
cell.layer.shadowOffset = CGSizeMake(0, 2.0f);
cell.layer.shadowRadius = 2.0f;
cell.layer.shadowOpacity = 1.0f;
cell.layer.masksToBounds = NO;
cell.layer.shadowPath = [UIBezierPath bezierPathWithRoundedRect:cell.bounds cornerRadius:cell.contentView.layer.cornerRadius].CGPath;
74. Let the sliding scrollView stop scrolling (not prohibit, but temporarily stop scrolling)
[scrollView setContentOffset:scrollView.contentOffset animated:NO];
75. Use xib to set the borders and rounded corners of UIView
Round corners and borders can be set by looking at the following figure
But adding the keyPath of layer.borderColor to set the border color doesn't work. Later, we checked the data. We should use layer.borderUIColor here, but the color set here doesn't work. Whatever color is set, it's black. Later, I checked it out. One solution was to add a category to CALayer and provide a classification for CALayer.- (void) setBorderUIColor:(UIColor*) color; the method can be solved as follows:
#import "CALayer+BorderColor.h"
@implementation CALayer (BorderColor)
- (void)setBorderUIColor:(UIColor *)color
{
self.borderColor = color.CGColor;
}
76. Obtain information about cities according to latitude and longitude
// Create latitude and longitude
CLLocation *location = [[CLLocation alloc] initWithLatitude:latitude longitude:longitude];
//Create a decoder
CLGeocoder *cLGeocoder = [[CLGeocoder alloc] init];
[cLGeocoder reverseGeocodeLocation:userLocation completionHandler:^(NSArray *placemarks, NSError *error) {
CLPlacemark *place = [placemarks objectAtIndex:0];
// Location name
NSLog(@"name,%@",place.name);
// Street
NSLog(@"thoroughfare,%@",place.thoroughfare);
// Sub-Street
NSLog(@"subThoroughfare,%@",place.subThoroughfare);
// city
NSLog(@"locality,%@",place.locality);
// area
NSLog(@"subLocality,%@",place.subLocality);
// Country
NSLog(@"country,%@",place.country);
}
}];
/* CLPlacemark Meaning of neutral attribute
name place name
thoroughfare Street
subThoroughfare Street-related information, such as door signs, etc.
locality City
subLocality City-related information, such as landmarks
administrativeArea Municipality directly under the Central Government
subAdministrativeArea Information of other administrative regions (autonomous regions, etc.)
postalCode Zip code
ISOcountryCode National Code
country Country
inlandWater Water source, Lake
ocean ocean
areasOfInterest Relevant or interest-related landmarks
*/
77. How to prevent adding multiple NSNotification observers?
// The solution is to remove the observer before adding it.
[[NSNotificationCenter defaultCenter] removeObserver:observer name:name object:object];
[[NSNotificationCenter defaultCenter] addObserver:observer selector:selector name:name object:object];
78. Add one xib to another xib
// Assuming your custom view name is CustomView, you need to override the `-(instance type) initWithCoder:(NSCoder*) aDecoder` method in CustomView.m. The code is as follows:
- (instancetype)initWithCoder:(NSCoder *)aDecoder {
if ((self = [super initWithCoder:aDecoder])) {
[self addSubview:[[[NSBundle mainBundle] loadNibNamed:@"CustomView" owner:self options:nil] objectAtIndex:0]];
}
return self;
}
79. Processing strings to capitalize their initials
NSString *str = @"abcdefghijklmn";
NSString *resultStr;
if (str && str.length > 0) {
resultStr = [str stringByReplacingCharactersInRange:NSMakeRange(0,1) withString:[[str substringToIndex:1] capitalizedString]];
}
NSLog(@"%@", resultStr);
80. Determine whether a UIAlert View/UIAlert Controller is displayed
// UIAlertView has its own properties
if (alert.visible)
{
NSLog(@"Shows");
} else {
NSLog(@"Not shown");
}
// UIAlert Controller does not have visible attributes and needs to be judged by itself by adding a global variable BOOL visible
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"Title" message:@"message" preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *alertAction = [UIAlertAction actionWithTitle:@"ActionTitle" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
self.visible = NO;
}];
UIAlertAction *calcelAction = [UIAlertAction actionWithTitle:@"calcelTitle" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
self.visible = NO;
}];
[alertController addAction:alertAction];
[alertController addAction:calcelAction];
[self presentViewController:alertController animated:YES completion:^{
self.visible = YES;
}];
81. Get the number in the string
- (NSString *)getNumberFromStr:(NSString *)str
{
NSCharacterSet *nonDigitCharacterSet = [[NSCharacterSet decimalDigitCharacterSet] invertedSet];
return [[str componentsSeparatedByCharactersInSet:nonDigitCharacterSet] componentsJoinedByString:@""];
}
NSLog(@"%@", [self getNumberFromStr:@"a0b0c1d2e3f4fda8fa8fad9fsad23"]); // 00123488923
82. Add borders to a direction of UIView
// Adding UIView Categories
// UIView+WZB.h
#import <UIKit/UIKit.h>
/**
Border Direction
- WZBBorderDirectionTop: Top
- WZBBorderDirectionLeft: left
- WZBBorderDirectionBottom: bottom
- WZBBorderDirectionRight: Right
*/
typedef NS_ENUM(NSInteger, WZBBorderDirectionType) {
WZBBorderDirectionTop = 0,
WZBBorderDirectionLeft,
WZBBorderDirectionBottom,
WZBBorderDirectionRight
};
@interface UIView (WZB)
/**
Add borders to a direction of UIView
@param direction Border Direction
@param color Border color
@param width Border width
*/
- (void)wzb_addBorder:(WZBBorderDirectionType)direction color:(UIColor *)color width:(CGFloat)width;
@end
// UIView+WZB.m
#import "UIView+WZB.h"
@implementation UIView (WZB)
- (void)wzb_addBorder:(WZBBorderDirectionType)direction color:(UIColor *)color width:(CGFloat)width
{
CALayer *border = [CALayer layer];
border.backgroundColor = color.CGColor;
switch (direction) {
case WZBBorderDirectionTop:
{
border.frame = CGRectMake(0.0f, 0.0f, self.bounds.size.width, width);
}
break;
case WZBBorderDirectionLeft:
{
border.frame = CGRectMake(0.0f, 0.0f, width, self.bounds.size.height);
}
break;
case WZBBorderDirectionBottom:
{
border.frame = CGRectMake(0.0f, self.bounds.size.height - width, self.bounds.size.width, width);
}
break;
case WZBBorderDirectionRight:
{
border.frame = CGRectMake(self.bounds.size.width - width, 0, width, self.bounds.size.height);
}
break;
default:
break;
}
[self.layer addSublayer:border];
}
83. Set the widths of UISwitch, UIProgressView and other controls by attributes
mySwitch.transform = CGAffineTransformMakeScale(5.0f, 5.0f);
progressView.transform = CGAffineTransformMakeScale(5.0f, 5.0f);
84. Automatic search function. Users do not search when they input continuously. Users search automatically when they stop typing. (I set 0.5s here, which can be changed according to needs)
// Called when the text of the input box changes
-(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText{
// Cancel calling the search method first
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(searchNewResult) object:nil];
// Call the search method after 0.5 seconds
[self performSelector:@selector(searchNewResult) withObject:nil afterDelay:0.5];
}
85. Modify the placeholder text color of UISearchBar
// Method 1 (recommended)
UITextField *searchField = [searchBar valueForKey:@"_searchField"];
[searchField setValue:[UIColor blueColor] forKeyPath:@"_placeholderLabel.textColor"];
// Method 2 (expired)
[[UILabel appearanceWhenContainedIn:[UISearchBar class], nil] setTextColor:[UIColor redColor]];
// Method 3 (expired)
NSDictionary *placeholderAttributes = @{NSForegroundColorAttributeName : [UIColor redColor], NSFontAttributeName : [UIFont fontWithName:@"HelveticaNeue" size:15],};
NSAttributedString *attributedPlaceholder = [[NSAttributedString alloc] initWithString:searchBar.placeholder attributes:placeholderAttributes];
[[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setAttributedPlaceholder:attributedPlaceholder];
86. Problems caused by simultaneous response of multiple events in an interface (e.g., when two button s press push to the new interface at the same time, both will respond, which may lead to push overlap)
// UIView has an attribute called exclusive Touch, and when set to YES, its response event will be mutually exclusive with other views (clicking on it when there are other view event responses will not work).
view.exclusiveTouch = YES;
// Settings one by one are too cumbersome to set globally
[[UIView appearance] setExclusiveTouch:YES];
// Or just set button
[[UIButton appearance] setExclusiveTouch:YES];
87. Modify the frame of tabBar
// Subclassifying UITabBarViewController, I'll rewrite the viewWillLayoutSubviews method by modifying the tabBar height as an example
#import "WZBTabBarViewController.h"
@interface WZBTabBarViewController ()
@end
@implementation WZBTabBarViewController
- (void)viewWillLayoutSubviews {
CGRect tabFrame = self.tabBar.frame;
tabFrame.size.height = 100;
tabFrame.origin.y = self.view.frame.size.height - 100;
self.tabBar.frame = tabFrame;
}
@end
88. Modify keyboard background color
// Setting a keyboard color
textField.keyboardAppearance = UIKeyboardAppearanceAlert;
// Set up all keyboard colors in the project
[[UITextField appearance] setKeyboardAppearance:UIKeyboardAppearanceAlert];
89. Modify image color
UIImage *image = [UIImage imageNamed:@"test"];
imageView.image = [image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
CGRect rect = CGRectMake(0, 0, image.size.width, image.size.height);
UIGraphicsBeginImageContext(rect.size);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextClipToMask(context, rect, image.CGImage);
CGContextSetFillColorWithColor(context, [[UIColor redColor] CGColor]);
CGContextFillRect(context, rect);
UIImage *img = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
UIImage *flippedImage = [UIImage imageWithCGImage:img.CGImage scale:1.0 orientation: UIImageOrientationDownMirrored];
imageView.image = flippedImage;
90. Animation execution removeFromSuperview
[UIView animateWithDuration:0.2
animations:^{
view.alpha = 0.0f;
} completion:^(BOOL finished){
[view removeFromSuperview];
}];
91. Start Page Display Delay
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// Delay of 10 s
sleep(10);
return YES;
}
92. Set the background color when UIButton is highlighted
// Method 1. Subclassify UIButton, rewrite setHighlighted: Method, code as follows
#import "WZBButton.h"
@implementation WZBButton
- (void)setHighlighted:(BOOL)highlighted {
[super setHighlighted:highlighted];
UIColor *normalColor = [UIColor greenColor];
UIColor *highlightedColor = [UIColor redColor];
self.backgroundColor = highlighted ? highlightedColor : normalColor;
}
// Method 2. Using setBackgroundImage: for State: Method
[button setBackgroundImage:[self imageWithColor:[UIColor blueColor]] forState:UIControlStateHighlighted];
- (UIImage *)imageWithColor:(UIColor *)color {
CGRect rect = CGRectMake(0.0f, 0.0f, 1.0f, 1.0f);
UIGraphicsBeginImageContext(rect.size);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetFillColorWithColor(context, [color CGColor]);
CGContextFillRect(context, rect);
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}
93. About picture stretching
I recommend this blog. It's very detailed. http://blog.csdn.net/q199109106q/article/details/8615661
94. Getting all attributes of a class by using runtime
- (NSArray *)allPropertyNames:(Class)aClass
{
unsigned count;
objc_property_t *properties = class_copyPropertyList(aClass, &count);
NSMutableArray *rv = [NSMutableArray array];
unsigned i;
for (i = 0; i < count; i++)
{
objc_property_t property = properties[i];
NSString *name = [NSString stringWithUTF8String:property_getName(property)];
[rv addObject:name];
}
free(properties);
return rv;
}
95. Setting textView Text to Other Colors
- (void)setupTextView:(UITextView *)textView text:(NSString *)text color:(UIColor *)color {
NSMutableAttributedString *string = [[NSMutableAttributedString alloc]initWithString:textView.text];
[string addAttribute:NSForegroundColorAttributeName value:color range:[textView.text rangeOfString:text]];
[textView setAttributedText:string];
}
96. Let push jump and turn as modal jump and turn (from bottom to top)
- (void)push
{
TestViewController *vc = [[TestViewController alloc] init];
vc.view.backgroundColor = [UIColor redColor];
CATransition* transition = [CATransition animation];
transition.duration = 0.4f;
transition.type = kCATransitionMoveIn;
transition.subtype = kCATransitionFromTop;
[self.navigationController.view.layer addAnimation:transition forKey:kCATransition];
[self.navigationController pushViewController:vc animated:NO];
}
- (void)pop
{
CATransition* transition = [CATransition animation];
transition.duration = 0.4f;
transition.type = kCATransitionReveal;
transition.subtype = kCATransitionFromBottom;
[self.navigationController.view.layer addAnimation:transition forKey:kCATransition];
[self.navigationController popViewControllerAnimated:NO];
}
97. The uploaded pictures are too big and the compressed pictures are too big.
-(UIImage *)resizeImage:(UIImage *)image
{
float actualHeight = image.size.height;
float actualWidth = image.size.width;
float maxHeight = 300.0;
float maxWidth = 400.0;
float imgRatio = actualWidth/actualHeight;
float maxRatio = maxWidth/maxHeight;
float compressionQuality = 0.5;//50 percent compression
if (actualHeight > maxHeight || actualWidth > maxWidth)
{
if(imgRatio < maxRatio)
{
//adjust width according to maxHeight
imgRatio = maxHeight / actualHeight;
actualWidth = imgRatio * actualWidth;
actualHeight = maxHeight;
}
else if(imgRatio > maxRatio)
{
//adjust height according to maxWidth
imgRatio = maxWidth / actualWidth;
actualHeight = imgRatio * actualHeight;
actualWidth = maxWidth;
}
else
{
actualHeight = maxHeight;
actualWidth = maxWidth;
}
}
CGRect rect = CGRectMake(0.0, 0.0, actualWidth, actualHeight);
UIGraphicsBeginImageContext(rect.size);
[image drawInRect:rect];
UIImage *img = UIGraphicsGetImageFromCurrentImageContext();
NSData *imageData = UIImageJPEGRepresentation(img, compressionQuality);
UIGraphicsEndImageContext();
return [UIImage imageWithData:imageData];
}
Because of the limitation of the length of the article, the short book can only be written in sections. If you are interested in it, you might as well pay attention to it. There are many high-quality things to share! If there is a problem with the code in the article, you can trust me directly or join our technical group to communicate.