欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

ios設(shè)置頁面開發(fā),ios界面設(shè)計(jì)

ios開發(fā)怎么在plist文件設(shè)置啟動(dòng)頁面

這不是個(gè)難題

白云鄂網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)建站,白云鄂網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為白云鄂1000+提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)網(wǎng)站建設(shè)要多少錢,請找那個(gè)售后服務(wù)好的白云鄂做網(wǎng)站的公司定做!

不管低版本的, 還是高版本的adobe actobat pro 還是reader 菜單欄的"編輯"欄的最正文均有一個(gè)叫"首先項(xiàng)"

"首先項(xiàng)"中有個(gè)"頁面顯示"

低版本的"頁面顯示"在下方, 高版本的"頁面顯示"在上方

只要在這個(gè)"頁面顯示"中的"默認(rèn)縮放"中的顯示比例選擇好了, 比如樓主要100%, 確定, 退出程序, 重新打開, 看效果

ios開發(fā)從設(shè)置頁面返回應(yīng)用執(zhí)行什么方法

文一

我從蘋果文檔中得知,一般的應(yīng)用在進(jìn)入后臺(tái)的時(shí)候可以獲取一定時(shí)間來運(yùn)行相關(guān)任務(wù),也就是說可以在后臺(tái)運(yùn)行一小段時(shí)間。

還有三種類型的可以運(yùn)行在后以,

1.音樂

2.location

3.voip

文二

在IOS后臺(tái)執(zhí)行是本文要介紹的內(nèi)容,大多數(shù)應(yīng)用程序進(jìn)入后臺(tái)狀態(tài)不久后轉(zhuǎn)入暫停狀態(tài)。在這種狀態(tài)下,應(yīng)用程序不執(zhí)行任何代碼,并有可能在任意時(shí)候從內(nèi)存中刪除。應(yīng)用程序提供特定的服務(wù),用戶可以請求后臺(tái)執(zhí)行時(shí)間,以提供這些服務(wù)。

判斷是否支持多線程

UIDevice* device = [UIDevice currentDevice];

BOOL backgroundSupported = NO;

if ([device respondsToSelector:@selector(isMultitaskingSupported)])

backgroundSupported = device.multitaskingSupported;

聲明你需要的后臺(tái)任務(wù)

Info.plist中添加UIBackgroundModes鍵值,它包含一個(gè)或多個(gè)string的值,包括

audio:在后臺(tái)提供聲音播放功能,包括音頻流和播放視頻時(shí)的聲音

location:在后臺(tái)可以保持用戶的位置信息

voip:在后臺(tái)使用VOIP功能

前面的每個(gè)value讓系統(tǒng)知道你的應(yīng)用程序應(yīng)該在適當(dāng)?shù)臅r(shí)候被喚醒。例如,一個(gè)應(yīng)用程序,開始播放音樂,然后移動(dòng)到后臺(tái)仍然需要執(zhí)行時(shí)間,以填補(bǔ)音頻輸出緩沖區(qū)。添加audio鍵用來告訴系統(tǒng)框架,需要繼續(xù)播放音頻,并且可以在合適的時(shí)間間隔下回調(diào)應(yīng)用程序;如果應(yīng)用程序不包括此項(xiàng),任何音頻播放在移到后臺(tái)后將停止運(yùn)行。

除了添加鍵值的方法,IOS還提供了兩種途徑使應(yīng)用程序在后臺(tái)工作:

Task completion—應(yīng)用程序可以向系統(tǒng)申請額外的時(shí)間去完成給定的任務(wù)

Local notifications—應(yīng)用程序可以預(yù)先安排時(shí)間執(zhí)行l(wèi)ocal notifications 傳遞

文三

如何讓程序后臺(tái)播放音樂

文四

如果你的應(yīng)用程序需要后臺(tái)運(yùn)行,可以使用以下方法:

1。應(yīng)用程序可以請求一個(gè)有限的時(shí)間內(nèi)完成一些重要任務(wù)。

2。應(yīng)用程序可以聲明為支持特定服務(wù)需要定期后臺(tái)執(zhí)行時(shí)間。

3。應(yīng)用程序可以使用本地生成用戶在指定的時(shí)間的警報(bào),應(yīng)用程序正在運(yùn)行與否的通知。

文五

后臺(tái)運(yùn)行被第一次提到

文六

后臺(tái)運(yùn)行官方文檔

在IOS后臺(tái)執(zhí)行是本文要介紹的內(nèi)容,大多數(shù)應(yīng)用程序進(jìn)入后臺(tái)狀態(tài)不久后轉(zhuǎn)入暫停狀態(tài)。在這種狀態(tài)下,應(yīng)用程序不執(zhí)行任何代碼,并有可能在任意時(shí)候從內(nèi)存中刪除。應(yīng)用程序提供特定的服務(wù),用戶可以請求后臺(tái)執(zhí)行時(shí)間,以提供這些服務(wù)。

判斷是否支持多線程

UIDevice* device = [UIDevice currentDevice];

BOOL backgroundSupported = NO;

if ([device respondsToSelector:@selector(isMultitaskingSupported)])

backgroundSupported = device.multitaskingSupported;

聲明你需要的后臺(tái)任務(wù)

Info.plist中添加UIBackgroundModes鍵值,它包含一個(gè)或多個(gè)string的值,包括

