Home php c# sql c c++ javascript python java go android git linux asp.net django .net node.js ios xcode cocoa iphone mysql tomcat mongodb bash objective-c scala visual-studio apache elasticsearch jar eclipse jquery ruby-on-rails ruby rubygems android-studio spring lua sqlite emacs ubuntu perl docker swift amazon-web-services svn html ajax xml java-ee maven intellij-idea rvm macos unix css ipad postgresql css3 json windows-server vue.js typescript oracle hibernate internet-explorer github tensorflow laravel symfony redis html5 google-app-engine nginx firefox sqlalchemy lucene erlang flask vim solr webview facebook zend-framework virtualenv nosql ide twitter safari flutter bundle phonegap centos Register | Login | Edit Tags | New Questions | 繁体 | 简体


10 questions online user: 39

0
votes
answers
11 views
+10

UICollectionView崩潰下載時圖像

0

斯威夫特4: 我得到一個錯誤約UICollectionView崩潰下載時圖像

「意外發現零而展開的可選值」

和斷點是我downloadImage而我從JSON查詢中填入UICollectionView

有關我如何使這更安全的任何建議?還是我看錯了東西? 這裏是downloadImage代碼:

extension UIImageView { 
    @objc func downloadImage(from url: String){ 
     let urlRequest = URLRequest(url: URL(string: url)!) 
     let task = URLSession.shared.dataTask(with: urlRequest) { (data, response, error) in 

      if error != nil { 
       print(error as Any) 
       return 
      } 
      DispatchQueue.main.async { 
       if UIImage(data: data!) != nil { 
       self.image = UIImage(data: data!) 
       } 
      } 

     } 
     task.resume() 

    } 

這裏是函數填充的CollectionView它打破:

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 

     let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "articleCell", for: indexPath) as! ArticleCell 

     cell.title.text = self.articles?[indexPath.item].headline 

//這裏崩潰

cell.imgView.downloadImage(from: (self.articles?[indexPath.item].imageURL!)!) 

    cell.contentView.layer.cornerRadius = 0.5 
    cell.contentView.layer.borderWidth = 1.0 

    cell.contentView.layer.borderColor = UIColor.clear.cgColor 
    cell.contentView.layer.masksToBounds = true 

    cell.layer.shadowColor = UIColor.gray.cgColor 
    cell.layer.shadowOffset = CGSize(width: 0, height: 0.5) 
    cell.layer.shadowRadius = 1 
    cell.layer.shadowOpacity = 0.5 
    cell.layer.masksToBounds = false 
    cell.layer.shadowPath = UIBezierPath(roundedRect:cell.bounds, cornerRadius:cell.contentView.layer.cornerRadius).cgPath 


    return cell 


} 

這裏是控制檯輸出:

2017-12-18 06:55:08.412546+0100 Keyboard[81355:4788284] Failed to inherit CoreMedia permissions from 81260: (null) 
2017-12-18 06:55:08.634498+0100 Keyboard[81355:4788188] [MC] Lazy loading NSBundle MobileCoreServices.framework 
2017-12-18 06:55:08.635348+0100 Keyboard[81355:4788188] [MC] Loaded MobileCoreServices.framework 
2017-12-18 06:55:08.637140+0100 Keyboard[81355:4788188] [MC] System group container for systemgroup.com.apple.configurationprofiles path is /Users/me/Library/Developer/CoreSimulator/Devices/9BAC6166-3559-4962-9715-F388A162E95F/data/Containers/Shared/SystemGroup/systemgroup.com.apple.configurationprofiles 
Category: business 
true 
Fatal error: Unexpectedly found nil while unwrapping an Optional value 
2017-12-18 06:55:11.138236+0100 Keyboard[81355:4788188] Fatal error: Unexpectedly found nil while unwrapping an Optional value 
(lldb) 

這裏是調試:

