2016-08-01 6 views
0

Я пытаюсь создать представление «совпадения» изображения и метки «соответствие цены» в верхнем правом углу совпадающего изображения. Пока все работает отлично - я создаю изображение в представлении контейнера, я создаю UIImageView для фона моей метки цены, но когда я создаю фактическую метку и настраиваю ее, она навсегда загружается в мое приложение (то есть скажем, все загрузки - изображение соответствия, фоновое изображение метки цены, но не фактическая метка, детализирующая цену). Может ли кто-нибудь определить, где в моем коде, я ошибаюсь?UILabel занимает много времени, чтобы загрузить swift

func setupMiniContentScroll(contentScroll: UIScrollView) { 
    let scalar:Double = 6/19 
    let contentViewDimension = contentScroll.frame.width * CGFloat(scalar) 
    let contentScrollWidth = CGFloat(LocalUser.matches.count) * (contentViewDimension + CGFloat(12)) - CGFloat(12) 
    contentScroll.backgroundColor = UIColorFromHex(0x34495e) 

    for index in 0..<LocalUser.matches.count { 
     let match = LocalUser.matches[index] 
     MatchesManager.globalManager.retrieveMatchThumbnail(match) { img, error in 

      if let img = img { 

       //create the mini matches views 
       let xOrigin = index == 0 ? 12 : CGFloat(index) * contentViewDimension + (CGFloat(12) * CGFloat(index) + CGFloat(12)) 
       let contentFrame = CGRectMake(xOrigin, 10, contentViewDimension, contentViewDimension) 
       let contentView = self.makeMiniContentView(contentFrame, image: img, matchedPrice: match.matchedPrice) 
       contentView.match = match 

       let tap = UITapGestureRecognizer(target: self, action: #selector(BrowseViewController.toggleItemInfo(_:))) 
       contentView.addGestureRecognizer(tap) 

       //update the contentScrollView 
       dispatch_async(dispatch_get_main_queue()) { 
        contentScroll.addSubview(contentView) 
        contentScroll.contentSize = CGSizeMake(contentScrollWidth + CGFloat(16), contentScroll.frame.height) 
       } 
      } 

     } 
    } 
} 


//functions to create labels and imgViews for MiniMyMatches 

func makeMiniContentView(frame: CGRect, image: UIImage, matchedPrice: Int) -> ItemContainer { 

    let containerView = ItemContainer(frame: frame) 

    //create the item image 
    let imgView = UIImageView(frame: CGRect(x: 0, y: 0, width: containerView.frame.width, height: containerView.frame.height)) 
    imgView.image = image 
    imgView.layer.cornerRadius = 5 
    imgView.layer.masksToBounds = true 
    imgView.userInteractionEnabled = true 

    //create the price label 
    dispatch_async(dispatch_get_main_queue()) { 
     let priceLabel = self.makeMiniPriceLabel(containerView, matchedPrice: matchedPrice) 
     containerView.addSubview(imgView) 
     containerView.addSubview(priceLabel) 
    } 
    return containerView 
} 

func makeMiniPriceLabel(containerView: ItemContainer, matchedPrice: Int) -> UIView { 
    //price label var 

    let priceLabelFrame = CGRectMake(containerView.frame.size.width - 35, -7, containerView.frame.size.width * 0.50, containerView.frame.size.height * 0.35) 

    //create the price container 
    let priceContainer = UIImageView(frame: priceLabelFrame) 
    priceContainer.image = UIImage(named: "venn.png") 

    //create the price label 
    let priceLabel = UILabel(frame: CGRect(x: 3, y:0, width: priceContainer.frame.width, height: priceContainer.frame.height)) 

    priceLabel.text = "$\(matchedPrice)" 
    priceLabel.numberOfLines = 1 
    priceLabel.textColor = UIColor.whiteColor() 
    priceLabel.font = priceLabel.font.fontWithSize(20) 
    priceContainer.addSubview(priceLabel) 
    return priceContainer 
} 

ответ

1

Я думаю, что закрытие для retrieveMatchThumbnail функции вызываются в фоновом потоке. У вас есть код в этом закрытии, который управляет объектами пользовательского интерфейса. Я бы переместил ВСЕ код пользовательского интерфейса в ваш вызов dispatch_async():

MatchesManager.globalManager.retrieveMatchThumbnail(match) { img, error in 

     if let img = img { 

      //create the mini matches views 
      let xOrigin = index == 0 ? 12 : CGFloat(index) * contentViewDimension + (CGFloat(12) * CGFloat(index) + CGFloat(12)) 
      let contentFrame = CGRectMake(xOrigin, 10, contentViewDimension, contentViewDimension) 

      //update the contentScrollView 
      dispatch_async(dispatch_get_main_queue()) { 
       let contentView = self.makeMiniContentView(contentFrame, image: img, matchedPrice: match.matchedPrice) 
      contentView.match = match 

       let tap = UITapGestureRecognizer(target: self, action: #selector(BrowseViewController.toggleItemInfo(_:))) 
      contentView.addGestureRecognizer(tap) 

       contentScroll.addSubview(contentView) 
       contentScroll.contentSize = CGSizeMake(contentScrollWidth + CGFloat(16), contentScroll.frame.height) 
      } 
     } 

    } 
+0

Хорошая догадка, но, к сожалению, это не сработало. –

Смежные вопросы