【问题标题】:UIImageView's properties and constraints get reset when setting imageUIImageView 的属性和约束在设置图像时被重置
【发布时间】:2018-03-28 11:00:24
【问题描述】:

我在故事板上有一个 UIImageView,它具有固定的高度和前导、顶部和尾随约束。我以编程方式修改它的 alpha 和它的顶部常量,以实现视差并随着不相关的 scrollView 向上平移而淡出。但是,每当我将此 imageView 的图像设置为新值时,其顶部约束和 alpha 都会重置为它们的情节提要值。

代码 sn-ps 如下:

@IBOutlet weak var imageView: UIImageView!
@IBOutlet weak var imageViewTop: NSLayoutConstraint!

extension ContentTableController: UIScrollViewDelegate {

    /* Creating parallax by modifying the top constant, 
    and also fading out image as scrollView scrolls up.  
    Note the imageView is NOT in the scrollView in question. */

    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        let offsetY = scrollView.contentOffset.y
        let height = featuredPoster.frame.size.height
        let percentScrolled: CGFloat = max(1 - offsetY / height, 0)
        let parallaxFraction: CGFloat = 0.3
        imageView.alpha = percentScrolled
        imageViewTop.constant = -offsetY * parallaxFraction
    }
...
}
...

// Called elsewhere
func setsImage() {
    // setting its image resets the view's alpha and the value of its top constant
    imageView.image = nil // setting to nil, but could be any value
}

【问题讨论】:

  • 您必须有其他代码在工作...我刚刚对您的代码进行了快速测试,通过点击按钮调用setsImage()imageView 保持在原处并保持其.alpha。尝试创建一个新的视图控制器,添加并设置一个滚动视图和图像视图...连接你的代码,你应该会发现这不是问题。然后,尝试找出你的完整代码正在做什么可能导致“重置”。
  • 有趣.. 不错的收获。表面上我没有在其他任何地方做任何相关的代码。更改图像的调用的来源来自 uicollectionviewdelegate。我现在想知道我是否可能不会在主队列中设置此图像,以及这是否会导致这种情况。
  • 貌似不是线程安全问题。 @DonMag,您正在使用情节提要中的任何特定设置吗?
  • 不,没什么特别的。当您的集合视图中发生调用setsImage() 的任何事情时,您是否检查过您的scrollViewDidScroll() 函数是否被.contentOffset.y0 触发?
  • 你叫它。我在 scrollViewDidScroll 上放了一个断点......我有其他使用这个委托的滚动视图。一个是自动画,由于我没有验证哪个 scrollView 正在调用该方法,因此它具有重置值的外观。 setsImage() 也与此动画相关联。操作员错误再次发生>.

标签: ios swift uiimageview uistoryboard nslayoutconstraint


【解决方案1】:

PEBCAK

如果您有调用相同委托方法的不同滚动视图,

scrollViewDidScroll(...) 应该验证哪个滚动视图进行调用。

在这种情况下,我有一个设置了委托的 UICollectionView。请注意,UICollectionViewDelegate 包含 UIScrollViewDelegate。

解决办法是

// The scrollView that you expect is calling the delegate method.
var desiredScrollView: UIScrollView! 
   func scrollViewDidScroll(_ scrollView: UIScrollView) {

        //Verify this is the correct scrollView to trigger this code
        guard scrollView == desiredScrollView else { return }

        let offsetY = scrollView.contentOffset.y
        let height = featuredPoster.frame.size.height
        let percentScrolled: CGFloat = max(1 - offsetY / height, 0)
        let parallaxFraction: CGFloat = 0.3
        imageView.alpha = percentScrolled
        imageViewTop.constant = -offsetY * parallaxFraction
    }

【讨论】:

    【解决方案2】:

    尝试降低其内容拥抱和压缩:

    someImage.setContentHuggingPriority(UILayoutPriority(rawValue: 249), for: .horizontal)
    someImage.setContentCompressionResistancePriority(UILayoutPriority(rawValue: 249), for: .horizontal)
    someImage.setContentHuggingPriority(UILayoutPriority(rawValue: 249), for: .vertical)
    someImage.setContentCompressionResistancePriority(UILayoutPriority(rawValue: 249), for: .vertical)
    

    【讨论】:

    • 在这种情况下,错误实际上是在我的代码中。不过,感谢您的反馈!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-03
    • 2011-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多