libswiftCore.dylib`function signature specialization <preserving fragile attribute, Arg[2] = Dead, Arg[3] = Dead> of Swift._fatalErrorMessage(Swift.StaticString, Swift.StaticString, file: Swift.StaticString, line: Swift.UInt, flags: Swift.UInt32) -> Swift.Never: 
    0x113a5e420 <+0>: pushq %rbp 
    0x113a5e421 <+1>: movq %rsp, %rbp 
    0x113a5e424 <+4>: pushq %r15 
    0x113a5e426 <+6>: pushq %r14 
    0x113a5e428 <+8>: pushq %r13 
    0x113a5e42a <+10>: pushq %r12 
    0x113a5e42c <+12>: pushq %rbx 
    0x113a5e42d <+13>: pushq %rax 
    0x113a5e42e <+14>: movl %r9d, %r14d 
    0x113a5e431 <+17>: movq %r8, %r15 
    0x113a5e434 <+20>: movq %rcx, %rbx 
    0x113a5e437 <+23>: movl %edx, -0x2c(%rbp) 
    0x113a5e43a <+26>: movq %rsi, %r13 
    0x113a5e43d <+29>: movq %rdi, %r12 
    0x113a5e440 <+32>: leaq 0x1c6551(%rip), %rdi  ; protocol descriptor for Swift._DefaultCustomPlaygroundQuickLookable + 136 
    0x113a5e447 <+39>: movl $0x28, %esi 
    0x113a5e44c <+44>: movl $0x7, %edx 
    0x113a5e451 <+49>: callq 0x113a826b0    ; swift_rt_swift_allocObject 
    0x113a5e456 <+54>: movq %rbx, 0x10(%rax) 
    0x113a5e45a <+58>: movq %r15, 0x18(%rax) 
    0x113a5e45e <+62>: movb %r14b, 0x20(%rax) 
    0x113a5e462 <+66>: movl 0x10(%rbp), %ecx 
    0x113a5e465 <+69>: movl %ecx, 0x24(%rax) 
    0x113a5e468 <+72>: leaq 0xd4c81(%rip), %rcx  ; partial apply forwarder for closure #2 (Swift.UnsafeBufferPointer<Swift.UInt8>) ->() in Swift._fatalErrorMessage(Swift.StaticString, Swift.StaticString, file: Swift.StaticString, line: Swift.UInt, flags: Swift.UInt32) -> Swift.Never 
    0x113a5e46f <+79>: movq %r12, %rdi 
    0x113a5e472 <+82>: movq %r13, %rsi 
    0x113a5e475 <+85>: movl -0x2c(%rbp), %edx 
    0x113a5e478 <+88>: movq %rax, %r8 
    0x113a5e47b <+91>: callq 0x1138aa1b0    ; function signature specialization <preserving fragile attribute, Arg[1] = [Closure Propagated : reabstraction thunk helper from @callee_owned (@unowned Swift.UnsafeBufferPointer<Swift.UInt8>) ->() to @callee_owned (@unowned Swift.UnsafeBufferPointer<Swift.UInt8>) -> (@out()), Argument Types : [@callee_owned (@unowned Swift.UnsafeBufferPointer<Swift.UInt8>) ->()]> of generic specialization <preserving fragile attribute,()> of Swift.StaticString.withUTF8Buffer<A>((Swift.UnsafeBufferPointer<Swift.UInt8>) -> A) -> A 
-> 0x113a5e480 <+96>: ud2  
    0x113a5e482 <+98>: nopw %cs:(%rax,%rax) 

這裏是你們在詢問該URL的控制檯輸出 - 它看起來像一個類別被點擊時,它的第一類加載的圖像確定,但隨後發現零。

Optional("http://www.afr.com/content/dam/images/h/0/6/g/p/6/image.related.socialLead.620x349.h06bfz.png/1513570709452.jpg") 
Optional("http://www.afr.com/content/dam/images/h/0/6/b/z/i/image.related.afrArticleLead.620x365.h06aej.png/1513559758977.jpg") 
Optional("http://www.afr.com/content/dam/images/h/0/6/f/x/o/image.related.afrArticleLead.620x365.h06bh0.png/1513563680637.jpg") 
Optional("http://assets1.ignimgs.com/2017/12/15/15234538txuhe2cy-1513377967388_1280w.jpg") 
Optional("http://assets1.ignimgs.com/2017/12/18/the-last-jedi-2-1513558653477_1280w.jpg") 
Fatal error: Unexpectedly found nil while unwrapping an Optional value 
2017-12-18 07:07:03.222266+0100 Keyboard[87661:4872775] Fatal error: Unexpectedly found nil while unwrapping an Optional value 
(lldb) 

我該如何優雅地接受函數中的這個nil值?

+0

可以粘貼你的崩潰日誌? –

+1

你的網址在這行中必須爲「self.articles?[indexPath.item] .imageURL!」。或者在這裏「URL(string:url)!」 。請檢查您的網址 –

+0

您可以調試以檢查此結果(self.articles?[indexPath.item] .imageURL!)!每次當你下載圖像。我認爲有一個URL –

沙发
0
2

嘗試下面的代碼,並總是試圖避免強制解包(!)。

extension UIImageView { 

@objc func downloadImage(from url: String){ 

    if let urlconvert = url.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed),let urlConvertible = URL(string:urlconvert){ 

     let urlRequest = URLRequest(url: urlConvertible) 
     let task = URLSession.shared.dataTask(with: urlRequest) { (data, response, error) in 

      if error != nil { 
       print(error as Any) 
       return 
      } 
      DispatchQueue.main.async { 
       if let data = data { 

        self.image = UIImage(data: data) 
       } 
      } 

     } 
     task.resume() 

    } 
    } 

} 

變化這一個

cell.imgView.downloadImage(from: (self.articles?[indexPath.item].imageURL!)!) 

到:

if let imageURL = self.articles?[indexPath.item].imageURL{ 

cell.imgView.downloadImage(from: imageURL) 
} 
+0

感謝您的例子,不幸的是仍然看到相同的行爲 –

+0

嘗試改變cell.imgView.downloadImage – adarshaU

+0

這很好,我現在可以看到圖像不存在於每個返回的故事。謝謝! –

0
votes
answers
9 views
+10

無法從Swift中的Realm對象服務器獲取數據

0

我想使用Realm Object Server在智能手機之間共享數據,並使用Swift創建了此代碼。 (我使用領域 - > 3.0.2 ROS - >最新)無法從Swift中的Realm對象服務器獲取數據

let realmAuthURL = URL(string:"http://[server_address]:9080")! 
let realmURL = URL(string:"realm://[server_address]:9080/~/realm")! 
let credentials = SyncCredentials.usernamePassword(username: "[username]", password: "[password]") 

SyncUser.logIn(with: credentials, server: realmAuthURL) { user, error in 
    DispatchQueue.main.async { 
     if let user = user { 
      Realm.Configuration.defaultConfiguration = Realm.Configuration(
       syncConfiguration: SyncConfiguration(user: user, realmURL: realmURL), 
       objectTypes: [PCData.self] 
      ) 
      print("ログインに成功しました") 
      self.realm = try! Realm(configuration: Realm.Configuration.defaultConfiguration) 
      //print(self.realm.objects(PCData.self)) 

      if self.realm.isEmpty { 
       try! self.realm.write { 
        let data = PCData() 
        data.isOut = false 
        data.pcCode = "***METADATA***" 
        data.rentPCto = "" 
        data.IDinCourse = 999999999999 
        data.belonging = "Master" 

        self.realm.add(data) 
       } 
      } 
     } 


    } 
} 

當我試了一下, 「ログインに成功しました」 被輸出,且服務器已被訪問

似乎日誌

然而,

2017-12-17 22:53:30.880875+0900 PCManage[7021:1784833] Sync: Connection[1]: Connection closed due to error 
2017-12-17 22:53:31.673562+0900 PCManage[7021:1784833] Sync: Connection[1]: Connected to endpoint '[Server's IP]:9080' (from '[My IP]:57032') 
2017-12-17 22:53:31.684189+0900 PCManage[7021:1784833] Sync: Connection[1]: Writing failed: End of input  

這是不可能得到的數據等 在服務器。

proxy: attempting to upgrade client [My IP]:57032 => headers: {"authorization":"Realm-Access-Token version=1 token="eyJhY2Nlc3MiOlsiZG93bmxvYWQiLCJ1cGxvYWQiLCJtYW5hZ2UiXSwiYXBwX2lkIjoiY29tLmFrYmFydC5hcHAuUVJ0ZXN0IiwiZXhwaXJlcyI6MTUxMzUxOTQwOCwiaWQiOiIwMzdmY2I5Yzc0MGE0ZjdhOGVhOTZkZmFhYjUxNmM2ZiIsImlkZW50aXR5IjoiZmI0NmQ1ZjNjYjRiNmE5NWExYWYyNDkzZGIxNjE5YzYiLCJwYXRoIjoiL2ZiNDZkNWYzY2I0YjZhOTVhMWFmMjQ5M2RiMTYxOWM2L3JlYWxtIn0=:Tn4Qa4vzvZ87lnW2htmt6rPCaLL5ASDkpqbcXT2eKskQ3NHJ3ePyMxvJjjyAq5rh8pb2syCM1Dh8LrVk9RilQsHwHRU9HyDOky/psePE4UfXidEJGYoML19R9mo+yjHPG7DeP0ykYltTjONJh+OpQkaelHYIMlKAwFP+hxeNWlVAIpjohkqmyr/de3++8IxcVV6/6wJUESdNpDq2e5GGKfxpSwbfhBagNi0m0aSNuwzoqJ5CFqbyoxsyyCZWx6XJ7ZueTmRvGx22SJcthRzxrQRrWMbMtF8yEHY/AARzycO/A/Zi5spXqAzQD6QIrkl5gGI/FwvnLvhvtPEFychXIg=="","connection":"Upgrade","host":"[]","sec-websocket-key":"K0Tw7zhY3ov9h+VEqHtaPQ==","sec-websocket-protocol":"io.realm.sync.22","sec-websocket-version":"13","upgrade":"websocket"}.} 
sync: HTTP Connection[959]: Connection from 127.0.0.1:35414 
sync: HTTP Connection[959]: Connection initiates HTTP receipt 
sync: HTTP Connection[959]: HTTP request received, url = /realm-sync/%2Ffb46d5f3cb4b6a95a1af2493db1619c6%2Frealm 
sync: HTTP Connection[959]: 404 Not Found 
sync: HTTP Connection[959]: Connection is closed after HTTP response. 

404未潤版液顯示 我認爲,在服務器端,現在很奇怪,但我還沒有從最初的設置更改,所以我不知道哪裏錯了 我怎樣才能獲得數據?

+0

當您提供軟件版本時,請指定您正在使用的精確版本。 「最新」通常只是誤導性的,並且通常表示最新的版本未被使用。 – bdash

沙发
0
0

您共享的日誌消息似乎表明您正在使用Realm Object Server v1.x. Realm Swift 3.x需要Realm Object Server v2.x.有關安裝ROS v2.x的說明,請參閱Realm Object Server documentation

0
votes
answers
9 views
+10

RXSwift,檢測重入異常

0

我在RXSwift初學者,我有問題,我的代碼RXSwift,檢測重入異常

我有代碼:

let dartScore = PublishSubject<Int>() 
      dartScore.asObservable() 
       .scan(501) { intermediate, newValue in 
        let result = intermediate - newValue 
        return result >= 0 ? result : intermediate 
       } 
       .do(onNext: { 
        if $0 == 0 { 
         dartScore.onCompleted() 
        } 
       }) 
       .subscribe({ 
        print($0.isStopEvent ? $0 : $0.element!) 
       }) 
       .disposed(by: disposeBag) 

      dartScore.onNext(13) 
      dartScore.onNext(50) 
      dartScore.onNext(60) 
      dartScore.onNext(378) 

,我得到錯誤:

?? Reentrancy anomaly was detected. ??

Debugging: To debug this issue you can set a breakpoint in /****RxSwift/RxSwift/Rx.swift:97 and observe the call stack.

Problem: This behavior is breaking the observable sequence grammar. next (error | completed)? This behavior breaks the grammar because there is overlapping between sequence events. Observable sequence is trying to send an event before sending of previous event has finished.

爲什麼我不能在.do(onNext)中執行「.onCompleted()」,我該怎麼做才能避免警告?

我使用的XCode 9.0,快捷4,RXSwift 4.0.0

謝謝

問候

+2

我是說的Rx完成.NET的傢伙,但我認爲RxSwift的行爲方式相同 - 所以不要在'do'內部執行'.onCompleted()'。你可能想使用'takeWhile'。 – Enigmativity

+0

謝謝你的建議,@Enigmtivity, Regards –

沙发
0
1

你不能做.onCompleted().onNext()裏面,因爲你將有可觀察在這種情況下吃自己的尾巴。這也會導致一個內存循環。

由於@Enigmativity的意見建議,你應該使用takeWhile()來處理這種情況:

dartScore.asObservable() 
    .scan(501) { intermediate, newValue in 
     let result = intermediate - newValue 
     return result >= 0 ? result : intermediate 
    } 
    .takeWhile { $0 != 0 } 
    .subscribe({ 
     print($0.isStopEvent ? $0 : $0.element!) 
    }) 

上述方法產生一個新的觀察到當值0

+0

呵呵,好了,明白了,謝謝你的回答:) Regards –

0
votes
answers
9 views
+10

附加到UserDefaults數組(Swift)

1

我想創建一個Ints數組,我可以將它添加到UserDefaults,以便下次用戶打開應用程序時,數組將被保存。所以,我知道如何創建一個UserDefaults陣列...附加到UserDefaults數組(Swift)

var intArray = UserDefaults.standard.array(forKey: "intArray") as! [Int] 

,我知道如何設置陣列到已經存在的數組:

var array = [2, 6, 34, 4, 9] 
UserDefaults.standard.set(array, forKey: "intsArray") 

但是,我需要的數組是空的然後用戶將Ints添加到數組中。謝謝你的幫助!

沙发
0
0

取而代之的是:

var intArray = UserDefaults.standard.array(forKey: "intArray") as! [Int] 

做到這一點:

var intArray = UserDefaults.standard.array(forKey: "intArray") as? [Int] ?? [] 

這將初始化數組中,它並沒有在缺省數據庫中存在的情況下,空數組(或者,如果它以某種方式損壞,它不會解析爲數組Int s)。

無論如何,避免使用as!這是非常好的做法,否則如果您的默認設置變壞,您將會在閱讀時崩潰。

+0

這確實起初工作,但隨後每當應用程序關閉並再次打開時,數組回到空... –

+0

@JacobCavin在將某些修改後的數組添加到用戶默認值後,是否將修改後的數組寫入? –

板凳
0
0

不確定你需要什麼。

然而,這是你如何添加一個空數組UserDefaults

UserDefaults.standard.set([Int](), forKey: "nums") 

而且你這是怎麼

  1. 負荷UserDefaults陣列
  2. 再次增加值
  3. 將它保存到UserDefaults

var nums = UserDefaults.standard.array(forKey: "nums") as! [Int] 
nums.append(1) 
UserDefaults.standard.set(nums, forKey: "nums") 
地板
0
0

我建議你爲此創建一個計算的屬性:只要您修改intArray將在UserDefaults更新它的值

var intArray: [Int] { 
    get { 
     return UserDefaults.standard.array(forKey: "intArray") as? [Int] ?? [] 
    } 
    set { 
     UserDefaults.standard.set(newValue, forKey: "intArray") 
    } 
} 

現在,每當你叫intArray它返回你的價值來自UserDefaults。

0
votes
answers
9 views
+10

加密RSA/ECB/OAEPWithSHA-256AndMGF1Padding Swift

2

我要提前說我對加密技術不瞭解太多(僅限基礎知識)。我正在嘗試實施Credential OpenHome服務,並且想要加密密碼以將其發送到設備。加密RSA/ECB/OAEPWithSHA-256AndMGF1Padding Swift

該設備提供C語言編寫一個函數返回一個公共密鑰字符串,看起來像這樣:

MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCzjFGuEKD0uWxzb47oRbiSP2uDwVJPeWU7m9VXi626V6lameTzdtwj2eYVZTIAsAW7yW4or2skn7oHqFG4GvhMzgMwoQjKFxeCPPFXRSotnt26AN1DhvFJp3V/d+MpmkzI07iWcD5eNe4EVNK9GSE4JOEHhJ/JYBVMiu04XE5aqwIDAQAB 

Android的實施已經做了和給出的規格是

RSA/ECB/OAEPWithSHA-256AndMGF1Padding

也有一個網站加密

時,讓 「指示」

http://wiki.openhome.org/wiki/Av:Developer:CredentialsService

到目前爲止我這些庫嘗試:

SwiftyRSA,海姆達爾,SwCrypt

我真的東西,我的主要故障是一個我不明白我有什麼我需要和最後如何使用swift來實現它。

最好在年底,我將有一個功能,如

func encryptMessage(message:String, whithPublicKey key:String)->String 

非常感謝你。

+0

不知道你的錯誤或障礙就是我的公鑰和私鑰,其中android上產生!該過程看起來像需要使用ECB分組密碼和OAEP填充中的RSA服務器共享的公鑰來生成密碼的加密消息並將其發送回服務器。 OAEPWithSHA-256AndMGF1Padding是非常不尋常的,所以只需檢查哪些庫支持這一點。 – carbonr

+0

公鑰由服務器給出。所以我假設服務器有一個用於解密消息的私鑰。我想知道如何使用提供的公鑰和規範來加密郵件。 –

+0

「我到目前爲止試過這些圖書館......」和?什麼地方出了錯?你的代碼在哪裏嘗試? –

沙发
0
1

經過長時間的研究,我剛剛實現了我自己的解決方案,而不是使用庫並且不理解發生了什麼。知道會發生什麼總是件好事,而這種情況並非火箭科學。

在iOS上,如果您想加密/解密,您需要使用存儲在鑰匙串上的密鑰。如果,在我的情況下,我已經給了我的公鑰,我可以導入它,而且我也可以用私鑰做同樣的事情。請參閱我的HelperClass Here

然後,從只能從iOS的10,你可以調用此2種方法進行加密和解密

 let error:UnsafeMutablePointer<Unmanaged<CFError>?>? = nil 
     let plainData = "A Plain text...".data(using: .utf8) 
     if let encryptedMessageData:Data = SecKeyCreateEncryptedData(publicSecKey, .rsaEncryptionOAEPSHA256, plainData! as CFData,error) as Data?{ 
      print("We have an encrypted message") 

      let encryptedMessageSigned = encryptedMessageData.map { Int8(bitPattern: $0) } 
      print(encryptedMessageSigned) 

      if let decryptedMessage:Data = SecKeyCreateDecryptedData(privateSecKey, .rsaEncryptionOAEPSHA256, encryptedMessageData as CFData,error) as Data?{ 
       print("We have an decrypted message (String.init(data: decryptedMessage, encoding: .utf8)!)") 
      } 
      else{ 
       print("Error decrypting") 
      } 

     } 
     else{ 
      print("Error encrypting") 
     } 

另外,如果你的iOS前10希望你具備的功能:

func SecKeyEncrypt(_ key: SecKey, 
      _ padding: SecPadding, 
      _ plainText: UnsafePointer<UInt8>, 
      _ plainTextLen: Int, 
      _ cipherText: UnsafeMutablePointer<UInt8>, 
      _ cipherTextLen: UnsafeMutablePointer<Int>) -> OSStatus 

func SecKeyDecrypt(_ key: SecKey, 
      _ padding: SecPadding, 
      _ cipherText: UnsafePointer<UInt8>, 
      _ cipherTextLen: Int, 
      _ plainText: UnsafeMutablePointer<UInt8>, 
      _ plainTextLen: UnsafeMutablePointer<Int>) -> OSStatus 

但是,這些給予較少的選項,他們相當搶手。

值得一提的是,使用

public static String createStringFromPublicKey(Key key) throws Exception { 
X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(key.getEncoded()); 
return new String(Base64.encode(x509EncodedKeySpec.getEncoded(), Base64.NO_WRAP), "UTF-8"); 

}

public static String createStringFromPrivateKey(Key key) throws Exception { 
PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(key.getEncoded()); 
return new String(Base64.encode(pkcs8EncodedKeySpec.getEncoded(), Base64.NO_WRAP), "UTF-8"); 

}

0
votes
answers
8 views
+10

視圖沒有越過

-1

我需要設計一個像圓角和陰影一樣的視圖。我有一個容器視圖,裏面有另一個視圖,就像我附加的圖像。但是當我爲外容器視圖應用圓角半徑時,除了具有內部視圖的區域外,半徑已經設置。如果我將它製作成clipToBounds = true,那麼它會遍體鱗傷,但陰影不會到來。所以plz幫助我在這裏。視圖沒有越過

這裏是我的代碼

containerView.layer.masksToBounds = false 
    containerView.layer.shadowColor = UIColor.black.cgColor 
    containerView.layer.shadowOpacity = 0.5 
    containerView.layer.shadowOffset = CGSize(width: -1, height: 1) 
    containerView.layer.shadowRadius = 5 
    containerView.backgroundColor = UIColor.white 
    containerView.layer.cornerRadius = 20 

我附上下面的圖片爲我的問題。 View Image

+0

能否請您分享一些代碼或者即使你的代碼是回購? –

+0

我已經在上面添加了我的代碼。提前感謝 – Hyder

沙发
0
0

你有兩種觀點,超級觀點及其子視圖,與你的目標有衝突。

  • 一方面,您希望超視圖的角半徑影響其子視圖。只有當超級視圖掩蓋其界限時纔會發生這種情況。

  • 另一方面,你想要超級觀點的陰影出現。只有在超級觀點不對其界限掩蓋時纔會發生這種情況。

所以你想要的是邏輯上的不可能性。

該解決方案很簡單。使用三個意見!在兩個視圖之間劃分陰影和裁剪的工作。

  • 最外面的視圖具有拐角半徑和陰影,並且不掩蓋邊界。這是影子製作人。

  • 下一個視圖是它的子視圖。它是完全一樣的大小,並且它也圓角半徑和它確實面具界限。這是快船。

  • 下一個視圖是子視圖的內容,子視圖。它將被第二個視圖遮擋,所以角落的半徑會影響它。

0
votes
answers
8 views
+10

UILabel上的文本填充

1

在這裏,我試圖在文本週圍添加一些填充(左,右,上和下)的標籤。 這一問題已經在SOF和閱讀他們幾個後相關的帖子,我試圖用一個解決方案提出hereUILabel上的文本填充

這是我的子類的UILabel代碼:

import UIKit 

class LuxLabel: UILabel { 
    //let padding: UIEdgeInsets 
    var padding: UIEdgeInsets = UIEdgeInsets.zero { 
     didSet { 
      self.invalidateIntrinsicContentSize() 
     } 
    }  

    // Create a new PaddingLabel instance programamtically with the desired insets 
    required init(padding: UIEdgeInsets = UIEdgeInsets(top: 0, left: 10, bottom: 0, right: 10)) { 
     self.padding = padding 
     super.init(frame: CGRect.zero) 
    } 

    // Create a new PaddingLabel instance programamtically with default insets 
    override init(frame: CGRect) { 
     padding = UIEdgeInsets.zero // set desired insets value according to your needs 
     super.init(frame: frame) 
    } 

    // Create a new PaddingLabel instance from Storyboard with default insets 
    required init?(coder aDecoder: NSCoder) { 
     padding = UIEdgeInsets.zero // set desired insets value according to your needs 
     super.init(coder: aDecoder) 
    } 

    override func drawText(in rect: CGRect) { 
     super.drawText(in: UIEdgeInsetsInsetRect(rect, padding)) 
    } 

    // Override `intrinsicContentSize` property for Auto layout code 
    override var intrinsicContentSize: CGSize { 
     let superContentSize = super.intrinsicContentSize 
     let width = superContentSize.width + padding.left + padding.right 
     let heigth = superContentSize.height + padding.top + padding.bottom 
     return CGSize(width: width, height: heigth) 
    } 
} 

它是基於PaddingLabel(參考上面的鏈接)。

它主要運行良好,但由於某些原因,我不明白,有些情況下出現問題並且顯示被截斷。

這是一個例子:

的字符串把標籤是:「它有一個方形和藍色」

創建標籤的代碼是:

let label = LuxLabel(padding: UIEdgeInsets(top: 5, left: 10, bottom: 5, right: 10)) 
label.numberOfLines = 0 

,這是結果:

enter image description here

如果我此行添加到以上兩個:

label.lineBreakMode = .byWordWrapping

結果是:

enter image description here

我還設置了一些限制。所有這些工作都有95%的時間。任何人都可以看到有什麼問題?

+0

你有沒有設置'numberOfLines = 0'和'lineBreakMode = .byWordWrapping '? – Priya

+0

我已經設置numberOfLines = 0,但不lineBreakMode = .byWordWrapping。 我實際上有多個案例,多條線完美的工作。 它並沒有解決問題,如果我設置lineBreakMode = .byWordWrapping,我編輯我的帖子添加細節,請看看。 – Michel

+0

您是否爲標籤設置了靜態高度約束? – Priya

沙发
0
1

嘗試調用invalidateIntrinsicContentSize:

var padding: UIEdgeInsets = UIEdgeInsets.zero { 
    didSet { 
     self.invalidateIntrinsicContentSize() 
    } 
} 

編輯:

我嘗試了多種不同的選擇。如果更新frame sizelayoutSubviews使絕招intrinsicContentSize,但我不知道是否有更好的方式來做到這一點:

override func layoutSubviews() { 
    super.layoutSubviews() 
    self.frame.size = self.intrinsicContentSize 
} 
+0

我試過了,按照你的建議,用「var padding」代替「let padding」,但不幸的是它沒有任何區別。 – Michel

+0

@Michel明天我會試着重現它,如果我找到一些我會讓你知道的。 –

+0

我在GitHub(https://github.com/zaxonus/TextPad)上發佈了一個項目來展示這個問題。 – Michel

0
votes
answers
7 views
+10

Swift-如何編寫一個變量或一個在括號內變化的值

-3

(用swift語言)例如「A + D」我希望字符串A始終保持不變,但D的值根據我們說的而改變馬力,所以當Hp爲fd的字符串將是 「A + FD」 和等Swift-如何編寫一個變量或一個在括號內變化的值

我的意思是像( 「A +%的」 %HP)爲在python的字符串。如這裏:What does %s mean in Python?

+0

就我所知,沒有什麼內建的東西,每次D改變時都必須觸發「A + D」更新。 – luk2302

+0

@ luk2302我的意思是像python中括號之間的%s – Mohan

+1

請不要在您的問題中添加不相關的標籤,特別是在通過編輯刪除它們後不要再添加它們。你的問題是明確有關雨燕的語言特性,所以它沒有任何關係和Xcode,iOS或iPhone。標籤不應該被用來列出您使用的所有技術,他們應該被用來標記特定的技術語言的關注。 –

沙发
0
0

如果你在談論%s,那麼它是一個c樣式的格式化鍵,它在參數列表中等待字符串變量或值。在斯威夫特,您撰寫使用"(variable)"語法,這就是所謂路線插值字符串,如文檔中解釋說:

字符串插值

字符串插值來構建從一個新的字符串值的方式通過包括字符串文字內 他們的價值觀 混合常量,變量,文本和表情。您可以在單和多行字符串文本字符串插值 。您 插入字符串文字中的每一項被包裹在一對括號, 由反斜槓()前綴:

來源:official documentation

實施例:

var myVar = "World" 
var string = "Hello (myVar)" 

對於非字符串:

let multiplier = 3 
let message = "(multiplier) times 2.5 is (Double(multiplier) * 2.5)" 
// Output: message is "3 times 2.5 is 7.5" 
+0

我的意思是這樣的https://stackoverflow.com/questions/997797/what-does-s-mean-in-python – Mohan

+0

對不起,因爲我的英語的限制 – Mohan

+1

如果你在談論'%s',那麼它很簡單c樣式的格式化鍵,它在參數列表中等待字符串變量或值。在Swift中,你使用'「(variable)」'語法來編寫字符串。 – Hexfire

0
votes
answers
7 views
+10

Swift循環通過數組之間暫停

0

我試圖有一個函數,將循環通過一個數組的Ints,併爲每個項目,根據它的值,彈出一個特定的消息一秒鐘或所以,然後讓消息消失,然後移動到數組中的下一個項目。我能夠弄清楚如何使用DISPATCH爲消息消失創建一個「延遲」 - 但我仍然終止於所有消息立即彈出。Swift循環通過數組之間暫停

另外,我創建了一個名爲「offAll()」的函數,用於關閉所有消息,我試圖在for循環結束時使用DISPATCH調用 - 但正如我所說的,它仍然顯示所有消息一次。 (我也嘗試將DISPATCH語句分別放入每個case語句中,但這似乎也沒有幫助。)

僅供參考,我在XCode中使用Swift 4。謝謝!!

func popUp(){ 
    for item in order{ 
     if item == 0 { 
      firstLabel.text = "ME!" 
     } else if item == 1 { 
      secondLabel.text = "ME!" 
     } else if item == 2 { 
      thirdLabel.text = "ME!" 
     } else { 
      fourthLabel.text = "ME!" 
     } 
     DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { 
      self.offAll() 
     } 

    } 
+1

在函數的開始處放置一個斷點並逐步完成,直到結束。它應該希望能夠讓你清楚爲什麼它們都出現在一次。 –

+1

另一個有用的想法。如果你有4個彈出窗口說「我!」,你可能應該讓標籤文字在這四個中的每一箇中說出不同的東西 - 這有助於排除其他問題。 – dfd

沙发
0
2

消息顯示在一起,因爲for循環不是異步的,並且您沒有暫停它。解決方案可能是使用定時器延遲每條消息。 您可以在任何想要開始顯示消息的位置調用此計時器。 我假設訂單是一個數組。

var item = 0 
    let popUpTimer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true, block: { timer in 
     //removes all popups 
     self.offAll() 
     if item == 0 { 
      firstLabel.text = "ME!" 
     } else if item == 1 { 
      secondLabel.text = "ME!" 
     } else if item == 2 { 
      thirdLabel.text = "ME!" 
     } else { 
      fourthLabel.text = "ME!" 
     } 
     item = item + 1 
     if item >= order.count { //not order.count - 1 so the last popup can be removed 
      //stops the timer when all popups are shown 
      timer.invalidate() 
     } 
    }) 

這將顯示每秒彈出並刪除前一個顯示下一個之前。

+0

非常感謝!這非常有幫助! –

0
votes
answers
7 views
+10

快速計算y方向上的新點x距離

3

我正在做一些sprite工具包中的代碼,並且想要根據開始位置計算一個精靈的位置並在給定方向和距離上移動它。例如,假設我使用的度數是0,意思是直線上升,我想將精靈從當前位置向45度(向上和向右)方向移動10個點。快速計算y方向上的新點x距離

三角函數不是我的力量,我一直在努力弄清楚如何應用它。沿45度方向移動看起來相當簡單,但我不確定如何計算方向,如110(向右和向右)或225(向左和向下)。

我第一次嘗試是這樣的:

public func offset(byDistance distance:CGFloat, inDirection degrees:CGFloat) { 
    let vertical = sin(degrees) * distance 
    let horizontal = sqrt(pow(distance, 2.0) + pow(vertical, 2.0)) 
    self.position = self.position.applying(CGAffineTransform(translationX:horizontal, y:vertical)) 
} 

但我不認爲這是工作的結果是這樣的:

Direction 45, distance 88.26 -> New location {75.10, 115.88} 
Direction 135, distance 88.26 -> New location {7.79, 88.60} 
Direction 225, distance 88.26 -> New location {-82.09, 120.53} 
Direction 315, distance 88.26 -> New location {65.76, 110.06} 

任何人都可以給我一些線索,在那裏我出錯了?

沙发
0
3

這裏有幾個線索:

  1. sin()採用弧度不度,所以你需要轉換。
  2. 0是正確的,不起來,所以你需要調整。
  3. 水平使用cos()

這是更接近你需要的東西:

public func offset(byDistance distance:CGFloat, inDirection degrees:CGFloat) { 
    let radians = (degrees - 90) * .pi/180 
    let vertical = sin(radians) * distance 
    let horizontal = cos(radians) * distance 
    self.position = self.position.applying(CGAffineTransform(translationX:horizontal, y:vertical)) 
} 
+0

謝謝你的工作完美。 Trig始終是我在學校掙扎的事情,因爲我總是試圖瞭解它是如何工作的。我已經編寫了30多年了,它仍然迫使我嘗試去理解它。我仍然在數學閱讀互聯網網站,所以我會繼續堵塞:-) – drekka

+0

我認爲我錯過的一件大事是功能以弧度工作。我看過的所有數學網站都以度爲單位。我還注意到,如果我使用OS X計算器,默認情況下會使用度數,如果在OS X的Spotlite搜索中輸入'sin(45)'或類似的值,則使用弧度。 – drekka

+0

iOS和Mac OS觸發功能始終使用弧度。大多數描述trig函數的網站都使用度數,因爲它們更直觀。如果你明白一個圓的周長是2Π•半徑,並且你假設半徑是1單位,你可以想象一個螞蟻沿着圓的外側行走。如果它行走Π/ 2個單位,它將沿着該圓周的四分之一行進。一旦它走Π單位,它將在圓周的一半。當它走過2個單位時,它將完成一整圈。這就是弧度的工作原理。 –

板凳
0
1

有2個(實際上是3,但讓我們忽略了第3)像正弦和餘弦三角函數獨立的符號:角度和弧度。兩者都描述角度。度數範圍從0到360,弧度範圍從0到

它們之間的轉換很簡單:

degrees = 180 * radians/π 
radians = degrees/180 * π 

的iOS和Mac OS使用弧度爲他們的三角函數。

您可以使用度數繼續跟蹤角度,然後在將值輸入到trig函數或轉換爲使用弧度之前轉換爲弧度。

如果您瞭解圓的圓周爲2π • radius,並且您假設半徑爲1個單位,則可以通過考慮螞蟻沿着圓的外側行走來了解弧度。沿圓周(外側)的總路徑距離爲單位。如果螞蟻步行π/2單位,它將行進四分之一週圍的方式。一旦它行走了π單位,它將在圓周的一半。當它走過個單位時,它將完成一個完整的循環。這就是弧度的工作原理。

+0

男人,SO字體中的pi符號很醜!小寫的pi看起來像2 Ts,而大寫的PI看起來像是一個顛倒的U.兩者都很難辨認。代碼字體中的小寫字母pi是唯一看起來不錯的字體。 –