iOS開發經驗總結2
一、調節UINavigationBar的leftBarButtonItem離左邊的距離 (iOS11 不可用)
UIBarButtonItem *buttonItem = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"back-button-whiteArrow.png"] style:UIBarButtonItemStylePlain target:self action:@selector(logout BarBtnPressed:)];
UIBarButtonItem *fixedBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil];
fixedBarButtonItem.width = -15;
self.navigationItem.leftBarButtonItems = [NSArray arrayWithObjects:fixedBarButtonItem, buttonItem, nil];
複製程式碼
根據
fixedButton.width
配置離左邊的距離。
二、RestKit 儲存資料到core data
通過RestKit將資料儲存到core data中,entity為
@interface Article : NSManagedObject
@property (nonatomic, retain) NSNumber* articleID;
@property (nonatomic, retain) NSString* title;
@property (nonatomic, retain) NSString* body;
@property (nonatomic, retain) NSDate* publicationDate;
@end
@implementation Article // We use @dynamic for the properties in Core Data
@dynamic articleID;
@dynamic title;
@dynamic body;
@dynamic publicationDate;
@end
複製程式碼
設定object mapping
RKEntityMapping* articleMapping = [RKEntityMapping mappingForEntityForName:@"Article"
inManagedObjectStore:managedObjectStore];
[articleMapping addAttributeMappingsFromDictionary:@{
@"id": @"articleID",
@"title": @"title",
@"body": @"body",
@"publication_date": @"publicationDate"
}];
articleMapping.identificationAttributes = @[ @"articleID" ];
複製程式碼
其中的identificationAttributes 設定的陣列中的值,就是用來判斷返回的資料是更新還是new。
三、RestKit 新增relationship
Author Entity
@interface Author : NSObject
@property (nonatomic, copy) NSString *name;
@property (nonatomic, copy) NSString *email;
@end
複製程式碼
Article Entity
@interface Article : NSObject
@property (nonatomic, copy) NSString *title;
@property (nonatomic, copy) NSString *body;
@property (nonatomic) Author *author;
@property (nonatomic) NSDate *publicationDate;
@end
複製程式碼
新增好關係friendship
// Create our new Author mapping
RKObjectMapping* authorMapping = [RKObjectMapping mappingForClass:[Author class] ];
// NOTE: When your source and destination key paths are symmetrical, you can use addAttributesFromArray: as a shortcut instead of addAttributesFromDictionary:
[authorMapping addAttributeMappingsFromArray:@[ @"name", @"email" ]];
// Now configure the Article mapping
RKObjectMapping* articleMapping = [RKObjectMapping mappingForClass:[Article class] ];
[articleMapping addAttributeMappingsFromDictionary:@{
@"title": @"title",
@"body": @"body",
@"publication_date": @"publicationDate"
}];
// Define the relationship mapping
[articleMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"author"
toKeyPath:@"author"
withMapping:authorMapping]];
RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:articleMapping
method:RKRequestMethodAny
pathPattern:nil keyPath:@"articles"
statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
複製程式碼
在Json轉Model的時候,使用JTObjectMapping方法很類似。減少很多的工作量。
四、xcode找不到裝置
原因: Deployment Target版本比真機版本高,導致找不到。將Deployment Target設定成與真機的系統版本一致。
五、autolayout 自動佈局
autoLayout 需要在- (void)viewDidLoad
方法執行完後生效,所以需要在- (void)viewDidAppear:(BOOL)animated
方法中再進行frame的獲取,此時才能取到正確的frame。
六、Navigation backBarButtonItem 設定
**根據蘋果官方指出:backbarbuttonItem不能定義customview,所以,只能貼圖或者,讓leftBarButtonItem變成自定義返回按鈕,自己寫個方法進行[self.navigationController pop當前Item **
之前大家是否疑惑為什麼設定了類似這樣的程式碼
UIBarButtonItem *backButton = [[UIBarButtonItem alloc]
initWithTitle:@"返回"
style:UIBarButtonItemStylePlain
target:self
action:nil];
self.navigationItem.backBarButtonItem = backButton;
複製程式碼
介面上backButton並沒出現“返回”的字樣.
其實是被leftBarButtonItem和rightBarButtonItem的設定方法所迷惑了leftBarButtonItem和rightBarButtonItem設定的是本級頁面上的BarButtonItem,而backBarButtonItem設定的是下一級頁面上的BarButtonItem. 比如:兩個ViewController,主A和子B,我們想在A上顯示“重新整理”的右BarButton,B上的BackButton顯示為“撤退”就應該在A的viewDidLoad類似方法中寫:
UIBarButtonItem *refreshButton = [[UIBarButtonItem alloc]
initWithTitle:@"重新整理"
style:UIBarButtonItemStylePlain
target:self
action:nil];
self.navigationItem.rightBarButtonItem = refreshButton;
UIBarButtonItem *cancelButton = [[UIBarButtonItem alloc]
initWithTitle:@"撤退"
style:UIBarButtonItemStylePlain
target:self
action:nil];
self.navigationItem.backBarButtonItem = cancelButton;
複製程式碼
而B不需要做任何處理然後ApushB就可以了.
七、AFNetworking 使用ssl
sharedClient.securityPolicy.allowInvalidCertificates = YES;
複製程式碼
八、NSJSONSerialization 使用資料型別要求
進行JSON轉化的時候,需要滿足一下的要求。
An object that may be converted to JSON must have the following properties:
- The top level object is an NSArray or NSDictionary.
- All objects are instances of NSString, NSNumber, NSArray, NSDictionary, or NSNull.
- All dictionary keys are instances of NSString.
- Numbers are not NaN or infinity.
也就是說:nil,基礎資料不能轉化為JSON。
九、NSArray進行不定引數處理
+ (NSArray *)arrayWithObjectsExceptionNil:(id)firstObj, ...
{
NSMutableArray *tempMArray = [[NSMutableArray alloc] initWithCapacity:5];
id eachObject = nil;
va_list argumentList;
if ( firstObj ) {
[tempMArray addObject:firstObj];
va_start(argumentList, firstObj);
while ( (eachObject = va_arg(argumentList, id))){
if ( nil != eachObject ){
[tempMArray addObject:eachObject];
}
}
va_end(argumentList);
}
return nil;
}
複製程式碼
十、獲取version
NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];
// app名稱
NSString *app_Name = [infoDictionary objectForKey:@"CFBundleDisplayName"];
// app版本
NSString *app_Version = [infoDictionary objectForKey:@"CFBundleShortVersionString"];
// app build版本
NSString *app_build = [infoDictionary objectForKey:@"CFBundleVersion"];
複製程式碼
**注意:appid,在申請提交的時候,在itunesconnect的這個裡面生成了,稽核通過了也不會改變。 **
十一、no input file 錯誤
如果在編譯的時候找不到檔案,需要先在Build Phases中的Compile Sources 將不存在的檔案刪除,然後再將找不到的檔案新增到project中。
十二、cg,cf,ca,ui等開頭類
你還可以看到其他名字打頭的一些類,比如CF、CA、CG、UI等等,比如 CFStringTokenizer 這是個分詞的東東 CALayer 這表示Core Animation的層 CGPoint 這表示一個點 UIImage 這表示iPhone裡面的圖片
CF說的是Core Foundation,CA說的是Core Animation,CG說的是Core Graphics,UI說的是iPhone的User Interface
十三、file's owner 含義
file's owner 就是xib對應的類,如view對應的xib檔案的file's owner對應的類就是viewcontroller的類。 file’s owner 是view和viewcontroller之間的對應關係的橋樑。(即,一個檢視,如何知道自己的介面的操作應該由誰來響應)
十四、iOS coin 不透明
一般iOS app coin應該是不透明的,並且不可以在app中多次使用app coin。
十五、判斷自定義類是否重複
自定義類庫中,需要重寫NSObject的兩個固定方法來判斷類是否重複:
- (BOOL)isEqual:(id)anObject;
- (NSUInteger)hash;
複製程式碼
十六、IOS常用巨集
// Macro wrapper for NSLog only if debug mode has been enabled
#ifdef DEBUG
#define DLog(fmt,...) NSLog(fmt, ##__VA_ARGS__);
#else
// If debug mode hasn't been enabled, don't do anything when the macro is called
#define DLog(...)
#endif
#define MR_ENABLE_ACTIVE_RECORD_LOGGING 0
#define IS_OS_6_OR_LATER ([[[UIDevice currentDevice] systemVersion] floatValue] >= 6.0)
#define IS_OS_7_OR_LATER ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0)
#define OBJISNULL(o) (o == nil || [o isKindOfClass:[NSNull class]] || ([o isKindOfClass:[NSString class]] && [o length] == 0))
#define APP ((AppDelegate*)[[UIApplication sharedApplication] delegate])
#define UserDefaults [NSUserDefaults standardUserDefaults]
#define SharedApplication [UIApplication sharedApplication]
#define SYSTEM_VERSION_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedSame)
#define SYSTEM_VERSION_GREATER_THAN(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedDescending)
#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)
#define SYSTEM_VERSION_LESS_THAN(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)
#define SYSTEM_VERSION_LESS_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedDescending)
#define RGB(r, g, b) [UIColor colorWithRed:r/255.0 green:g/255.0 blue:b/255.0 alpha:1.0]
#define RGBA(r, g, b, a) [UIColor colorWithRed:r/255.0 green:g/255.0 blue:b/255.0 alpha:a]
複製程式碼
十七、判斷是否是4寸屏
#define iPhone5 ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(640, 1136), [[UIScreen mainScreen] currentMode].size) : NO)
複製程式碼
十八、NSString格式限定符
說明符 | 描述 |
---|---|
%@ | Objective-c 物件 |
%zd | NSInteger |
%lx | CFIndex |
%tu | NSUInteger |
%i | int |
%u | unsigned int |
%hi | short |
%hu | unsigned short |
%% | %符號 |
十九、宣告變數 在ARC下自動初始化為nil
NSString *s;
在非ARC 的情況下, s指向任意地址,可能是系統地址,導致崩潰。
在ARC 的情況下,s已經自動初始化為nil。
二十、向NSArray,NSDictionary等容器新增元素需判nil
[_paths addObject:[_path copy]];
如果這個_path為nil,那麼就會出現一個crash。因為在容器中不能存放nil,可以用[NSNull null]來儲存.
推薦 pod 'XTSafeCollection', '~> 1.0.4'
第三方庫,對陣列的越界,賦值nil,都有保護作用。
二十一、ceil命令 floor命令
Math中一個演算法命令。 函式名: ceil用 法: double ceil(double x);功 能: 返回大於或者等於指定表示式的最小整數標頭檔案:math.h
float f = 1.2222;
NSLog(@"f is %f.", ceil(f));
複製程式碼
列印: f is 2.000000.
函式名: floor功 能: 返回小於或者等於指定表示式的最大整數用 法: double floor(double x);標頭檔案:math.h
float f = 1.2222;
NSLog(@"f is %f.", floor(f));
複製程式碼
列印: f is 1.000000.
二十二、Xcode中對某個類進行非ARC的設定
在Xcode點選工程,在工程中選擇“TARGETS”你的工程,在Build Phases中選擇“Compile Sources”,找到你需要設定非ARC的類,在這個類的右邊有一個“Compiler Flags”,在這個裡面設定“-fno-objc-arc ”。 那麼這個類就是非ARC進行編譯了。
二十三、storyboard上不能進行scrollview滾動
storyboard上不能進行scrollview滾動的原因是: autolayout引起的
二十四、延長APP的啟動時間
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
[NSThread sleepForTimeInterval:3.0f];
return YES;
}
複製程式碼
二十五、xcode除錯的時候不執行watchdog
在利用Xcode進行除錯時,watchdog不會執行,所在裝置中測試程式啟動效能時,不要將裝置連線到Xcode。
二十六、語言國際化 NSLocalizedString
如果你使用的是Localizable.strings,那麼你在程式中可以這樣獲取字串: NSLocalizedString(@"mykey", nil)
如果你使用的是自定義名字的.strings,比如MyApp.strings,那麼你在程式中可以這樣獲取字串: NSLocalizedStringFromTable (@"mykey",@"MyApp", nil)
這樣即可獲取到"myvalue"這個字串,可以是任何語言。
二十七、UIAppearance 使用
使用UIAppearance進行外觀的自定義。
[+ appearance]
修改整個程式中某個class的外觀
[[UINavigationBar appearance] setTintColor:myColor];
複製程式碼
[+ appearanceWhenContainedIn:]
當某個class被包含在另外一個class內時,才修改外觀。
[[UILabel appearanceWhenContainedIn:[cusSearchBar class], nil] setTextColor:[UIColor redColor]];
複製程式碼
二十八、將NSString轉換成UTF8編碼的NSString
在使用網路地址時,一般要先將url進行encode成UTF8格式的編碼,否則在使用時可能報告網址不存在的錯誤,這時就需要進行轉換 下面就是轉換函式:
NSString *urlString= [NSString stringWithFormat:@"http://www.baidu.com"];
NSString *encodedString = (NSString *)CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes( kCFAllocatorDefault, (CFStringRef)urlString, NULL, NULL, kCFStringEncodingUTF8 ));
NSURL *url = [NSURL URLWithString:encodedString];
複製程式碼
或者使用下面的方法:
NSString *utf8Str = @"Testing";
NSString *unicodeStr = [NSString stringWithCString:[utf8Str UTF8String] encoding:NSUnicodeStringEncoding];
複製程式碼
有時候獲取的url中的中文等字元是亂碼,網頁內容是亂碼,需要進行一下轉碼才能正確識別NSString,可以用下面的方法:
//解決亂碼問題()
NSString *transString = [NSString stringWithString:[string stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
複製程式碼
二十九、NSDateFormatter設定日期格式 AM
NSDateFormatter * dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setAMSymbol:@"AM"];
[dateFormatter setPMSymbol:@"PM"];
[dateFormatter setDateFormat:@"dd/MM/yyyy hh:mmaaa"];
NSDate *date = [NSDate date];
NSString *s = [dateFormatter stringFromDate:date];
複製程式碼
顯示效果為: 10/05/2010 03:49PM
三十、判斷NSString為純數字
//判斷是否為整形:
- (BOOL)isPureInt:(NSString*)string{
NSScanner* scan = [NSScanner scannerWithString:string];
int val;
return[scan scanInt:&val] && [scan isAtEnd];
}
//判斷是否為浮點形:
- (BOOL)isPureFloat:(NSString*)string{
NSScanner* scan = [NSScanner scannerWithString:string];
float val;
return[scan scanFloat:&val] && [scan isAtEnd];
}
if( ![self isPureInt:insertValue.text] || ![self isPureFloat:insertValue.text])
{
resultLabel.textColor = [UIColor redColor];
resultLabel.text = @"警告:含非法字元,請輸入純數字!";
return;
}
複製程式碼
三十一、image的正確使用
iOS中從程式bundle中載入UIImage一般有兩種方法。 第一種比較常見:imageNamed
第二種方法很少使用:imageWithContentsOfFile
為什麼有兩種方法完成同樣的事情呢?imageNamed的優點在於可以快取已經載入的圖片。蘋果的文件中有如下說法: This method looks in the system caches for an image object with the specified name and returns that object if it exists. If a matching image object is not already in the cache, this method loads the image data from the specified file, caches it, and then returns the resulting object. 這種方法會在系統快取中根據指定的名字尋找圖片,如果找到了就返回。如果沒有在快取中找到圖片,該方法會從指定的檔案中載入圖片資料,並將其快取起來,然後再把結果返回。 而imageWithContentsOfFile
方法只是簡單的載入圖片,並不會將圖片快取起來。這兩個方法的使用方法如下:
UIImage *img = [UIImage imageNamed:@"myImage"]; // caching
// or
UIImage *img = [UIImage imageWithContentsOfFile:@"myImage"]; // no caching
複製程式碼
那麼該如何選擇呢? 如果載入一張很大的圖片,並且只使用一次,那麼就不需要快取這個圖片。這種情況imageWithContentsOfFile比較合適——系統不會浪費記憶體來快取圖片。
然而,如果在程式中經常需要重用的圖片,那麼最好是選擇imageNamed方法。這種方法可以節省出每次都從磁碟載入圖片的時間。
三十二、將圖片中間部分放大
根據圖片上下左右4邊的畫素進行自動擴充。
UIImage *image = [UIImage imageNamed:@"png-0016"];
UIImage *newImage = [image resizableImageWithCapInsets:UIEdgeInsetsMake(50, 50, 50, 50) resizingMode:UIImageResizingModeStretch];
UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(50, 50, 200, 400)];
imageView.image = newImage;
imageView.contentMode = UIViewContentModeScaleAspectFill;
複製程式碼
使用方法- (UIImage *)resizableImageWithCapInsets:(UIEdgeInsets)capInsets resizingMode:(UIImageResizingMode)resizingMode NS_AVAILABLE_IOS(6_0); // the interior is resized according to the resizingMode
進行對圖片的拉伸,可以使用UIImageResizingModeTile和UIImageResizingModeStretch兩種拉伸方式。 **注意: **此方法返回一個新的UIImage,需要使用這個新的image。
注:UIEdgeInsets設定的值不要上下或左右交叉,不然會出現中間為空白的情況。
在Xcode5中也可以使用新特性 Slicing,直接對圖片進行設定,不需要在程式碼中設定了。
三十三、UIImage和NSData的轉換
NSData *imageData = [NSData dataWithContentsOfFile:imagePath];
UIImage *aimage = [UIImage imageWithData:imageData];
//UIImage 轉化為 NSData
NSData *imageData = UIImagePNGRepresentation(aimage);
複製程式碼
三十四、NSDictionary和NSData轉換
// NSDictionary -> NSData:
NSData *myData = [NSKeyedArchiver archivedDataWithRootObject:myDictionary];
// NSData -> NSDictionary:
NSDictionary *myDictionary = (NSDictionary*) [NSKeyedUnarchiver unarchiveObjectWithData:myData];
複製程式碼
三十五、NSNumberFormatter 價格採用貨幣模式
如果顯示的數值為價格,則用貨幣模式
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
[formatter setNumberStyle:NSNumberFormatterCurrencyStyle];
self.introView.guaranteedDataLabel.text = [formatter stringFromNumber:self.quoteEntity.guranteedInfo.guaranteedPrice];
複製程式碼
三十六、畫虛線的方法
CGFloat lengths[] = {5, 5};
CGContextRef content = UIGraphicsGetCurrentContext();
CGContextBeginPath(content);
CGContextSetLineWidth(content, LINE_WIDTH);
CGContextSetStrokeColorWithColor(content, [UIColor blackColor].CGColor);
CGContextSetLineDash(content, 0, lengths, 2);
CGContextMoveToPoint(content, 0, rect.size.height - LINE_WIDTH);
CGContextAddLineToPoint(content, rect.size.width, rect.size.height - LINE_WIDTH);
CGContextStrokePath(content);
CGContextClosePath(content);
複製程式碼
三十七、裝置轉屏
- (BOOL)shouldAutorotate
{
return NO;
}
- (NSUInteger)supportedInterfaceOrientations {
return UIInterfaceOrientationMaskLandscapeLeft;
}
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
return UIInterfaceOrientationLandscapeLeft;
}
複製程式碼
在storyboard中設定只支援豎屏,可以在單個UIViewController中加入這3個方法,使得這個UIViewController只支援左橫屏。
三十八、UITextField 彈出UIDatePicker
設定UITextField的inputView可以不彈出鍵盤,而彈出UIDatePicker。
首先需要在View載入結束的時候指定文字的InputView
UIDatePicker *datePicker = [[UIDatePicker alloc] init];
datePicker.datePickerMode = UIDatePickerModeDate;
[datePicker addTarget:self action:@selector(dateChanged:) forControlEvents:UIControlEventValueChanged];
self.txtDate.inputView = datePicker;
複製程式碼
然後需要指定當UIDatePicker變動的時候的事件是什麼. 此處就是為了給文字框賦值.
- (IBAction)dateChanged:(id)sender
{
UIDatePicker *picker = (UIDatePicker *)sender;
self.txtDate.text = [NSString stringWithFormat:@"%@", picker.date];
}
複製程式碼
然後當文字框編輯結束時, 需要讓UIDatePicker消失.
- (IBAction)doneEditing:(id)sender
{
[self.txtDate resignFirstResponder];
}
複製程式碼
然後把文字框在IB中, 指向定義好的txtDate就行了~
三十九、將Status Bar字型設定為白色
-
在Info.plist中設定
UIViewControllerBasedStatusBarAppearance
為NO -
在需要改變狀態列顏色的ViewController中在ViewDidLoad方法中增加:
UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
複製程式碼
如果需要在全部View中都變色,可以寫在父類的相關方法中。
四十、UILongPressGestureRecognizer執行2次的問題
//會呼叫2次,開始時和結束時
- (void)hello:(UILongPressGestureRecognizer *)longPress
{
if (longPress.state == UIGestureRecognizerStateEnded)//需要新增一個判斷
{
NSLog(@"long");
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"hello"
message:@"Long Press"
delegate:self
cancelButtonTitle:@"OK"
otherButtonTitles:nil, nil];
[alert show];
}
}
複製程式碼
四十一、View中事件一次響應一個
self.scrollView.exclusiveTouch = YES;
複製程式碼
設定exclusiveTouch這個屬性為YES。
四十二、UIScrollView中立即響應操作
delaysContentTouches 屬性是UIScrollView中立即響應Touch事件。預設是YES,如果想點選後馬上有反應,則將該值設定為NO。
四十三、UITableView在Cell上新增自定義view
如果在UITableView上新增一個自定義的UIView,需要注意在view中的顏色會因為Cell被選中的點選色,而引起view的顏色變化,並且不可逆。
四十四、NSNotificationCenter 登出
當 NSNotificationCenter 註冊一個通知後
- (void)addObserver:(id)observer selector:(SEL)aSelector name:(nullableNSString *)aName object:(nullableid)anObject;
複製程式碼
在class的dealloc中,一定要使用
- (void)removeObserver:(id)observer name:(nullable NSString *)aName object:(nullable id)anObject;
複製程式碼
進行登出。
不能用 - (void)removeObserver:(id)observer;
進行通知的登出。
注意: 如果不登出,將導致class不會被釋放。
四十五、H5開發的弊端
H5開發的弊端: 佔用內容太多。在開啟H5的時候,會佔用大量的記憶體,在專案中看到,一般會達到一個頁面50M的記憶體。
四十六、interactivepopgesturerecognizer 使用
設定left bar button後,會導致右滑返回的效果失效,檢視完美的設定方案。
同時為了獲取到右滑返回的事件,可以執行
[self.navigationController.interactivePopGestureRecognizer addTarget:self action:@selector(back)];
複製程式碼
**在ViewController中viewDidAppare中新增,在viewWillDisappear中remove。 **
四十七、masonry 中使用兩個UIView之間設定layout
[self.bottomOpenStoreBtn mas_remakeConstraints:^(MASConstraintMaker *make) {
make.top.mas_equalTo(promptImageView.mas_bottom).with.offset(30);
make.height.mas_equalTo(44);
make.width.mas_equalTo(SCREEN_WIDTH - 30);
make.centerX.mas_equalTo(self.promptScrollView);
make.bottom.mas_equalTo(self.promptScrollView.mas_bottom).with.offset(-30);
}];
複製程式碼
設定self.bottomOpenStoreBtn的頂部與promptImageView的頂部距離30pt make.bottom.mas_equalTo(self.promptScrollView.mas_bottom).with.offset(-30);
其中的 self.promptScrollView.mas_bottom 必須使用mas_bottom,不能使用bottom.
make.top 中的top為 - (MASConstraint*)top
而 self.promptScrollView.bottom 中的bottom為
- (float) bottom
{ return CGRectGetMaxY (self.frame);
}
複製程式碼
即一個是layout屬性,另一個為frame的屬性。