audio:在后臺(tái)提供聲音播放功能,包括音頻流和播放視頻時(shí)的聲音

location:在后臺(tái)可以保持用戶的位置信息

voip:在后臺(tái)使用VOIP功能

前面的每個(gè)value讓系統(tǒng)知道你的應(yīng)用程序應(yīng)該在適當(dāng)?shù)臅r(shí)候被喚醒。例如,一個(gè)應(yīng)用程序,開始播放音樂,然后移動(dòng)到后臺(tái)仍然需要執(zhí)行時(shí)間,以填補(bǔ)音頻輸出緩沖區(qū)。添加audio鍵用來告訴系統(tǒng)框架,需要繼續(xù)播放音頻,并且可以在合適的時(shí)間間隔下回調(diào)應(yīng)用程序;如果應(yīng)用程序不包括此項(xiàng),任何音頻播放在移到后臺(tái)后將停止運(yùn)行。

除了添加鍵值的方法,IOS還提供了兩種途徑使應(yīng)用程序在后臺(tái)工作:

Task completion—應(yīng)用程序可以向系統(tǒng)申請額外的時(shí)間去完成給定的任務(wù)

Local notifications—應(yīng)用程序可以預(yù)先安排時(shí)間執(zhí)行l(wèi)ocal notifications 傳遞

實(shí)現(xiàn)長時(shí)間的后臺(tái)任務(wù)

應(yīng)用程序可以請求在后臺(tái)運(yùn)行以實(shí)現(xiàn)特殊的服務(wù)。這些應(yīng)用程序并不連續(xù)的運(yùn)行,但是會(huì)被系統(tǒng)框架在合適的時(shí)間喚醒,以實(shí)現(xiàn)這些服務(wù)

1、 追蹤用戶位置:略

2、在后臺(tái)播放音頻:

添加UIBackgroundModes中audio值,注冊后臺(tái)音頻應(yīng)用。這個(gè)值使得應(yīng)用程序可以在后臺(tái)使用可聽的背景,如音樂播放或者音頻流應(yīng)用。對于支持音頻和視頻功能的應(yīng)用程序也可以添加該值以保證可以繼續(xù)持續(xù)的運(yùn)行流。

當(dāng)audio值設(shè)置后,當(dāng)你的應(yīng)用程序進(jìn)入后臺(tái)后,系統(tǒng)的多媒體框架會(huì)自動(dòng)阻止它被掛斷,但是,如果應(yīng)用程序停止播放音頻或者視頻,系統(tǒng)將掛斷應(yīng)用程序。

當(dāng)你的應(yīng)用程序在后臺(tái)時(shí),你可以執(zhí)行任意的系統(tǒng)音頻框架去初始化后臺(tái)音頻。你的應(yīng)用程序在后臺(tái)時(shí)應(yīng)該限制自身,使其執(zhí)行與工作相關(guān)的代碼,不能執(zhí)行任何與播放內(nèi)容無關(guān)的任務(wù)

由于有多個(gè)應(yīng)用程序支持音頻,前臺(tái)的應(yīng)用程序始終允許播放音頻,后臺(tái)的應(yīng)用程序也被允許播放一些音頻內(nèi)容,這取決于audio session object的設(shè)置。應(yīng)用程序應(yīng)該始終設(shè)置它們的audio session object,并小心的處理其他類型的音頻相關(guān)notifications和中斷。詳見audio session programming guide。

3、實(shí)現(xiàn)VOIP應(yīng)用:

VOIP程序需要穩(wěn)定的網(wǎng)絡(luò)去連接和它相關(guān)的服務(wù),這樣它才能接到來電和其他相關(guān)的數(shù)據(jù)。系統(tǒng)允許VOIP程序被掛斷并提供組件去監(jiān)聽它們的sockets,而不是在任意時(shí)候都處于喚醒狀態(tài)。設(shè)置VOIP應(yīng)用程序如下:

A、 添加UIBackgroundModes中的VOIP鍵值

B、 為VOIP設(shè)置一個(gè)應(yīng)用程序socket

C、在移出后臺(tái)之前,調(diào)用setKeepAliveTimeout:handler:方法去建立一個(gè)定期執(zhí)行的handler,你的應(yīng)用程序可以運(yùn)行這個(gè)handler來保持服務(wù)的連接。

D、 設(shè)置你的audio session去處理這種切換

釋義:

A、大多數(shù)VOIP應(yīng)用需要設(shè)置后臺(tái)audio 應(yīng)用去傳遞音頻,因此你應(yīng)該設(shè)置audio 和voip兩個(gè)鍵值。

B、為了使應(yīng)用程序在后臺(tái)時(shí)保持穩(wěn)定的連接,你必須tag你的主通訊socket專門應(yīng)用于VOIP,tagging這個(gè)socket來告訴系統(tǒng),它必須在你的應(yīng)用程序中斷時(shí)接管這個(gè)socket。這個(gè)切換本身對于你的應(yīng)用程序時(shí)透明的,當(dāng)新的數(shù)據(jù)到達(dá)socket的時(shí)候,系統(tǒng)會(huì)喚醒應(yīng)用程序,并將socket的控制權(quán)返回給應(yīng)用程序,這樣應(yīng)用程序就可以處理新來的數(shù)據(jù)。

