2016-06-28 4 views
0

저는 UITableView가 있고 각 사용자 정의 셀 (UIImageView 사용)마다 다른 크기의 다른 이미지를 표시해야합니다. 제대로 표시하려면 각 이미지의 종횡비를 계산하고 UIImageView의 프레임을 조정해야합니다. 그러나 문제가 있습니다. 앱을 실행하면 모든 셀에 대해 잘못된 종횡비가 표시됩니다. 그런 다음 나는 테이블의 맨 아래로 슬라이딩하기 시작하고 다시 몇 번 위로 가기 시작합니다. 그리고 때마다 나는 올바른 종횡비를 보았고, 어떤 세포에서는 다른 것이고, 다른 세포에서는 잘못되었다. 시스템이 프로토 타입 셀을 재사용하고 있기 때문입니까?UITableViewCell, 이미지 및 종횡비

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCellWithIdentifier("EntryCell", forIndexPath: indexPath) as? PodCell 

    let podcast = podList[indexPath.row] 
    let title = podcast.title 
    //  cell.titleLa?.text = title 
    cell?.titleLabel.lineBreakMode = .ByWordWrapping 
    cell?.titleLabel.numberOfLines = 0 
    cell?.titleLabel.text = title 
    var image = UIImage() 
    if (imageCache[podcast.imageURL!] != nil) { 
     image = imageCache[podcast.imageURL!]! 
     cell?.imgView.image = image 
    }else{ 
     let imgURL = NSURL(string: podcast.imageURL!) 
     let request = NSURLRequest(URL: imgURL!) 

     let config = NSURLSessionConfiguration.defaultSessionConfiguration() 
     let session = NSURLSession(configuration: config) 
     let task = session.dataTaskWithRequest(request) { (data: NSData?, response: NSURLResponse?, error:NSError?) in 
      if error == nil { 
       if data != nil { 
        image = UIImage(data: data!)! 
       } 

       dispatch_async(dispatch_get_main_queue(), { 
        self.imageCache[podcast.imageURL!] = image 
        cell?.imgView.image = image 
       }) 

      }else { 
       print(error) 
      } 
     } 

     task.resume() 
    } 
    let aspectRatio = image.size.width/image.size.height 

    cell?.imgView.frame = CGRectMake((cell?.imgView.frame.origin.x)!, (cell?.imgView.frame.origin.y)!, (cell?.imgView.frame.width)!, (cell?.imgView.frame.width)!/aspectRatio) 

    return cell! 
} 

답변

0

당신은 새로운 폭을위한 기초로 이미지 뷰의 프레임의 폭을 사용할 수 없습니다 : 여기

tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath)의 코드입니다. 당신은 상수 값, 아마도 높이를 사용해야합니다.

+0

상수 값은 너비입니다. 셀 너비가 너비와 같아야합니다. – ttrs

0

넵 셀이 재사용됩니다.이 메서드에서 전체 코드를 게시하는 것이 좋을 것입니다. 셀을 만드는 곳의 일부분입니다.

여기에서 수집 한 것부터 캐시에서 이미지를로드하려고합니다. 그렇지 않으면 인터넷에서로드합니다. 이 솔루션의 문제점은 이미지가 없으면 일부 스텁 이미지에 스텁의 종횡비를 제공한다는 것입니다. 실제 이미지로드가 완료되면 크기 조정없이 UIImageView 내부에 배치됩니다.

두 가지 방법이 있습니다. 하나는 일정한 이미지 크기를 갖는 것입니다. 다른 하나는 새로운 이미지로드가 완료되면 셀을 다시로드하는 것입니다.

+0

답장을 보내 주셔서 감사합니다. 그러나 한 가지만 얻지는 못합니다. 모든 이미지가로드되고 셀에 표시 될 때 테이블을 위아래로 슬라이드하기 시작합니다. 위로 슬라이드하면 세 번째 셀에서 잘못된 종횡비가 표시되지만 아래로 슬라이드하면 동일한 세 번째 셀에서 올바른 종횡비의 이미지가 표시됩니다. 그래서이 경우 스텁 (stub) 때문이 아닙니다. – ttrs

+0

전체 방법 게시 – ttrs