2016-08-09 4 views
4

Я строящему FlashCard, как приложение, и я использую библиотеку KolodaView: https://github.com/Yalantis/KolodaКак оживить настраиваемое представление для пользовательского представления

У меня есть это расширение, которое возвращает UIView как перед флэш:

extension StudyViewController: KolodaViewDataSource { 

func kolodaNumberOfCards(koloda:KolodaView) -> UInt { 
    return UInt(memories.count) 
} 

func koloda(koloda: KolodaView, viewForCardAtIndex index: UInt) -> UIView { 
    return UIImageView(image: memories[Int(index)].frontImage) 
} 

func koloda(koloda: KolodaView, viewForCardOverlayAtIndex index: UInt) -> OverlayView? { 

    return NSBundle.mainBundle().loadNibNamed("OverlayView",owner: self, options: nil)[0] as? OverlayView 
} 
} 

И я хочу, чтобы иметь возможность преобразования с целью представления обратно с краном:

func koloda(koloda: KolodaView, didSelectCardAtIndex index: UInt) { 

    let frontView: UIView = koloda as KolodaView 
    let backView: UIView = UIImageView(image: memories[Int(index)].backImage) 

    if showingFront == true { 
     UIView.transitionFromView(frontView, toView: backView, duration: 1, options: UIViewAnimationOptions.TransitionCrossDissolve, completion: nil) 
    } else { 
     UIView.transitionFromView(backView, toView: frontView, duration: 1, options: UIViewAnimationOptions.TransitionCrossDissolve, completion: nil) 
     showingFront = false 
    } 
} 

переход был успешным бу т после того, как она завершится, флэш превратится из KolodaView гигантских UIView

Как преобразование KolodaView в пыльниках KolodaView?

ответ

1

Я не использовал KolodaView, поэтому мои ответы более общие для проблемы.

Два подхода

а. Вариант вашего текущего подхода (Hackish way)

Поскольку библиотека не раскрывает ссылку на показанный imageView, вам сначала необходимо будет поддерживать свой внутренний набор imageView для последующего использования.

private var myImageViews: [Int: UIImageView] = [:] 
func koloda(koloda: KolodaView, viewForCardAtIndex index: UInt) -> UIView { 
    let imageView = UIImageView(image: memories[Int(index)].frontImage) 
    myImageViews[Int(index)] = imageView 
    return imageView 
} 

Анимация с использованием текущего подхода и обновление конечного состояния исходного изображения с использованием блока завершения.

UIView.transitionFromView(frontView, 
          toView: backView, 
          duration: duration, 
          options: [.TransitionCrossDissolve, .ShowHideTransitionViews], 
          completion: { [weak self] (finished: Bool) in 
     let imageView = myImageViews[Int(index)] 
     imageView.image = memories[Int(index)].frontImage 
     frontView.hidden = false 
     backView.hidden = true 
     backView.removeFromSuperview() 
}) 

b. Возвращает пользовательское представление в методе источника данных, и переключить свое внутреннее состояние в didSelectCardAtIndex

private var myCustomViews: [Int: MyCustomView] = [:] 
func koloda(koloda: KolodaView, viewForCardAtIndex index: UInt) -> UIView { 
    let customView = MyCustomView(frontImage: memories[Int(index)].frontImage, 
            backImage: memories[Int(index)].backImage) 
    myCustomViews[Int(index)] = customView 
    return customView 
} 

func koloda(koloda: KolodaView, didSelectCardAtIndex index: UInt) { 
    let customView = myCustomViews[Int(index)] 
    customView.toggleFrontBackState() 
} 

В этом случае реализация для toggleFrontBackState будет содержать код вашего первоначального внедрения (customView.showingFront, transitionFromView). Дайте мне знать, если вам нужно больше разъяснений.

EDIT

class MyCustomView: UIView { 
    private(set) lazy var frontView: UIImageView = self.makeFrontView() 
    private(set) lazy var backView: UIImageView = self.makeBackView() 
    var showingFront: Bool = false 

    init(frontImage: UIImage?, backImage: UIImage?){ 
     super.init(frame: CGRectZero) 
     frontView.image = frontImage 
     backView.image = backImage 
     backView.hidden = true 
    } 

    required init?(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 

    func toggleFrontBackState() { 
     if showingFront { 
      UIView.transitionFromView(frontView, toView: backView, duration: 1, 
             options: [.TransitionCrossDissolve, .ShowHideTransitionViews], completion: nil) 
     } else { 
      UIView.transitionFromView(backView, toView: frontView, duration: 1, 
             options: [.TransitionCrossDissolve, .ShowHideTransitionViews] , completion: nil) 
     } 
     showingFront = !showingFront 
    } 

    func makeFrontView() -> UIImageView { 
     return UIImageView() 
    } 

    func makeBackView() -> UIImageView { 
     return UIImageView() 
    } 
} 
+0

Можете ли вы расширить немного о методах б? Как вы реализуете класс MyCustomView и метод toggleFrontBackState()? –

+0

Предоставленный частичный код для его реализации –

+0

Кажется, что 'kolodaviewDatasource' принимает только одно значение' UIImageView' в качестве возвращаемого значения, когда я пытаюсь передать 2 'UIImageView', он становится пустым –

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