你只需要tag用于voip服務(wù)的socket,這個(gè)socket用來接收來電或者其他相關(guān)的數(shù)據(jù)來保持你的VOIP服務(wù)的連接。根據(jù)收到的信息,這個(gè)socket要決定下一步的動(dòng)作。比如一個(gè)來電,你會(huì)想彈出一個(gè)本地的通知來告知用戶;對于其他不是那么關(guān)鍵的數(shù)據(jù),你可能會(huì)想悄悄的處理這些數(shù)據(jù)并讓系統(tǒng)將應(yīng)用程序重新中斷。

在IOS中,sockets是用流或者更高級(jí)的結(jié)構(gòu),設(shè)置一個(gè)VOIP的socket,你只需要在通常的設(shè)置中添加一個(gè)特殊的key來標(biāo)明這個(gè)接口是用于連接VOIP服務(wù)的,下表列出了流的接口和設(shè)置:

設(shè)置流接口用于voip

接口

設(shè)置

NSInputStream 和NSOutputStream

對于 Cocoa streams, 使用 setProperty:forKey: 方法添加

NSStreamNetworkServiceType

屬性給

stream.

改屬性的值設(shè)為

NSStreamNetworkServiceTypeVoIP.

NSURLRequest

對于 URL loading system, 使用 setNetworkServiceType:

method of your NSMutableURLRequest object to set the network service

type of the request. The service type should be set to

NSURLNetworkServiceTypeVoIP.

CFReadStreamRef和CFWriteStreamRef

For Core Foundation streams, use the CFReadStreamSetProperty or

CFWriteStreamSetProperty function to add the kCFStreamNetwork-

ServiceType property to the stream. The value for this property should be

set to kCFStreamNetworkServiceTypeVoIP.

(注意:當(dāng)設(shè)置socket的時(shí)候,你需要在你的主信號(hào)通道中設(shè)置合適的service type key。當(dāng)設(shè)置聲道時(shí),不需要設(shè)置這個(gè)key)

由于,VOIP應(yīng)用程序需要一直運(yùn)行以確保收到來電,所以如果程序通過一個(gè)非零的exit code退出,系統(tǒng)將自動(dòng)重啟這個(gè)應(yīng)用程序(這種退出方式可以發(fā)生在內(nèi)存壓力大時(shí)終止程序運(yùn)行)。盡管如此,中斷應(yīng)用程序會(huì)release所有的sockets,包括那個(gè)用于連接voip 服務(wù)的socket。因此,當(dāng)程序運(yùn)行時(shí),它需要一直從頭創(chuàng)建socket。

C、為了防止斷連,voip程序需要定期被喚醒去檢查它的服務(wù)。為了容易實(shí)現(xiàn)這個(gè)行為,IOS通過使用(UIApplication setKeepAliveTimeout:handler:)方法建立一個(gè)特殊的句柄。你可以在applicationDidEnterBackground方法中建立該句柄。一旦建立,系統(tǒng)至少會(huì)在超時(shí)之前調(diào)用該句柄一次,來喚醒你的應(yīng)用程序。

這個(gè)keep-alive handler在后臺(tái)執(zhí)行,必須盡快的返回參數(shù),它有最多30秒的時(shí)間來執(zhí)行所需的任務(wù),如果這段時(shí)間內(nèi)句柄沒有返回,那么系統(tǒng)將終止應(yīng)用程序。

當(dāng)你建立了handler之后,確定應(yīng)用程序所需的最大超時(shí)。系統(tǒng)保證會(huì)在最大超時(shí)之前調(diào)用handler,但是這個(gè)時(shí)間是不確定的,所以你的handler必須在你申明的超時(shí)之前做好執(zhí)行程序的準(zhǔn)備。

D、設(shè)置audio session,詳見Audio Session Programming Guide.

在后臺(tái)完成有限長度的任務(wù)

在被終止之前的任意時(shí)間,應(yīng)用程序會(huì)調(diào)用beginBackgroundTaskWithExpirationHandler:方法讓系統(tǒng)給出額外的時(shí)間來完成一些需要在后臺(tái)長時(shí)間執(zhí)行的任務(wù)。(UIApplication的backgroundTimeRemaining屬性包含程序運(yùn)行的總時(shí)間)

可以使用task completion去保證那些比較重要但是需要長時(shí)間運(yùn)行的程序不會(huì)由于用戶切入后臺(tái)而突然關(guān)閉。比如,你可以用這項(xiàng)功能來將用戶的信息保存到disk上或者從網(wǎng)絡(luò)下載一個(gè)重要的文件。有兩種方式來初始化這樣的任務(wù):

1、將長時(shí)間運(yùn)行的重要任務(wù)用beginBackgroundTaskWithExpirationHandler:和endBackgroundTask:包裝。這樣就在程序突然切入后臺(tái)的時(shí)候保護(hù)了這些任務(wù)不被中斷。

2、當(dāng)你的應(yīng)用程序委托applicationDidEnterBackground:方法被調(diào)用時(shí)再啟動(dòng)任務(wù)

中的兩個(gè)方法必須是一一對應(yīng)的,endBackgroundTask:方法告訴系統(tǒng)任務(wù)已經(jīng)完成,程序在此時(shí)可以被終止。由于應(yīng)用程序只有有限的時(shí)間去完成后臺(tái)任務(wù),你必須在超時(shí)或系統(tǒng)將要終止這個(gè)程序之前調(diào)用這個(gè)方法。為了避免被終止,你也可以在一個(gè)任務(wù)開始的時(shí)候提供一個(gè)expiration handler和endBackgroundTask:方法。(可以查看backgroundTimeRemaining屬性來確定還剩多少時(shí)間)。

