UIScrollView with scaled UIImageView using autolayout

后端 未结 3 2366
广开言路
广开言路 2021-02-20 04:51

\"UIScrollView

Consider a UIScrollView with a single subview. The subview is an

相关标签:
3条回答
  • 2021-02-20 05:23

    In my case it was a full width UIImageView the had a defined height constraint that causing the problem.

    I set another constraint on the UIImageView for the width that matched the width of the UIScrollView as it is in interface builder then added an outlet to the UIViewController:

    @property (weak, nonatomic) IBOutlet NSLayoutConstraint *imageViewWidthConstraint;
    

    then on viewDidLayoutSubviews I updated the constraint:

    - (void) viewDidLayoutSubviews {
        [super viewDidLayoutSubviews];
    
        self.imageViewWidthConstraint.constant = CGRectGetWidth(self.scrollView.frame);
    }
    

    This seemed to do the trick.

    0 讨论(0)
  • 2021-02-20 05:28

    translatesAutoresizingMaskIntoConstraints is only required when you instantiate the view in the code. If you instantiate it in the IB it's disabled by default

    In my opinion the UIImageView should fill the ScrollView. Later I'd try setting the zoom of the scrollview to the value that suits you well so the image can only be panned in one direction

    0 讨论(0)
  • 2021-02-20 05:30

    Under the autolayout regime, ideally the UIScrollView contentSize is solely determined by the constraints and not set explicitly in code.

    So in your case:

    • Create constraints to pin the subview to the UIScrollView. The constraints have to ensure the margin between the subview and the scroll view are 0. I see that you have already tried this.

    • Create a height and a width constraint for your subview. Otherwise, the intrinsic size of the UIImageView determines its height and width. At design time, this size is only a placeholder to keep Interface Builder happy. At run time, it will be set to the actual image size, but this is not what you want.

    • During viewDidLayoutSubviews, update the constraints to be actual content size. You can either do this directly by changing the constant property of the height and width constraint, or calling setNeedsUpdateConstraints and overriding updateConstraints to do the same.

    This ensures that the system can derive contentSize solely from constraints.

    I've done the above and it works reliably on iOS 6 and 7 with a UIScrollView and a custom subview, so it should work for UIImageView too. In particular if you don't pin the subview to the scroll view, zooming will be jittery in iOS 6.

    You may also try creating height and width constraints that directly reference a multiple of the height and width of the scroll view, but I haven't tried this other approach.

    0 讨论(0)
提交回复
热议问题