如何使用contentOffset将内容置于UIScrollView中

时间:2013-03-23 04:55:44

标签: ios objective-c uiscrollview

这应该是一个非常简单的问题,但我无法获得所需的结果。我已经水平滚动UIScrollView,宽度为320.其内容的宽度为5000.我试图将内容集中在:

// 'self' is the UIScrollView
CGFloat newContentOffsetX = (self.width/2) + (self.contentSize.width/2);
self.contentOffset = CGPointMake(newContentOffsetX, 0);

我不明白为什么这不是内容的中心。你能看出计算出错吗?

6 个答案:

答案 0 :(得分:57)

我想你想要:

CGFloat newContentOffsetX = (self.contentSize.width/2) - (self.bounds.size.width/2);

图:

|------------------------self.contentSize.width------------------------|
                         |-----self.width-----|
|-------- offset --------|
                                    ^ center

答案 1 :(得分:11)

使用以下代码:

CGFloat newContentOffsetX = (scrollView.contentSize.width - scrollView.frame.size.width) / 2;
scrollView.contentOffset = CGPointMake(newContentOffsetX, 0);

答案 2 :(得分:2)

Swift 4

滚动到ScrollView

的内容中心
let centerOffsetX = (scrollView.contentSize.width - scrollView.frame.size.width) / 2
let centerOffsetY = (scrollView.contentSize.height - scrollView.frame.size.height) / 2
let centerPoint = CGPoint(x: centerOffsetX, y: centerOffsetY)
scrollView.setContentOffset(centerPoint, animated: true)

答案 3 :(得分:2)

我创建了一个具有IBInspectable属性的简单UIScrollView扩展,以将内容水平和/或垂直居中。仅当scrollview内容大小小于scrollview大小时有效。

这是Swift 5.2代码:

import UIKit

@IBDesignable class CenteredScrollView: UIScrollView {
    @IBInspectable var verticallyCentered: Bool = false
    @IBInspectable var horizontallyCentered: Bool = false

    override var contentSize: CGSize {
        didSet {
            if contentSize.height <= bounds.height && verticallyCentered {
                centerVertically()
            }

            if contentSize.width <= bounds.width && horizontallyCentered {
                centerHorizontally()
            }
        }
    }

    private func centerVertically() {
        let yContentOffset = (contentSize.height / 2) - (bounds.size.height / 2)
        contentOffset = CGPoint(x: contentOffset.x, y: yContentOffset)
    }

    private func centerHorizontally() {
        let xContentOffset = (contentSize.width / 2) - (bounds.size.width / 2)
        contentOffset = CGPoint(x: xContentOffset, y: contentOffset.y)
    }
}

答案 4 :(得分:0)

不是最好的解决方案,但可能适合您

- (void)viewDidLayoutSubviews {
    [super viewDidLayoutSubviews];
    [self centerScrollViewAnimated:NO];
}

- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(CGFloat)scale {
    [self centerScrollViewAnimated:YES];
}

- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset {
    *targetContentOffset = [self suggestedCenteredContentOffset];
}

- (CGPoint)suggestedCenteredContentOffset {
    CGSize imageSize = self.pickedImage.size;
    CGSize containerSize = self.zoomingScrollView.bounds.size;
    CGPoint result = self.zoomingScrollView.contentOffset;

    if ( self.zoomingScrollView.zoomScale * imageSize.width < containerSize.width )
        result.x = MIN((self.zoomingScrollView.zoomScale * imageSize.width - containerSize.width)/2, 0);

    if ( self.zoomingScrollView.zoomScale * imageSize.height < containerSize.height )
        result.y = MIN((self.zoomingScrollView.zoomScale * imageSize.height - containerSize.height)/2, 0);

    return result;
}

- (void)centerScrollViewAnimated:(BOOL)animated {
    [self.zoomingScrollView setContentOffset:[self suggestedCenteredContentOffset] animated:animated];
}

答案 5 :(得分:0)

斯威夫特 5+

@IBDesignable class CenteredScrollView: UIScrollView {
    
    @IBInspectable var isVerticallyCentered: Bool = false
    @IBInspectable var isHorizontallyCentered: Bool = false

    public func center(vertically: Bool, horizontally:Bool, animated: Bool) {
        
        guard vertically || horizontally else {
            return
        }
        
        var offset = contentOffset
        if vertically && contentSize.height <= bounds.height {
            offset.y = (contentSize.height / 2) - (bounds.size.height / 2)
        }

        if horizontally && contentSize.width <= bounds.width {
            offset.x = (contentSize.width / 2) - (bounds.size.width / 2)
        }
        setContentOffset(offset, animated: animated)
        
    }
    
    override func layoutSubviews() {
        super.layoutSubviews()
        center(vertically: isVerticallyCentered, horizontally: isHorizontallyCentered, animated: false)
    }
    
}