一個(gè)程序可以同時(shí)提供多個(gè)任務(wù),每當(dāng)你啟動(dòng)一個(gè)任務(wù)的時(shí)候,beginBackgroundTaskWithExpirationHandler:方法將返回一個(gè)獨(dú)一無二的handler去識(shí)別這個(gè)任務(wù)。你必須在endBackgroundTask:方法中傳遞相同的handler來終止該任務(wù)。

Listing 4-2 Starting a background task at quit time

- (void)applicationDidEnterBackground:(UIApplication *)application

{

UIApplication* app = [UIApplication sharedApplication];

bgTask = [app beginBackgroundTaskWithExpirationHandler:^{

[app endBackgroundTask:bgTask];

bgTask = UIBackgroundTaskInvalid;

}];

// Start the long-running task and return immediately.

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,

0), ^{

// Do the work associated with the task.

[app endBackgroundTask:bgTask];

bgTask = UIBackgroundTaskInvalid;

});

}

上述例子中,bgTask變量是一個(gè)類的成員變量,存儲(chǔ)著指向該后臺(tái)任務(wù)標(biāo)示的指針。

在expriation handler中,可以添加關(guān)閉任務(wù)所需的代碼。盡管如此,加入的代碼不能執(zhí)行太長的時(shí)間,當(dāng)expriation handler被調(diào)用的時(shí)候,該程序已經(jīng)非常接近被關(guān)閉,所以只有極短的時(shí)間來清除狀態(tài)信息并終止任務(wù)。

安排Local Notification的傳遞

UILocalNotification類提供了一種方法來傳遞local notifications。和push notifications需要設(shè)置remote server不同,local notifications 在程序中安排并在當(dāng)前的設(shè)備上執(zhí)行。滿足如下條件可以使用該能力:

1、一個(gè)基于時(shí)間的程序,可以在將來特定的時(shí)間讓程序post 一個(gè)alert,比如鬧鐘

2、一個(gè)在后臺(tái)運(yùn)行的程序,post 一個(gè)local notification去引起用戶的注意

為了安排local notification 的傳遞,需要?jiǎng)?chuàng)建一個(gè)UILocalNotification的實(shí)例,并設(shè)置它,使用UIApplication類方法來安排它。Local notification對象包含了所要傳遞的類型(sound,alert,或者badge)和時(shí)間何時(shí)呈現(xiàn))。UIApplication類方法提供選項(xiàng)去確定是立即傳遞還是在指定的時(shí)間傳遞。

Listing 4-3 Scheduling an alarm notification

- (void)scheduleAlarmForDate:(NSDate*)theDate

{

UIApplication* app = [UIApplication sharedApplication];

NSArray* oldNotifications = [app scheduledLocalNotifications];

// Clear out the old notification before scheduling a new one.

if ([oldNotifications count] 0)

[app cancelAllLocalNotifications];

// Create a new notification.

UILocalNotification* alarm = [[[UILocalNotification alloc] init] autorelease];

if (alarm)

{

alarm.fireDate = theDate;

alarm.timeZone = [NSTimeZone defaultTimeZone];

alarm.repeatInterval = 0;

alarm.soundName = @"alarmsound.caf";

alarm.alertBody = @"Time to wake up!";

[app scheduleLocalNotification:alarm];

}

}

(可以最多包含128個(gè) local notifications active at any given time, any of which can be configured to repeat at a specified interval.)如果在調(diào)用該notification的時(shí)候,程序已經(jīng)處于前臺(tái),那么application:didReceiveLocalNotification:方法將取而代之。

小結(jié):關(guān)于詳解在IOS后臺(tái)執(zhí)行的內(nèi)容介紹完了,希望本文對你有所幫助!

文七

iOS不是真正的多任務(wù)系統(tǒng),在用戶按下Home按鈕后,所有應(yīng)用程序都會(huì)進(jìn)入后臺(tái)狀態(tài),并且大部分都會(huì)迅速進(jìn)入暫停狀態(tài),應(yīng)用程序的所有工作內(nèi)存都在RAM中,在暫停時(shí)它完全不執(zhí)行。因此,切換回這樣的應(yīng)用程序非常快。但是如果系統(tǒng)需要更多的內(nèi)存給當(dāng)前處于活動(dòng)狀態(tài)的應(yīng)用程序,就有可能終結(jié)暫停狀態(tài)的應(yīng)用程序,它們的內(nèi)存也將被釋放。

一方面,應(yīng)用程序在進(jìn)入后臺(tái)狀態(tài)時(shí),需要釋放一些資源,使自身的暫停快照更小,從而減少從RAM中清除的風(fēng)險(xiǎn),另一方面,為了避免被終結(jié)而丟失用戶的數(shù)據(jù),需要在用戶離開時(shí)保存他們的進(jìn)度信息,這些工作,需要在5秒鐘內(nèi)完成,不然會(huì)被系統(tǒng)認(rèn)定有異常被強(qiáng)制退出。可能通過接收應(yīng)用程序發(fā)送的通知(UIApplicationDidEnterBackgroundNotification)來觸發(fā)處理,如果在處理代碼中加上下面這條語句則必然會(huì)導(dǎo)致異常退出:

可以通過一種方法來請求更多后臺(tái)時(shí)間來避免此問題。假設(shè)接收通知而觸發(fā)的處理方法是applicationDidEnterBackground:

-(void)applicationDidEnterBackground{

NSLog(@"%@",NSStringFromSelector(_cmd));

//得到當(dāng)前應(yīng)用程序的UIApplication對象

UIApplication *app = [UIApplication sharedApplication];

//一個(gè)后臺(tái)任務(wù)標(biāo)識(shí)符

UIBackgroundTaskIdentifier taskID;

taskID = [app beginBackgroundTaskWithExpirationHandler:^{

//如果系統(tǒng)覺得我們還是運(yùn)行了太久,將執(zhí)行這個(gè)程序塊,并停止運(yùn)行應(yīng)用程序

[app endBackgroundTask:taskID];

}];

//UIBackgroundTaskInvalid表示系統(tǒng)沒有為我們提供額外的時(shí)候

if (taskID == UIBackgroundTaskInvalid) {

NSLog(@"Failed to start background task!");

return;

}

NSLog(@"Starting background task with %f seconds remaining", app.backgroundTimeRemaining);

[NSThread sleepForTimeInterval:10];

NSLog(@"Finishing background task with %f seconds remaining",app.backgroundTimeRemaining);

//告訴系統(tǒng)我們完成了

[app endBackgroundTask:taskID];

}

文八:

蘋果手機(jī):手機(jī)設(shè)置中的開發(fā)者選項(xiàng)在哪里?

1、需要軟件,打開xcode7,選擇Xcode - Windows-Devices

2、選擇自己的手機(jī),右鍵單擊選擇Show Provisioning Profiles.

3、就點(diǎn)擊“+”,添加開發(fā)者證書,完成后點(diǎn)擊“Done”。

拓展資料

開發(fā)者的功能:開發(fā)者就可以通過最新的SDK(軟件開發(fā)工具包)來備份整個(gè)手機(jī)系統(tǒng),而這個(gè)選項(xiàng)的功能就是事先設(shè)置一個(gè)備份密碼,當(dāng)開發(fā)者通過SDK備份手機(jī)系統(tǒng)時(shí),需要先輸入已經(jīng)設(shè)置好的桌面?zhèn)浞菝艽a才可以進(jìn)行備份,這樣最大程度地保證系統(tǒng)安全。

簡單但有用的開發(fā)選項(xiàng)設(shè)置的快捷方式。如果你是一個(gè)開發(fā)人員,你可能知道,這是很簡單的繞過鎖屏的設(shè)備上打開USB調(diào)試。

iOS應(yīng)用內(nèi)跳轉(zhuǎn)到系統(tǒng)設(shè)置頁面

在iOS開發(fā)中,有時(shí)會(huì)有跳轉(zhuǎn)系統(tǒng)設(shè)置界面的需求,例如提示用戶打開藍(lán)牙或者WIFI,提醒用戶打開推送或者位置權(quán)限等。在iOS6之后,第三方應(yīng)用需要跳轉(zhuǎn)系統(tǒng)設(shè)置界面,需要在URL type中添加一個(gè)Prefs值,如下圖:

需要設(shè)置Prefs

設(shè)置跳轉(zhuǎn)有三種方式,每一種的使用場景都不同。 并且你在跳轉(zhuǎn)到系統(tǒng)中自己應(yīng)用下面設(shè)置的時(shí)候,你的應(yīng)用要提前至少申請了某一個(gè)權(quán)限,如通知,定位等。否則,會(huì)引起崩潰。

當(dāng)iOS系統(tǒng)版本 iOS 10.0 時(shí)

當(dāng)iOS系統(tǒng)版本 =iOS 10.0 時(shí)

當(dāng) iOS系統(tǒng)版本 = iOS7時(shí) , 只能跳轉(zhuǎn)到 系統(tǒng)設(shè)置頁面

當(dāng) iOS系統(tǒng)版本 = iOS8 ,支持跳轉(zhuǎn)到第三方應(yīng)用的設(shè)置界面中

使用prefs:root=bundleID ,bundleID是你第三方應(yīng)用工程的唯一ID

局限性:只支持iOS8,iOS9系統(tǒng),在iOS10系統(tǒng)上,不會(huì)跳轉(zhuǎn)。

在iOS7系統(tǒng)上,僅僅只是跳轉(zhuǎn)到設(shè)置應(yīng)用,不推薦使用。

UIApplicationOpenSettingsURLString字段,是在iOS8上才提供的,支持iOS8,iOS9,iOS10系統(tǒng),推薦使用。

跳轉(zhuǎn)。

而 prefs:root=bundleID和 prefs:root=服務(wù) 都將不起作用。

方式一:prefs:root=某項(xiàng)服務(wù) 適用于 小于 iOS10的系統(tǒng);

方式二:prefs:root=bundleID 適用于 大于等于iOS8系統(tǒng),小于iOS10的系統(tǒng)

方式三:UIApplicationOpenSettingsURLString 適用于 大于等于iOS8的系統(tǒng)

開始用Swift開發(fā)iOS 10 - 19 使用UIPageViewController構(gòu)建介紹頁面

繼續(xù)上一篇 開始用Swift開發(fā)iOS 10 - 18 Search Bar 和 UISearchController ,這一篇使用 UIPageViewController 構(gòu)建介紹頁面,與使用 LaunchScreen.storyboard 的啟動(dòng)頁不同。

類似 UINavigationController , UIPageViewController 也是一種容器類型的控制器。這種容器類型的控制器是用來管理其它多個(gè)控制器的。

如果容器內(nèi)的控制器頁面元素類似(上圖就是這種情況),可以通過一個(gè)控制器重復(fù)利用。

setViewControllers 方法是設(shè)置 UIPageViewController 管理的視圖控制器。

頁面指示就是一般在頁面下用于分辨當(dāng)前是第一個(gè)頁面的幾個(gè)小點(diǎn)。

實(shí)現(xiàn) UIPageViewControllerDataSource 協(xié)議的兩個(gè)方法: presentationCount(for:) 表示總共有幾個(gè)小點(diǎn)(頁面)。

presentationIndex(for:) 表示當(dāng)前頁面的索引。

不用默認(rèn)的頁面指示,就要把上面兩個(gè)方法刪除,然后使用 UIPageControl 。

完成類似下面:

但因?yàn)橹笆抢?RestaurantTableViewController 的 viewDidAppear 方法顯示介紹頁的,而 viewDidAppear 方法是頁面顯示后就調(diào)用一下,這樣就出現(xiàn)不停進(jìn)入介紹頁。實(shí)際上只需要第一次打開app的時(shí)顯示介紹頁就可以了。

UserDefaults 是用來管理應(yīng)用和用戶相關(guān)的設(shè)置的。也就是可以用 UserDefaults 存儲(chǔ)一些用戶相關(guān)的少量數(shù)據(jù),比如上面的是否看過介紹頁,也就是是否點(diǎn)擊過DONE按鈕了。

UserDefaults 也是通過單例模式進(jìn)行操作的,通過類屬性 standard 獲取單例。

完成介紹頁。學(xué)習(xí)了 UIPageViewController 和 UserDefaults 。

Beginning-iOS-Programming-with-Swift

此文是學(xué)習(xí) appcode 網(wǎng)站出的一本書 《Beginning iOS 10 Programming with Swift》 的一篇記錄

ios開發(fā)中,如何實(shí)現(xiàn)手機(jī)設(shè)置那樣的頁面布局?

iOS 越來越人性化了,用戶可以在設(shè)置-通用-輔助功能中動(dòng)態(tài)調(diào)整字體大小了。你會(huì)發(fā)現(xiàn)所有 iOS 自帶的APP的字體大小都變了,可惜我們開發(fā)的第三方APP依然是以前的字體。在 iOS 7 之后我們可以用 UIFont 的preferredFontForTextStyle: 類方法來指定一個(gè)樣式,并讓字體大小符合用戶設(shè)定的字體大小。目前可供選擇的有六種樣式:

UIFontTextStyleHeadline UIFontTextStyleBody UIFontTextStyleSubheadline UIFontTextStyleFootnote UIFontTextStyleCaption1 UIFontTextStyleCaption2

iOS會(huì)根據(jù)樣式的用途來合理調(diào)整字體。

問題來了,諸如字體大小這種“動(dòng)態(tài)類型”,我們需要對其進(jìn)行動(dòng)態(tài)的UI調(diào)整,否則總是覺得我們的界面怪怪的:

我們想要讓Cell 的高度隨著字體大小而作出調(diào)整:

總之,還會(huì)有其他動(dòng)態(tài)因素導(dǎo)致我們需要修改布局。

解決方案

UITableView

有三種策略可以調(diào)節(jié)Cell(或者是Header和Footer)的高度:

a.調(diào)節(jié)Height屬性

b.通過委托方法tableView: heightForRowAtIndexPath:

c.Cell的“自排列”(self-sizing)

前兩種策略都是我們所熟悉的,后面將介紹第三種策略。UITableViewCell 和 UICollectionViewCell 都支持 self-sizing。

在 iOS 7 中,UITableViewDelegate新增了三個(gè)方法來滿足用戶設(shè)定Cell、Header和Footer預(yù)計(jì)高度的方法:

- tableView:estimatedHeightForRowAtIndexPath: - tableView:estimatedHeightForHeaderInSection: - tableView:estimatedHeightForFooterInSection:

當(dāng)然對應(yīng)這三個(gè)方法 UITableView 也 estimatedRowHeight、estimatedSectionHeaderHeight 和 estimatedSectionFooterHeight 三個(gè)屬性,局限性在于只能統(tǒng)一定義所有行和節(jié)的高度。

以 Cell 為例,iOS 會(huì)根據(jù)給出的預(yù)計(jì)高度來創(chuàng)建一個(gè)Cell,但等到真正要顯示它的時(shí)候,iOS 8會(huì)在 self-sizing 計(jì)算得出新的 Size 并調(diào)整 table 的 contentSize 后,將 Cell 繪制顯示出來。關(guān)鍵在于如何得出 Cell 新的 Size,iOS提供了兩種方法:

自動(dòng)布局

這個(gè)兩年前推出的神器雖然在一開始表現(xiàn)不佳,但隨著 Xcode 的越來越給力,在iOS7中自動(dòng)布局儼然成了默認(rèn)勾選的選項(xiàng),通過設(shè)定一系列約束來使得我們的UI能夠適應(yīng)各種尺寸的屏幕。如果你有使用約束的經(jīng)驗(yàn),想必已經(jīng)有了解決思路:向 Cell 的 contentView 添加約束。iOS 會(huì)先調(diào)用 UIView 的 systemLayoutSizeFittingSize: 方法來根據(jù)約束計(jì)算新的Size,如果你沒實(shí)現(xiàn)約束,systemLayoutSizeFittingSize: 會(huì)接著調(diào)用sizeThatFits:方法。

人工代碼

我們可以重寫sizeThatFits:方法來自己定義新的Size,這樣我們就不必學(xué)習(xí)約束相關(guān)的知識(shí)了。

下面我給出了一個(gè)用 Swift 語言寫的 Demo-HardChoice ,使用自動(dòng)布局來調(diào)整UITableViewCell的高度。我通過實(shí)現(xiàn)一個(gè)UITableViewCell的子類DynamicCell來實(shí)現(xiàn)自動(dòng)布局,你可以再GitHub上下載源碼:

import UIKit class DynamicCell: UITableViewCell { required init(coder: NSCoder) { super.init(coder: coder) if textLabel != nil { textLabel.font = UIFont.preferredFontForTextStyle(UIFontTextStyleHeadline) textLabel.numberOfLines = 0 } if detailTextLabel != nil { detailTextLabel.font = UIFont.preferredFontForTextStyle(UIFontTextStyleBody) detailTextLabel.numberOfLines = 0 } } override func constraints() - [AnyObject] { var constraints = [AnyObject]() if textLabel != nil { constraints.extend(constraintsForView(textLabel)) } if detailTextLabel != nil { constraints.extend(constraintsForView(detailTextLabel)) } constraints.append(NSLayoutConstraint(item: contentView, attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.GreaterThanOrEqual, toItem: contentView, attribute: NSLayoutAttribute.Height, multiplier: 0, constant: 44)) contentView.addConstraints(constraints) return constraints } func constraintsForView(view:UIView) - [AnyObject]{ var constraints = [NSLayoutConstraint]() constraints.append(NSLayoutConstraint(item: view, attribute: NSLayoutAttribute.FirstBaseline, relatedBy: NSLayoutRelation.Equal, toItem: contentView, attribute: NSLayoutAttribute.Top, multiplier: 1.8, constant: 30.0)) constraints.append(NSLayoutConstraint(item: contentView, attribute: NSLayoutAttribute.Bottom, relatedBy: NSLayoutRelation.GreaterThanOrEqual, toItem: view, attribute: NSLayoutAttribute.Baseline, multiplier: 1.3, constant: 8)) return constraints } }

上面的代碼需要注意的是,Objective-C中的類在Swift中都可以被當(dāng)做AnyObject,這在類型兼容問題上很管用。

別忘了在相應(yīng)的 UITableViewController 中的 viewDidLoad 方法中加上:

self.tableView.estimatedRowHeight = 44

自適應(yīng)效果如下:

UICollectionView

UITableView 和 UICollectionView 都是 data-source 和 delegate 驅(qū)動(dòng)的。UICollectionView 在此之上進(jìn)行了進(jìn)一步抽象。它將其子視圖的位置,大小和外觀的控制權(quán)委托給一個(gè)單獨(dú)的布局對象。通過提供一個(gè)自定義布局對象,你幾乎可以實(shí)現(xiàn)任何你能想象到的布局。布局繼承自 UICollectionViewLayout 抽象基類。iOS 6 中以 UICollectionViewFlowLayout 類的形式提出了一個(gè)具體的布局實(shí)現(xiàn)。在 UICollectionViewFlowLayout 中,self-sizing 同樣適用:

采用self-sizing后:

UICollectionView 實(shí)現(xiàn) self-sizing 不僅可以通過在 Cell 的 contentView 上加約束和重寫 sizeThatFits: 方法,也能在 Cell 層面(以前都是在 contentSize 上進(jìn)行 self-sizing)上做文章:重寫 UICollectionReusableView 的preferredLayoutAttributesFittingAttributes: 方法來在 self-sizing 計(jì)算出 Size 之后再修改,這樣就達(dá)到了對Cell布局屬性(UICollectionViewLayoutAttributes)的全面控制。

PS:preferredLayoutAttributesFittingAttributes: 方法默認(rèn)調(diào)整Size屬性來適應(yīng) self-sizing Cell,所以重寫的時(shí)候需要先調(diào)用父類方法,再在返回的 UICollectionViewLayoutAttributes 對象上做你想要做的修改。

由此我們從最經(jīng)典的 UICollectionViewLayout 強(qiáng)制計(jì)算屬性(還記得 UICollectionViewLayoutAttributes 的一系列工廠方法么?)到使用 self-sizing 來根據(jù)我們需求調(diào)整屬性中的Size,再到重寫UICollectionReusableView(UICollectionViewCell也是繼承于它)的 preferredLayoutAttributesFittingAttributes: 方法來從Cell層面對所有屬性進(jìn)行修改:

下面來說說如何在 UICollectionViewFlowLayout 實(shí)現(xiàn) self-sizing:

首先,UICollectionViewFlowLayout 增加了estimatedItemSize 屬性,這與 UITableView 中的 ”estimated...Height“ 很像(注意我用省略號(hào)囊括那三種屬性),但畢竟 UICollectionView 中的 Item 都需要約束 Height 和 Width的,所以它是個(gè) CGSIze,除了這點(diǎn)它與 UITableView 中的”estimated...Height“用法沒區(qū)別。

其...沒有其次,在 UICollectionView 中實(shí)現(xiàn) self-sizing,只需給 estimatedItemSize 屬性賦值(不能是 CGSizeZero ),一行代碼足矣。

InvalidationContext

假如設(shè)備屏幕旋轉(zhuǎn),或者需要展示一些其妙的效果(比如 CoverFlow ),我們需要將當(dāng)前的布局失效,并重新計(jì)算布局。當(dāng)然每次計(jì)算都有一定的開銷,所以我們應(yīng)該謹(jǐn)慎的僅在我們需要的時(shí)候調(diào)用 invalidateLayout 方法來讓布局失效。

在 iOS 6 時(shí)代,有的人會(huì)“聰明地”這樣做:

- (BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds { CGRect oldBounds = self.collectionView.bounds; if (CGRectGetWidth(newBounds) != CGRectGetWidth(oldBounds)) { return YES; } return NO; }

而 iOS 7 新加入的 UICollectionViewLayoutInvalidationContext 類聲明了在布局失效時(shí)布局的哪些部分需要被更新。當(dāng)數(shù)據(jù)源變更時(shí),invalidateEverything 和 invalidateDataSourceCounts 這兩個(gè)只讀 Bool 屬性標(biāo)記了UICollectionView 數(shù)據(jù)源“全部過期失效”和“Section和Item數(shù)量失效”,UICollectionView會(huì)將它們自動(dòng)設(shè)定并提供給你。

你可以調(diào)用invalidateLayoutWithContext:方法并傳入一個(gè)UICollectionViewLayoutInvalidationContext對象,這能優(yōu)化布局的更新效率。

當(dāng)你自定義一個(gè) UICollectionViewLayout 子類時(shí),你可以調(diào)用 invalidationContextClass 方法來返回一個(gè)你定義的 UICollectionViewLayoutInvalidationContext 的子類,這樣你的 Layout 子類在失效時(shí)會(huì)使用你自定義的InvalidationContext 子類來優(yōu)化更新布局。

你還可以重寫 invalidationContextForBoundsChange: 方法,在實(shí)現(xiàn)自定義 Layout 時(shí)通過重寫這個(gè)方法返回一個(gè) InvalidationContext 對象。

綜上所述都是 iOS 7 中新加入的內(nèi)容,并且還可以應(yīng)用在 UICollectionViewFlowLayout 中。在 iOS 8 中,UICollectionViewLayoutInvalidationContext 也被用在self-sizing cell上。

iOS8 中 UICollectionViewLayoutInvalidationContext 新加入了三個(gè)方法使得我們可以更加細(xì)致精密地使某一行某一節(jié)Item(Cell)、Supplementary View 或 Decoration View 失效:

invalidateItemsAtIndexPaths: invalidateSupplementaryElementsOfKind:atIndexPaths: invalidateDecorationElementsOfKind:atIndexPaths:

對應(yīng)著添加了三個(gè)只讀數(shù)組屬性來標(biāo)記上面那三種組件:

invalidatedItemIndexPaths invalidatedSupplementaryIndexPaths invalidatedDecorationIndexPaths

iOS自帶的照片應(yīng)用會(huì)將每一節(jié)照片的信息(時(shí)間、地點(diǎn))停留顯示在最頂部,實(shí)現(xiàn)這種將 Header 粘在頂端的功能其實(shí)就是將那個(gè) Index 的 Supplementary View 失效,就這么簡單。

UICollectionViewLayoutInvalidationContext 新加入的 contentOffsetAdjustment 和 contentSizeAdjustment 屬性可以讓我們更新 CollectionView 的 content 的位移和尺寸。

此外 UICollectionViewLayout 還加入了一對兒方法來幫助我們使用self-sizing:

shouldInvalidateLayoutForPreferredLayoutAttributes:withOriginalAttributes: invalidationContextForPreferredLayoutAttributes:withOriginalAttributes:

當(dāng)一個(gè)self-sizing Cell發(fā)生屬性發(fā)生變化時(shí),第一個(gè)方法會(huì)被調(diào)用,它詢問是否應(yīng)該更新布局(即原布局失效),默認(rèn)為NO;而第二個(gè)方法更細(xì)化的指明了哪些屬性應(yīng)該更新,需要調(diào)用父類的方法獲得一個(gè)InvalidationContext 對象,然后對其做一些你想要的修改,最后返回。

試想,如果在你自定義的布局中,一個(gè)Cell的Size因?yàn)槟撤N原因發(fā)生了變化(比如由于字體大小變化),其他的Cell會(huì)由于 self-sizing 而位置發(fā)生變化,你需要實(shí)現(xiàn)上面兩個(gè)方法來讓指定的Cell更新布局中的部分屬性;別忘了整個(gè) CollectionView 的 contentSize 和 contentOffset 因此也會(huì)發(fā)生變化,你需要給 contentOffsetAdjustment 和 contentSizeAdjustment 屬性賦值。

文章標(biāo)題:ios設(shè)置頁面開發(fā),ios界面設(shè)計(jì)
本文網(wǎng)址:http://chinadenli.net/article46/dsdsdeg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供小程序開發(fā)域名注冊ChatGPT品牌網(wǎng)站設(shè)計(jì)網(wǎng)站維護(hù)軟件開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

手機(jī)網(wǎng)站建設(shè)